我们经常会看到如下图所示的登陆UI:
当用户点击登陆按钮时,则进行登陆操作;当用户点击注册按钮时,则跳转到注册页面。根据前面的学习,我们知道每个Action处理请求的默认方法是public String execute() throws Exception
方法,当请求到达服务器端以后,则由对应Action的execute
方法进行处理;但是现在有两个按钮,需要不同的处理逻辑。如果不进行特殊的处理,当请求到达服务器以后,将都由execute
方法进行处理,而execute
方法却没法区分用户点击的是“登陆”还是“注册”按钮。此时该怎么办?
对于上述情形,如果我们可以在我们的请求中带上一个标记,当用户点击登陆时,则标记为A;当用户点击注册时,则标记为B;然后在execute
方法中判断这个标记,从而实现不同的逻辑,这种思路是可行的,而我们这里重点说的是Struts2如何来搞定这种事情。在Struts2中有以下两种方法是可行的:
上述的这两种方法都可以将用户的请求发送到服务器以后,实现不同的逻辑行为。当用户点击登陆时,则调用Action的login方法;当用户点击注册时,则调用Action的regist方法。下面就对这两种方法分别进行分析与总结。
对于同一个表单,当用户通过不同的提交按钮来提交同一个表单时,系统需要使用Action的不同方法来处理用户请求,这就需要让同一个Action里包含多个控制处理逻辑。
在Struts2中可以使用动态方法调用来处理这种请求。动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以如下形式来指定表单的action属性。
action="ActionName!methodName"
其中ActionName指定提交到哪个Action,而methodName指定提交到指定方法。下面我通过一个简单的代码示例来说说如何使用动态方法调用。
先通过前台页面控制action的属性值:
<body>
<s:form action="login" namespace="/">
<s:textfield name="userName" key="user" />
<s:password name="password" key="pass" />
<s:submit key="login" value="登陆"></s:submit>
<s:submit key="regist" value="注册" onclick="registFunc()"></s:submit>
</s:form>
<script type="text/javascript">
function registFunc(){
// 获取页面第一个表单
var targetForm = document.forms[0];
// 动态修改表单的action属性
targetForm.action = "login!regist";
}
</script>
</body>
对于后台Action,则添加一个regist
方法即可,刚方法的声明和execute
方法一模一样。
public String regist() throws Exception
{
return "regist";
}
通过这种方法,我们可以在一个Action中包含多个处理逻辑,并通过为表单元素指定不同action属性来提交给Action的不同方法。在使用动态方法调用时,需要注意以下一点:
使用动态方法调用前必须设置Struts2允许动态方法调用。将
struts.enable.DynamicMethodInvocation
设置为true开启动态方法调用;否则将关闭动态方法调用(默认为关闭状态)。
在struts.xml中添加以下配置即可:
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
除了上述的动态修改表单的action属性外,Struts2还提供了另外一种方法,就是将一个Action类配置成多个逻辑Action,具体的做法是在配置<action .../>
,可以为它指定method属性,这样就可以让Action调用指定方法,而不是默认的execute方法来处理用户请求。例如:
<action name="loginAction" class="com.jellythink.practise.LoginAction" method="login">
......
</action>
其中的method
属性才是重点。通过这种方式可以将一个Action类定义成多个逻辑Action,即Action类的每个处理方法都映射成一个逻辑Action。前提是这些方法声明要满足以下两个条件:
下面还是通过一个简单的例子来说明。前台JSP页面代码如下:
<body>
<s:form action="loginAction" namespace="/">
<s:textfield name="userName" key="user" />
<s:password name="password" key="pass" />
<s:submit key="login" value="登陆" onclick="loginFunc()"></s:submit>
<s:submit key="regist" value="注册" onclick="registFunc()"></s:submit>
</s:form>
<script type="text/javascript">
function loginFunc(){
var targetForm = document.forms[0];
targetForm.action = "loginAction";
}
function registFunc(){
var targetForm = document.forms[0];
targetForm.action = "registAction";
}
</script>
</body>
最主要的struts.xml配置如下:
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<package name="lee" extends="struts-default" namespace="/">
<action name="loginAction" class="com.jellythink.practise.LoginAction" method="login">
<result name="input">/login.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/success.jsp</result>
</action>
<action name="registAction" class="com.jellythink.practise.LoginAction" method="regist">
<result name="regist">/regist.jsp</result>
</action>
</package>
</struts>
可以看到这里配置的两个Action,对应的class为同一个class,只是Action名和method不一样罢了。
基于这种方法,还有它的一种变种,就是直接将method
属性配置在<s:submit .../>
中,例如:
<body>
<s:form action="loginAction" namespace="/">
<s:textfield name="userName" key="user" />
<s:password name="password" key="pass" />
<s:submit key="login" value="登陆" method="login"></s:submit>
<s:submit key="regist" value="注册" method="regist"></s:submit>
</s:form>
</body>
struts.xml配置如下:
<package name="lee" extends="struts-default" namespace="/">
<action name="loginAction" class="com.jellythink.practise.LoginAction">
<result name="input">/login.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/success.jsp</result>
<result name="regist">/regist.jsp</result>
</action>
</package>
这种在<s:submit .../>
中指定method
属性的方式和在struts.xml中的<action .../>
指定method
属性一致的,表明将调用Action处理类中的哪个方法响应请求,具体使用哪一种情况,需要根据实际情况而定,但是需要记住,二者的method属性是一致的。
虽然这篇文章看完会觉的很简单,但是在写这些验证代码时,真是没少走弯路;有些地方自己还是理解的不够透彻,通过这篇文章,让我再次去理解了一遍。学习不易,且行且珍惜。
果冻想-一个原创技术文章分享网站。
2016年01月26日 于呼和浩特。
未经允许不得转载:果冻想 » Struts2学习之配置单个Action多控制处理逻辑