玩技术,Geeker
一个原创技术文章分享网站

Struts2学习之配置单个Action多控制处理逻辑

这该怎么办?

我们经常会看到如下图所示的登陆UI:

邮箱登陆

当用户点击登陆按钮时,则进行登陆操作;当用户点击注册按钮时,则跳转到注册页面。根据前面的学习,我们知道每个Action处理请求的默认方法是public String execute() throws Exception方法,当请求到达服务器端以后,则由对应Action的execute方法进行处理;但是现在有两个按钮,需要不同的处理逻辑。如果不进行特殊的处理,当请求到达服务器以后,将都由execute方法进行处理,而execute方法却没法区分用户点击的是“登陆”还是“注册”按钮。此时该怎么办?

Struts2的处理方法

对于上述情形,如果我们可以在我们的请求中带上一个标记,当用户点击登陆时,则标记为A;当用户点击注册时,则标记为B;然后在execute方法中判断这个标记,从而实现不同的逻辑,这种思路是可行的,而我们这里重点说的是Struts2如何来搞定这种事情。在Struts2中有以下两种方法是可行的:

  • 动态方法调用
  • 指定method属性

上述的这两种方法都可以将用户的请求发送到服务器以后,实现不同的逻辑行为。当用户点击登陆时,则调用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" />

指定method属性

除了上述的动态修改表单的action属性外,Struts2还提供了另外一种方法,就是将一个Action类配置成多个逻辑Action,具体的做法是在配置<action .../>,可以为它指定method属性,这样就可以让Action调用指定方法,而不是默认的execute方法来处理用户请求。例如:

<action name="loginAction" class="com.jellythink.practise.LoginAction" method="login">
    ......
</action>

其中的method属性才是重点。通过这种方式可以将一个Action类定义成多个逻辑Action,即Action类的每个处理方法都映射成一个逻辑Action。前提是这些方法声明要满足以下两个条件:

  • 方法形参列表为空
  • 方法返回值为String

下面还是通过一个简单的例子来说明。前台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多控制处理逻辑

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

在这里玩技术,享受技术带来的疯狂

捐赠名单关于果冻