struts2动态方法调用

来源:互联网 发布:网络机柜全套 编辑:程序博客网 时间:2024/04/27 23:39

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

一、method属性

二、通配符

 

一、method属性

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

[html] view plain copy
print?
  1. <action name=“dmi-register” class=“dmi.LoginRegisterAction” method=“register”></action>  
<action name="dmi-register" class="dmi.LoginRegisterAction" method="register"></action>

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

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

[java] view plain copy
print?
  1. private String userName;  
  2. private String password;  
  3.   
  4. //默认执行登录功能  
  5. public String execute() {  
  6.     if (“admin”.equals(userName) && “123”.equals(password)) {  
  7.         ActionContext context = ActionContext.getContext();  
  8.         context.getSession().put(”tip”“恭喜你” + userName + “你已经登成功”);  
  9.         return SUCCESS;  
  10.     } else {  
  11.         return ERROR;  
  12.     }  
  13. }  
  14.   
  15. public String register() {  
  16.     ActionContext context = ActionContext.getContext();  
  17.     context.getSession().put(”tip”“恭喜你” + userName + “你已经注册成功”);  
  18.     return SUCCESS;  
  19. }  
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 文件部分配置如下:

[html] view plain copy
print?
  1. <!– 动态方法调用 method属性–>  
  2. <action name=“dmi-login” class=“dmi.LoginRegisterAction”>  
  3.     <result name=“input”>/dmi/login.jsp</result>  
  4.     <result name=“error”>/dmi/error.jsp</result>  
  5.     <result name=“success”>/dmi/welcome.jsp</result>  
  6. </action>  
  7. <action name=“dmi-register” class=“dmi.LoginRegisterAction” method=“register” >  
  8.     <result name=“input”>/dmi/login.jsp</result>  
  9.     <result name=“error”>/dmi/error.jsp</result>  
  10.     <result name=“success”>/dmi/welcome.jsp</result>  
  11. </action>  
<!-- 动态方法调用 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>

以上struts.xml文件配置中,dmi-login默认对应Action中的execute()方法,dmi-register由于加了method=”register”属性,则对应Action中的register()方法。

 

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

[java] view plain copy
print?
  1. <html>  
  2.     <head>  
  3.         <title>struts2之动态方法调用</title>  
  4.         <script type=”text/javascript” src=“../jquery-1.4.3.js”></script>  
  5.         <script type=”text/javascript”>  
  6.             (function(){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="string">"#register2"</span><span>).click(function(){&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;node=$(”#myForm2”);  
  7.                     node.attr(”action”,“dmi-register.action”);  
  8.                 });  
  9.             })  
  10.         </script>  
  11.     </head>  
  12.     <body>  
<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>
[html] view plain copy
print?
  1.         <h4>动态方法调用之method属性</h4>  
  2.         <form id=“myForm2” action=“dmi-login.action”>  
  3.             用户名:<input type=“text” name=“userName” />  
  4.             密 码:<input type=“password” name=“password” />  
  5.             <input type=“submit” value=“登录”  />  
  6.             <input type=“submit” id=“register2” value=“注册”  />  
  7.         </form>  
  8.     </body>  
  9. </html>  
<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() 方法:

[java] view plain copy
print?
  1. public String dmiRegister() {  
  2.     ActionContext context = ActionContext.getContext();  
  3.     context.getSession().put(”tip”“恭喜你” + userName + “你已经注册成功”);  
  4.     return SUCCESS;  
  5. }  
  6.       
  7. public String dmiLogin(){  
  8.     if (“admin”.equals(userName) && “123”.equals(password)) {  
  9.         ActionContext context = ActionContext.getContext();  
  10.         context.getSession().put(”tip”“恭喜你” + userName + “你已经登成功”);  
  11.         return SUCCESS;  
  12.     } else {  
  13.         return ERROR;  
  14.     }  
  15. }  
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 文件部分配置如下:

[html] view plain copy
print?
  1. <!– 动态方法调用 通配符–>  
  2. <action name=“*Action” class=“dmi.LoginRegisterAction” method=“{1}” >  
  3.     <result name=“input”>/dmi/login.jsp</result>  
  4.     <result name=“error”>/dmi/error.jsp</result>  
  5.     <result name=“success”>/dmi/welcome.jsp</result>  
  6. </action>   
 <!-- 动态方法调用 通配符--><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文件增加如下代码:

[html] view plain copy
print?
  1. ("#register").click(function(){&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<span class="attribute">node</span><span>=$("#myForm");&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;node.attr("action","dmiRegisterAction.action");&nbsp;&nbsp;</span></li><li class=""><span>});&nbsp;&nbsp;</span></li></ol></div><pre class="html" name="code" style="display: none;">(“#register”).click(function(){var node=$(“#myForm”);node.attr(“action”,”dmiRegisterAction.action”);});

     

    [html] view plain copy
    print?
    1. <h4>动态方法调用之通配符</h4>  
    2. <form id=“myForm” action=“dmiLoginAction.action”>  
    3.     用户名:<input type=“text” name=“userName” />  
    4.     密 码:<input type=“password” name=“password” />  
    5.     <input type=“submit” value=“登录”  />  
    6.     <input type=“submit” id=“register” value=“注册”  />  
    7. </form>  
    <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>

     

     到此,struts2的动态方法调用就介绍完了,希望对Java爱好者有所帮助,如果有写得不好或有错误之处,还请帮忙指正,谢谢

     

     

     

     

     

0 0