Action获取请求参数方法

本文详细介绍了 Struts2 框架中模型驱动的实现方式及其优势,包括如何实现 ModelDriven 接口,如何封装数据到 List 和 Map 集合等,并对比了属性驱动的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Action在struts2的MVC中充当什么角色?
 在struts2中,

modelviewcontroler
actionJSPaction、StrutsPrepareAndExecuteFilter


struts2作为MVC框架,必须负责解析HTTP请求参数,并将其封装到Model对象,所以就必须有封装数据的方法。
2. 在struts2中获取请求参数
<1>属性驱动(Action本身作为model对象,通过成员setter封装)

 (1)直接将action做为一个model,就可以得到请求参数。这种方式底层是通过反射进行实现的。

页面:<input type="text" name="username"><br/>
Action:
public class RegistAction extends ActionSupport{
    private String username;

    public void setUsername(String username){
        this.username = username;
    }
}

 优点:这是多实例的,不存在线程问题,因为每一次请求都是一个新的action,没有共享成员属性值。
 缺点:数据封装到Action属性中,不能将Action对象传递给业务层,所以需要再再定义Javabean,将Action的属性封装到javabean中。

 (2)创建独立model对象,页面通过ognl表达式封装。

页面:<input type="text" name="user.username"><br/><!--基于ognl表达式的写法-->
Action:
public class RegistAction2 extend ActionSupport{
    //在action中声明一个model
    private User user;
    public void setUser(User user){
        this.user = user;
    }
    public User getUser() {
        return user;
    }
}

User:
//这个声明上必须提供get/set方法
private String username;
public void setUsername(String username) {
    this.username = username;
}
public String getUsername() {
    return username;
}   

 数据如何封装的?通过struts2中的interceptor进行了数据封装。
<interceptor name=”params”
class=”com.opensymphony.xwork2.interceptor.ParametersInterceptor” />

优点:简单,解决了第一种的方案的缺点。
缺点:在封装数据上需要用到ognl表达式,如果不使用struts2框架后,会导致页面奔溃,可移植性很差。

<2>模型驱动(推荐使用,经常在开发中使用)
 实现步骤:
(1)让Action类实现ModelDriven<T>。
(2)重写getModel方法。
(3)在action中实例化一个model对象,让getModel方法返回这个model对象。

//(1)实现ModelDriven<T>
public class RegistAction3 extends ActionSupport implements ModelDriven<User>{
    //(3)必须手动实例化。
    private User user = new User();
    //(2)重写getModel方法
    public User getModel() {
        //(3)返回model对象
        return user;
    }
}

 优点:解决了属性驱动存在的不足点。
 缺点:一次只能封装一个model对象。

 struts2有很多围绕模型驱动的特性,比如说有个拦截器:
<interceptor name=”modelDriven”
class=”com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor” />为模型提供更多驱动。

3.模型驱动封装数据到集合中
<1>将数据封装到List集合。

页面:
    username1:<input type="text" name="users[0].username"><br>
    password1:<input type="password" name="users[0].password"><br>

    username2:<input type="text" name="users[1].username"><br>
    password2:<input type="password" name="users[1].password"><br>
action类:
    private List<User> users;

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

<2>将数据封装到Map集合。

页面:
    username1:<input type="text" name="map['a'].username"><br>
    password1:<input type="password" name="map['a'].password"><br>

    username2:<input type="text" name="map['b'].username"><br>
    password2:<input type="password" name="map['b'].password"><br>

action类:
    private Map<String, User> map;
    public Map<String, User> getMap() {
        return map;
    }
    public void setMap(Map<String, User> map) {
        this.map = map;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值