题
在默认我希望我的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.输入(),但是它呼吁SessionManager.执行().
解决方案
你不想要一般公众 输入() 法。最基本和典型的方案中的行动是:
- 该行动旨在"做什么"(一件事),这一行动需要的某些用户输入。
- 该行动并不是在方法 执行()
- 如果行动没有成功,什么东西,它returs 成功.这将触发一结果的内容丰富JSP页。
- 如果行动没有得到输入的用户(因为没有任何,或者是因为它是不足或错误)返回 输入.这将触发一个"输入形式"JSP使得用户可以填补数据以及(重新)尝试的动作。
现在,这一基本方案可以编码的方式中的几种,其中包括:
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>
两者都非常相似(特别是如果您正在做的方案的验证)。在这两种情况下,我们只有一个"支柱"方法的行动(执行),这是良好的做法,因为我们的行动只是"一件事"。但是,在第二种情况下,我们需要处理的情况下在其中没有数据是职位,而不要发出一个错误信息,对这种情况。
例如:在例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
}
}
其他提示
当调用从JSP的动作,默认方法是执行()。如果要调用另一个方法,可以通过属性方法符合规范=“”。
<s:url action="SessionManager" method="input"/>
属性的方法是在其他标签常见。
如果您使用的是<s:a...
标签,那么你将不能够调用预期的方法除了默认execute()方法。相反<s:a...
标签,你需要使用<s:url...
标签与ID定义操作和调用相同的正常使用HTML锚标记,即,
<a href=${<<id>>}
但可能需要在struts.xml中或任何其它的XML配置文件,它已包含在与<action... method="..."
子句中的方法的属性的struts.xml文件中指定方法。
不隶属于 StackOverflow