Struts2之数据封装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011301372/article/details/85015154

数据封装的原因

作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中
封装数据为开发提供了很多方便
struts2框架提供了很强大的数据封装功能,不再需要使用Servlet的API完成手动的封装

Struts2中提供了两类数据封装的方式

第一种方式:属性封装

提供对应属性的set方法进行数据的封装

  • 表单的哪些属性需要封装数据,就那么在对应的Action类中提供该属性的set方法即可
  • 表单中的数据提交,最终找到Action类中的setXXX方法,最后赋值给全局变量
  • 注意0:Struts2的框架采用的拦截器完成数据的封装
  • 注意1:这种方式不是特别好,因为属性特别多,提供特别多的set方法,而且还需要手动将数据存入对象中
  • 注意2:这种情况下,Action类就相当于一个JavaBean,就没有体现出MVC的思想,Action类又封装数据,又接收请求处理,耦合性高
public class Regist1Action extends ActionSupport{
    private  String username;
    private String password;
    private String age;
//之需要set方法
    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setAge(String age) {
        this.age = age;
    }


    public String execute(){
        System.out.println(username+" "+password+" " +age);
        return NONE;
    }
}
 <package name="demo2" namespace="/" extends="struts-default">
        <!--属性驱动的方式-->
        <action name="regist1" class="com.zst.demo2.Regist1Action"/>

    </package>
<h3>属性驱动的方式</h3>
<form action = "${pageContext.request.contextPath}/regist1.action" method="post">
    姓名:<input type="text" name="username"/><br/>
    密码:<input type="password" name="password"/><br/>
    年龄:<input type="password" name="age"/><br/>
    <input type="submit" value="注册">
</form>

备注:
如果请求是超链接,解决方法:使用web过滤器

<!--超链接是get方法,中文会乱码-->
<a href="xxxActin?username=雄安"></a>

在页面上,使用OGNL表达式进行数据封装

  • 在页面中使用OGNL表达式进行数据的封装,就可以直接把属性封装到某一个JavaBean的对象中
  • 在页面中定义一个JavaBean,并且提供set方法,比如:private User user
  • 页面中的编写发生了变化,需要使用OGNL的方式,表单中的写法:<input type="text" name="user.user.name">
  • 注意:只提供一个set方法还不够,必须还需要提供user属性的get和set方法
    ** 先调用get方法,判断一下是否有user对象的实例对象,如果没有,调用set方法把拦截器创建的对象注入进来。
public class Regist2Action extends ActionSupport {
    //注意2:属性驱动的方式,提供的是get和set方法
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String execute() throws Exception{
        System.out.println(user);
        return NONE;
    }
}
<!--注意:页面的编写规则,发生了变化,使用的OGNL表达式-->
<h3>属性驱动的方式(把数据封装到JavaBean的对象中)</h3>
<form action = "${pageContext.request.contextPath}/regist2.action" method="post">
    姓名:<input type="text" name="user.username"/><br/>
    密码:<input type="password" name="user.password"/><br/>
    年龄:<input type="password" name="user.age"/><br/>
    <input type="submit" value="注册">
</form>

第二种方式:模型驱动

使用模型驱动的方式,也可以把表单中的数据直接封装到一个JavaBean的对象中,并且表单的写法和之前的写法没有区别
编写的页面不需要任何变化,正常编写name属性的值
模型驱动的编写步骤

  • 手动实例化JavaBean,即private User user = new User();
  • 必须实现ModelDriven<T>接口,实现getModel()的方法,在getModel()方法中返回user即可。

在这里插入图片描述

public class Regist3Action extends ActionSupport implements ModelDriven<User>{
    //必须手动实例化
    private User user = new User();

    public String execute() throws Exception{
        System.out.println(user);
        return NONE;
    }

//获得一个模型的对象
    @Override
    public User getModel() {

        return user;
    }
}
<h3>模型驱动的方式</h3>
<form action = "${pageContext.request.contextPath}/regist3.action" method="post">
    姓名:<input type="text" name="username"/><br/>
    密码:<input type="password" name="password"/><br/>
    年龄:<input type="password" name="age"/><br/>
    <input type="submit" value="注册">
</form>

猜你喜欢

转载自blog.csdn.net/u011301372/article/details/85015154