• struts2的参数的封装形式


    背景:经常要求获得视图层传过来的很多数据,一般都是一个实体类的n多属性,很多时候实体类的属性特别多,
    这时候如果还是按以前的方式在action里面一个个的定义出这些属性的私有变量,然后在提供set、get方法的话,
    这样就会使整个action太臃肿,严重妨碍了代码的可阅读性,并且也违背了代码的可复用性,
    这时我们就需要对这些请求参数进行封装,提高代码的可复用性

     页面数据和Action有两种基本对应方式:属性驱动和模型驱动

    属性驱动分两种:基本数据类型的属性对应(属性驱动)和  javaBean风格的属性对应(直接使用域对象)

    1.利用实体类封装参数(直接使用域对象)
        ①创建实体类User(包括用户名和密码属性)
        ②创建action,从表单提交的数据会根据User实体类的属性进行封装

    public class LoginAction extends ActionSupport {  
        private User user;
        
        public User getUser() {  
            returnuser;  
        }  
        publicvoid setUser(User user) {  
            this.user = user;  
        }  
    
        public String execute(){  
        if(user.getUsername().equals("admin")&&user.getPassword().equals("123456"))  
            return"success";  
            return"fail";  
        }  
    } 

    ③定义表单,注意:表单里面的控件的name属性定义有一定的要求,定义name时我们应该定义为:对象.属性的形式
        示例代码(在相应的name属性上,添加一个域对象的前缀,指明这个值到底对应打哪一个域对象里面去)

    <s:form action="LoginAction">  
        <s:actionerror/>  
        <s:textfield name="user.username"></s:textfield>  
        <s:password name="user.password"></s:password>  
        <s:submit value="提交" ></s:submit>  
    </s:form>

    2.模型驱动封装请求参数

       模型驱动是指使用JavaBean来封装来回请求的参数.这种方式的好处就是减少了action的压力。

    既用于封装来回请求的参数,也保护了控制逻辑,使它的结构清晰.这就是模型驱动的优势.模型驱动的实现主要在Action上

    ①.首先建立一个实体。

    ②、建立action类,继承自ActionSupport,实现ModelDriven接口,这个接口定义一个getModel()方法,

    用于返回定义的Model,然后调用set方法,进行赋值

    publicclass LoginAction3 extends ActionSupport implements ModelDriven<User> {  
     private User user=new User();//这里记住要实例化  
     private LoginService loginService=new LoginServiceImpl();//这里是调用登录的业务处理逻辑  
     
     Override  
     public User getModel() {    
     return user;  
    ·}  
     public String execute()  
    {  
    System.out.println(user.getUsername());  
    System.out.println(user.getPassword());  
      
     if(loginService.isLogin(user.getUsername(),user.getPassword()))  
    {  
     return SUCCESS;  
    }  
     return INPUT;  
    }  

    ModelDrivenAction类的执行流程是:首先调用getModel()方法得到User对象,接着根据
    JavaBean的原则将客户端传过来的属性,一个一个的set到User对象的属性中,将属性全部set完之后,

    再执行execute()方法。对于模型驱动页面name属性不需要前缀

    3.属性驱动接收参数(属性驱动)

    页面控件的name属性和Action的属性或者与属性对应的getter/setter相对应

    ①jsp页面:

    <form action="sys/login.action" method="post">
     <input type="text" name="username">
     <input type="submit" value="submit">
    </form>

    ②Action:直接通过get、set方法获取。

    public class sysAction extends ActionSupport{
     private String username;
     
     public String login() throws Exception {
      System.out.println(username);
      return SUCCESS;
     }
     
     public String getUsername() {
      return username;
     }
     public void setUsername(String username) {
      this.username= username;
     }
    }

     总结:

    ①属性驱动(基本数据类型的属性对应):

    优点:简单,页面那么和属性直接对应

    缺点:导致Action类看上去比较零乱,功能单一

    ②属性驱动(直接使用域对象)

    优点:把模型数据从Action中分离出来

    缺点:页面必须添加前缀

    ③模型驱动

    优点:把模型数据从Action中分离出来

    缺点:Action实现特殊接口

    最后三种方式可以混合使用!!!

  • 相关阅读:
    字典--------输出有序的格式
    输出数据和数据下标的两种方法
    删除操作
    搭建RabbitMQ环境(windows)
    SpringBoot 2.x 集成 Redis
    Redis 安装
    Spring Boot 数据库操作
    默认日志Logback配置
    通过poi下载图片到word
    Spring IoC 与 AOP
  • 原文地址:https://www.cnblogs.com/qingcong/p/5842515.html
Copyright © 2020-2023  润新知