• Struts2框架封装数据(接收页面参数)


    主要解决的问题:是在action中如果获取请求参数

      Struts 2框架会将表单的参数以同名的方式设置给对应Action的属性中。该工作主要是由Parameters拦截器做的。而该拦截器中已经自动的实现了String到基本数据类型之间的转换工作。

    通过简单的登录案例驱动式来进行分析:

    需求分析

     

    1.属性驱动

    a.action中定义属性,属性名称必须与页面标签中name属性名称一致;然后,为定义的属性提供get/set方法。简单说,直接在action类中提供与请求参数匹配属性,提供get/set方法

    (1)jsp页面代码

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    
        pageEncoding="UTF-8"%>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    <html>
    
    <head>
    
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    <title>属性驱动模式接受页面参数</title>
    
    </head>
    
    <body>
    
    <form action="${pageContext.request.contextPath}/login" method="post"> 
    
    用户:<input type="text" name="username" /><br/>
    
    密码:<input type="password" name="password" /><br/>
    
    <input type="submit"  value="提交"/>
    
    </form>
    
    </body>
    
    </html>

    (2)Action类代码

    package cn.struts.demo_show;
    
    public class LoginAction {
    
     
    
    // 属性名称必须和页面参数名称一致
    
    private String username;
    
    private String password;
    
     
    
    // 为所有属性提set/get方法
    
    public String getUsername() {
    
    return username;
    
    }
    
     
    
    public void setUsername(String username) {
    
    this.username = username;
    
    }
    
     
    
    public String getPassword() {
    
    return password;
    
    }
    
     
    
    public void setPassword(String password) {
    
    this.password = password;
    
    }
    
     
    
    // 测试接受页面参数的方法
    
    public void login() {
    
    System.out.println("action执行了");
    
    System.out.println("页面输入用户名为:" + username + "页面输入密码为:" + password);
    
    }
    
    }

     (3) struts.xml配置

     

    (4)执行结果

     

    此外,属性驱动还可以,通过javabean的方式获取页面参数。

    action类中创始一个javaBean,对其提供get/set ; action类中定义javabean对象的属性,同时创建该对象的set/get方法;在请求时页面上要进行修改,例如 user.username  user.password ,要使用ognl表达式

    (1)封装模型对象:将页面参数封装到一个模型对象中。

     

    (2)Action中定义模型对象的属性,并提供get/set方法。

     

    以上两种方式的优缺点:

    第一种比较简单,在实际操作我们需要将action的属性在赋值给模型(javaBean) 去操作
    第二种:不需要在直接将值给javaBean过程,因为直接将数据封装到了javaBean 中。它要求在页面上必须使用ognl表达式,就存在页面不通用问题。

    2.模型驱动(推荐)

    实现步骤:

    1.创建页面参数的javabean实体对象

    2.Action类要实现一个指定接口ModelDriven<T>

    3.实例化模型对象(就是要new出来javaBean)

    4.重写getModel方法(接口中的方法)将实例化的模型对象返回。

    对于模型驱动它与属性驱动对比,在实际开发中使用比较多,模型驱动缺点,它只能对一个模型对象数据进行封装。

    案列演示:

    (1)前段页面使用之前的演示页面

    (2)页面参数的封装

    package cn.struts.demo_show;
    public class User {   private String username;   private String password;   public String getUsername() {     return username;   }   public void setUsername(String username) {        this.username = username;   }   public String getPassword() {     return password;   }   public void setPassword(String password) {     this.password = password;   } }

    (3)Action中,类实现ModelDriven<T>

    package cn.struts.demo_show;
    
    
    import com.opensymphony.xwork2.ModelDriven;
    
    
    //1.action类实现ModelDriven接口
    
    public class LoginAction implements ModelDriven<User> {
    
    // 2.实例化模型对象
    
    private User user = new User();
    
    
    // 3.重写接口中getModel方法,并返回模型对象
    
    @Override
    
    public User getModel() {
    
    return user;
    
    }
    
    
    // 测试接受页面参数的方法
    
    public void login() {
    
    System.out.println("action执行了");
    
    System.out.println("页面输入用户名为:" + user.getUsername() + "页面输入密码为:" + user.getPassword());
    
    }
    
    }

    总结:

    在实际的开发应用中,一般使用模型驱动方式较多。简单说,使用模型驱动,整个执行流程更清晰;其次在代码更简单,阅读性更高。其次,也会使用属性驱动模式,来实现简单的页面参数的接受。

    通常情况下,如果页面表单的name属性和实体类中的属性名称不是一一对应的话,那么就应该使用属性驱动;相反,如果与之对应,那么可以使用模型驱动。

  • 相关阅读:
    利用JasperReport+iReport进行Web报表开发
    EEPlat PaaS VS Saleforce force.com
    Python用subprocess的Popen来调用系统命令
    最短路径A*算法原理及java代码实现(看不懂是我的失败)
    Java抓取网页数据(原网页+Javascript返回数据)
    Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php
    白话经典算法系列之五 归并排序的实现
    poj 百练 2765 八进制小数(精度问题)
    winzip15.0注冊码
    Python:渗透测试开源项目
  • 原文地址:https://www.cnblogs.com/blogslee/p/6847837.html
Copyright © 2020-2023  润新知