Struts2_动态方法调用

via: http://blog.csdn.net/longwentao/article/details/6940289

 

当我们访问一个Action时,默认是访问execute()方法,但当在一个Action中存存多个方法时,这时我们应该怎么定位到想要访问的方法呢?这时就需要用到动态方法调用DMI(Dynamic Method Invocation)。这里简单介绍两种动态调用的方法:

 

一、method属性

在struts.xml文件中,我们可以指定method属性,来定位我们要访问的方法,如下代码:

<action name="dmi-register" class="dmi.LoginRegisterAction" method="register"></action>

 

下面通过一个登录注册的demo来演示一下具体的操作过程:

一)、LoginRegisterAction 源文件部分代码如下:

private String userName;  

private String password;  

  

//默认执行登录功能  

public String execute() {  

    if ("admin".equals(userName) && "123".equals(password)) {  

        ActionContext context = ActionContext.getContext();  

        context.getSession().put("tip", "恭喜你" + userName + "你已经登成功");  

        return SUCCESS;  

    } else {  

        return ERROR;  

    }  

}  

  

public String register() {  

    ActionContext context = ActionContext.getContext();  

    context.getSession().put("tip", "恭喜你" + userName + "你已经注册成功");  

    return SUCCESS;  

 

二)、struts.xml 文件部分配置如下:

<!-- 动态方法调用 method属性-->  

<action name="dmi-login" class="dmi.LoginRegisterAction">  

    <result name="input">/dmi/login.jsp</result>  

    <result name="error">/dmi/error.jsp</result>  

    <result name="success">/dmi/welcome.jsp</result>  

</action>  

<action name="dmi-register" class="dmi.LoginRegisterAction" method="register" >  

    <result name="input">/dmi/login.jsp</result>  

    <result name="error">/dmi/error.jsp</result>  

    <result name="success">/dmi/welcome.jsp</result>  

</action> 

 

三)、loginRegister.jsp文件代码如下:

<html>  

    <head>  

        <title>struts2之动态方法调用</title>  

        <script type="text/javascript" src="../jquery-1.4.3.js"></script>  

        <script type="text/javascript">  

            $(function(){                 

                $("#register2").click(function(){  

                    var node=$("#myForm2");  

                    node.attr("action","dmi-register.action");  

                });  

            })  

        </script>  

    </head>  

    <body> 

<h4>动态方法调用之method属性</h4>  

        <form id="myForm2" action="dmi-login.action">  

            用户名:<input type="text" name="userName" />  

            密 码:<input type="password" name="password" />  

            <input type="submit" value="登录"  />  

            <input type="submit" id="register2" value="注册"  />  

        </form>  

    </body>  

</html> 

 

在一个form表单中,有登录、注册两个动作,分别对应Action中的不同方法,登录 默认对应execute()方法,注册对应register()方法,这样,通过method属性实现动态方法调用的操作就完了,但是struts.xml文件中的配置存存冗余问题,这时我们可以通过通配符来解决这个问题。

 

二、通配符

一)、为了更好的说明问题,我们在LoginRegisterAction 源文件中增加以下两个方法,方法实现功能与上面的完成一样,主要用于体现 登录 不在调用默认的 execute() 方法,而是对应于Action中的 dmiLogin() 方法,注册 对应Action中的 dmiRegister() 方法:

public String dmiRegister() {  

    ActionContext context = ActionContext.getContext();  

    context.getSession().put("tip", "恭喜你" + userName + "你已经注册成功");  

    return SUCCESS;  

}  

      

public String dmiLogin(){  

    if ("admin".equals(userName) && "123".equals(password)) {  

        ActionContext context = ActionContext.getContext();  

        context.getSession().put("tip", "恭喜你" + userName + "你已经登成功");  

        return SUCCESS;  

    } else {  

        return ERROR;  

    }  

}

 

二)、struts.xml 文件部分配置如下:

<!-- 动态方法调用 通配符-->  

<action name="*Action" class="dmi.LoginRegisterAction" method="{1}" >  

    <result name="input">/dmi/login.jsp</result>  

    <result name="error">/dmi/error.jsp</result>  

    <result name="success">/dmi/welcome.jsp</result>  

</action>

上面的<action name="*Action" >不是一个普通的Action,而是一个定义了一系列的逻辑Action,只要用户请求的URL是*Action模式的,都可能用该Action来处理;method属性值不再是Action中的哪一个方法,而是一个表达式,该表达式的值是name属性中的第一个*的值。例如用户请求的URL是:dmiLoginAction.action,则调用LoginRegisterAction中的dmiLogin方法。

三)、loginRegister.jsp文件增加如下代码:

$("#register").click(function(){  

    var node=$("#myForm");  

    node.attr("action","dmiRegisterAction.action");  

});

<h4>动态方法调用之通配符</h4>  

<form id="myForm" action="dmiLoginAction.action">  

    用户名:<input type="text" name="userName" />  

    密 码:<input type="password" name="password" />  

    <input type="submit" value="登录"  />  

    <input type="submit" id="register" value="注册"  />  

</form>

在访问时 动态方法调用 URL为: http://localhost:8080/projectname/package/actionname!methodname.do

 

注意: 要使用动态方法调用,必须社会自允许struts2允许动态方法调用,通过设置struts.enable.DynamicMethodInvocation常量来完成,该常量属性的默认值是true

你可能感兴趣的:(struts2)