默认情况下,我希望我的struts2应用程序转发到某个操作:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<package name="myApp" namespace="/myApp" extends="struts-default">
<action name="Login_*" method="{1}" class="myApp.SessionManager">
<result name="input">/myApp/Login.jsp</result>
<result type="redirectAction">Menu</result>
</action>
</package>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Login_input.action</param>
<param name="namespace">/myApp</param>
</result>
</action>
</package>
</struts>
我正在寻找调用SessionManager.input()的应用程序,而是调用SessionManager.execute()。
答案 0 :(得分:1)
您通常不需要公共 input()方法。 Action最基本和最典型的场景是:
现在,这个基本场景可以用几种方式编码,其中包括:
1)两个不同的映射,一个用于输入表单,另一个用于执行
<!-- default action class: execute does nothing, returns SUCCES -->
<action name="ActionXXXShowForm">
<result>/myApp/XXXForm.jsp</result>
</action>
<action name="ActionXXX" class="myApp.XXXAction">
<result name="input">/myApp/XXXForm.jsp</result>
<result>/myApp/XXXDone.jsp</result>
</action>
2)只需一个映射
<action name="ActionXXX" class="myApp.XXXAction">
<result name="input">/myApp/XXXForm.jsp</result>
<result>/myApp/XXXDone.jsp</result>
</action>
两者非常相似(特别是如果您正在进行程序化验证)。 在这两种情况下,我们在操作中只有一个“struts”方法(执行),这是一种很好的做法,因为我们的操作只做“做一件事”。 但在第二种情况下,我们需要处理没有数据发布的情况,并且不会针对该情况发出错误消息。
示例:案例1:
public class XXXAction extends ActionSupport {
...
public String execute() throws Exception {
if(! inputOk()) return INPUT;
// .. do your stuff
return SUCCESS;
}
private boolean inputOk() {
// ... check your inputs - sort of programatic validation
if( surname == null ) addActionError("no surname");
// .... more checks
return ! hasActionErrors());
}
}
在案例2中,您稍微修改它:
public class XXXAction extends ActionSupport {
....
public String execute() throws Exception {
if( emptyInput() ) return INPUT; // no error messages in this case
if(! inputOk()) return INPUT;
// .. do your stuff
return SUCCESS;
}
private boolean inputOk() {
// same as before
}
private boolean emptyInput() {
// detect no input was sent. do not emit errors herer
}
}
答案 1 :(得分:0)
当您从jsp调用操作时,默认方法是execute()。如果要调用其他方法,可以使用属性method =“”。
进行规范<s:url action="SessionManager" method="input"/>
属性方法在其他标签上很常见。
答案 2 :(得分:0)
如果您使用<s:a...
标记,那么除了默认的execute()方法之外,您将无法调用预期的方法。您需要使用带有id的<s:a...
标记来定义操作,而不是<s:url...
标记,并使用普通的html锚标记调用相同的内容,即。
<a href=${<<id>>}
但您可能需要在struts.xml或任何其他xml配置文件中指定方法,该文件已包含在struts.xml文件中,并带有<action... method="..."
子句中的method属性。