8

jspにフォームがあります。[検索]ボタンと[新規追加]ボタンの2つの送信ボタンがあります。各ボタンに独自のメソッド属性を設定しました。

<s:form name="searchForm" action="employeeAction" method="post">
    <s:textfield name="id" label="Employee ID"/>
    <s:textfield name="name" label="Employee Name"/>

    <s:submit value="Search" method="doSearch"/>
    <s:submit value="Add New" method="doAddNew"/>
</s:form>

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.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">

        <default-action-ref name="index" />

        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>

    </package>

    <package name="example" namespace="/example" extends="default">

        <action name="employeeAction" class="example.EmployeeAction">
           <result name="search">/example/search.jsp</result>
           <result name="add">/example/add.jsp</result>
        </action>

    </package>
</struts>

EmployeeActionクラス内

public class EmployeeAction extends ActionSupport {

    private static final Logger logger = Logger.getLogger(EmployeeAction.class);

    @Override
    public String execute() throws Exception {    
        logger.info("Calling execute!");    
        return SUCCESS;
    }

    public String doSearch() throws Exception {    
        logger.info("Calling doSearch!");    
        return "search";
    }

    public String doAddNew() throws Exception {    
        logger.info("Calling doAddNew!");    
        return "add";
    }
}

問題は、[検索]または[新規追加]ボタンをクリックしたときに、メソッドdoSearch()またはdoAddNew()が呼び出されず、代わりにメソッドexecute()が呼び出されたことです。上記の私のコードの何が問題になっていますか?

ストラットv2.3を使用しています。

4

1 に答える 1

8

セットする

<constant name="struts.enable.DynamicMethodInvocation" value="false" />

<constant name="struts.enable.DynamicMethodInvocation" value="true" />

別の方法は、同じアクションに対して複数のマッピングを定義することです。

JSPの場合:

<s:submit value="Search"  action="employeeSearchAction" />
<s:submit value="Add New" action="employeeAddNewAction"/>

Struts.xmlで

<action name="employeeSearchAction" class="example.EmployeeAction" method="doSearch">
       <result>/example/search.jsp</result>
</action>
<action name="employeeAddNewAction" class="example.EmployeeAction" method="doAddNew">
       <result>/example/add.jsp</result>
</action>

3番目の方法は、ワイルドカードマッピングを使用することです。

PS:2番目のアクションを選択する場合は、ベストプラクティスとして、実行する必要のある論理アクションごとに1つのアクションを使用することをお勧めします...

「search」と「addNew」の両方のアクションによって共通データがロード/管理されている場合は、employeeSearchActionとemployeeAddNewActionの両方によって拡張されたemployeeBaseActionを定義できます。


編集

今は2014年であり、DMIの使用は(今日ではこれまで以上に)全会一致で推奨されていませんが、まったく役に立たないため、ソリューションn.2を使用することを強くお勧めします。

于 2012-11-11T23:00:02.503 に答える