为什么方法前缀在 Struts 2.3.32 中不起作用

Why method prefix not working in Struts 2.3.32

我使用 Struts 2.3.32,这是代码。

methodPrefix.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <s:form action="methodPrefix" theme="simple">
        name: <br/>
        <s:textfield name="name"/>
        <br><br>
        <s:submit value="Create Person"/>
        <s:submit name="method:cancel" value="Cancel"/>
    </s:form>
</body>
</html>

MethodPrefixAction.java

   public class MethodPrefixAction 
    {
        private String name;
        private String message;
        
        public String execute() throws Exception
        {
            message = name + " create";
            return "success";
        }
        public String cancel() throws Exception
        {
            message = "cancel";
            return "success";
        }
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getMessage() {
            return message;
        }
        public void setMessage(String message) {
            this.message = message;
        }
    }

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <constant name="struts.mapper.action.prefix.enabled" value="true" />
     
    <package name="default" extends="struts-default" namespace="">
        <action name="goMethodPrefixPage">
            <result>/chapter4/methodPrefix.jsp</result>
        </action>
        <action name="methodPrefix" class="example.chapter4.MethodPrefixAction">
            <result>/chapter4/methodPrefixResult.jsp</result>
        </action>
    </package>
</struts>

当我按下 Cancel 按钮时,它不调用 cancel() 方法,只调用 execute() 方法。

我不知道为什么 method: 前缀不起作用。

查了很多,知道Struts2.3.32默认method:前缀配置是false的,所以用了常量.....但是没有用

This tutorial explains it and this tutorial 显示如何进行验证

方法MethodPrefixAction.execute应该returnsuccesscancel字符串。

struts.xml 中,您可以根据 return 字符串将用户重定向到不同的页面:

<action name="methodPrefix" class="example.chapter4.MethodPrefixAction">
            <result name="success">/chapter4/methodPrefixResult.jsp</result>
            <result name="cancel">/chapter4/methodPrefix.jsp</result>
        </action>

这个常量

<constant name="struts.mapper.action.prefix.enabled" value="true" />

仅适用于 action: 前缀,不适用于 method: 前缀。所以你应该使用 action 属性来提交标签。

<s:submit action="cancel" value="Cancel"/>

注意: 如果您 DMI 关闭,action: 前缀仍然可用。