zoukankan      html  css  js  c++  java
  • Struts 2读书笔记使用Action的动态方法调用

          struts 2提供了包含处理多个逻辑的Action,从而允许一个Action内包含多个控制处理逻辑。例如一个页面中存在多个按钮,用户通过不同的按钮提交同一个表单时,可以使用Action的不同的方法来处理用户的请求。如下图页面

              

         页面中有两个提交按钮,但分别提交给Action的不同方法处理,“登陆”按钮使用登陆逻辑来处理请求,而“注册”按钮则使用注册逻辑来处理请求。

         此时,可以采用动态方法调用来处理 这种请求。动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以下面形式来指定表单的action属性

         action属性为actionName!methodName形式   其中ActionName指定提交给那个Action,而methodName指定提交给该Action的某个方法。 即:action = ”ActionName!methodName"

         上面的注册按钮是一个没有任何动作的按钮,但单击该按钮时会触发regist函数        

    1      <input type="submit" value="注册" onclick="regist();">           regist函数:       
    2 
    3      <script type="text/javascript">
    4         function regist(){
    5             targetForm = document.forms[0];
    6             targetForm.action = "login!regist";
    7         }
    8      </script>

         上面的regist方法改变表单的action属性,修改action的属性为“login!regist",其实质就是将该表单提交给LoginAction的regist方法处理

         Login|Action类的代码:    

     1 public class LoginAction {
     2     private String username;
     3     private String password;
     4     public String getUsername() {
     5         return username;
     6     }
     7     public void setUsername(String username) {
     8         this.username = username;
     9     }
    10     public String getPassword() {
    11         return password;
    12     }
    13     public void setPassword(String password) {
    14         this.password = password;                          
    15     }
    16     
    17     //定义处理用户请求的login方法
    18     public String execute(){
    19         ActionContext ctx = ActionContext.getContext();
    20         Integer counter = (Integer) ctx.getApplication().get("counter");
    21         if(counter==null){
    22             counter = 1;
    23         }
    24         else {
    25             counter = counter + 1;
    26         }
    27         
    28         ctx.getApplication().put("counter", counter);
    29         //通过ActionContext()设置session范围的属性
    30         ctx.getSession().put("user", getUsername());
    31         
    32         if(getUsername().equals("chentmt")&&getPassword().equals("chenssy")){
    33             //通过ActionContext()设置reque范围的属性
    34             ctx.put("tip","服务器提示:您已经成功登陆.....");
    35             return "success";
    36         }
    37         else {
    38             ctx.put("tip", "服务器提示:登陆失败");
    39             return "error";
    40         }
    41     }
    42     
    43     //Action包含的注册控制逻辑
    44     public String regist(){
    45         ActionContext.getContext().getSession().put("user",getUsername());
    46         setTip("恭喜你,"+getUsername()+",您已经注册成功了....");
    47         return "success";
    48     }
    49 
    50 }

         上面的Action代码中定义了改Action里包含的register控制逻辑,在默认情况下,用户请求不会提交该方法。当在单击“登陆”按钮时,系统将提交给LoginAction的默认方法处理。当单击“注册”按钮时,该表单的action被修改为login!regist,系统将提交改LoginAction的regist方法处理。

         通过这种方式,我们可以通过在一个Action中包含多个处理逻辑,并通过为该表单元素指定不同action属性来提交给Action的不同方法。

         对于使用动态方法调用的方法,该方法的方法声明与系统默认的execute方法的方法只有方法名不同,其他部分如形参列表,返回值类型都应该完全相同。

         在试用合格动态方法调用前必须设置Struts 2允许动态方法调用。开启系统的动态方法调用时通过设置struts.enable.DynamicMethodInvocation常量完成的。设置该常量为true,将开启动态方法调用;否则则关闭动态方法调用。
     

         读李刚《轻量级java EE企业应用实战》

    PS:如果你觉得文章对你有所帮助,别忘了推荐或者分享,因为有你的支持,才是我续写下篇的动力和源泉!
  • 相关阅读:
    codeforces 814B An express train to reveries
    codeforces 814A An abandoned sentiment from past
    codeforces 785D D. Anton and School
    codeforces 785C Anton and Fairy Tale
    codeforces 791C Bear and Different Names
    AOP详解
    Spring集成JUnit测试
    Spring整合web开发
    IOC装配Bean(注解方式)
    IOC装配Bean(XML方式)
  • 原文地址:https://www.cnblogs.com/chenssy/p/2589681.html
Copyright © 2011-2022 走看看