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:如果你觉得文章对你有所帮助,别忘了推荐或者分享,因为有你的支持,才是我续写下篇的动力和源泉!
  • 相关阅读:
    数学之美
    作为一个程序员,你知道每天自己在做什么吗
    搭建ssm框架log4j日志
    webpack实践——DLLPlugin 和 DLLReferencePlugin的使用
    一些实用的技巧
    详解Vue 开发模式下跨域问题
    vue resource 携带cookie请求 vue cookie 跨域
    解决vue中element组件样式修改无效
    ES6 Promise 异步操作
    js 字符串操作函数
  • 原文地址:https://www.cnblogs.com/chenssy/p/2589681.html
Copyright © 2011-2022 走看看