十一、Struts2封装请求参数的方式

十一、Struts2封装请求参数的方式

方式一、Action 本身作为model对象,通过成员setter封装(一个名字为params的拦截器干的)

注意:表单中的名称要和动作类中的名称一致(这是必须的)

表单代码:

<br /> ---------------封装请求参数到Action-----------<br />

    

    <form action="${pageContext.request.contextPath }/paramAction1.action"

        method="post">

        用户名:<input type="text" name="username"/> <br/>

        密码: <input type="password" name="password"/> <br/>

        <input type="submit" value="登录">        

    </form>

 

Struts.xml文件中的代码:

<package name="p1" extends="struts-default">

        <action name="paramAction" class="com.itheima.action.ParamAction1"

            method="execute">

            

        </action>

    </package>

 

动作类中的代码:

//用动作类封装数据:定义字段名。提供setter方法,setter属性名称和表单的输入域中的名称保持一致

public class ParamAction1 extends ActionSupport{

    private String username;

    private String password;

    

    public void setUsername(String username) {

        this.username = username;

    }

    

    public void setPassword(String password) {

        this.password = password;

    }

    

    @Override

    public String execute() throws Exception {

        System.out.println(username + ":" + password);

        //这里可以调用service层的方法保存对象:save(this)

        return NONE;

    }

}

 

方式二:动作类和模型分开

表单代码:

<br /> ------封装请求参数到模型对象中Action和模型分开------<br />

    

    <form action="${pageContext.request.contextPath }/paramAction2.action"

        method="post">

        用户名:<input type="text" name="user.username"/> <br/>

        密码: <input type="password" name="user.password"/> <br/>

        <input type="submit" value="登录">        

    </form>

 

-------------

动作类代码:

//用动作类封装数据:定义字段名。提供setter方法,setter属性名称和表单的输入域中的名称保持一致

public class ParamAction2 extends ActionSupport {

    private User user;

 

    public User getUser() {

        return user;

    }

 

    public void setUser(User user) {

        this.user = user;

    }

 

    @Override

    public String execute() throws Exception {

        System.out.println(user);

        // 这里可以调用service层的方法保存对象:save(user)

        return NONE;

    }

}

 

------------

实体类:User.java

//实体类:

public class User implements Serializable {

    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;

    }

 

    @Override

    public String toString() {

        return "User [username=" + username + ", password=" + password + "]";

    }

}

 

方式三:模型驱动(面试)

表单代码:

<br/>----封装请求参数到模型对象中:Action和模型分开。模型驱动------<br/>

    

    <form action="${pageContext.request.contextPath }/paramAction3.action"

        method="post">

        用户名:<input type="text" name="username"/> <br/>

        密码: <input type="password" name="password"/> <br/>

        <input type="submit" value="登录">        

    </form>

 

动作类代码:

//动作类和实体类分开

public class ParamAction3 extends ActionSupport implements ModelDriven<User> {

    // 此处必须创建一个对象

    private User user = new User();;

 

    @Override

    public String execute() throws Exception {

        System.out.println(user);

        // 这里可以调用service层的方法保存对象:save(user)

        return NONE;

    }

    

    @Override

    public User getModel() {

        //这里需要返回一个对象

        return user;

    }

}

 

注:模型驱动实际上是由一个拦截器来做的。modelDriven拦截器来做。把getModel方法返回的对象,压入一个叫做ValueStack的栈顶。struts框架就会根据表单的name属性,调用对应栈顶对象的setter方法,从而把请求参数封装进来。

 

封装数据到集合类型Collection中:

表单代码:

<body>

    <br/>-----封装请求参数到集合中:使用场景,批量添加-----<br/>

    <form action="${pageContext.request.contextPath }/paramAction4" method="post">

        用户名:<input type="text" name="users[0].username"/>

        密码:<input type="password" name="user[0].password"/><br/>

        用户名:<input type="text" name="users[1].username"/>

        密码:<input type="password" name="user[1].password"/><br/>

        用户名:<input type="text" name="users[2].username"/>

        密码:<input type="password" name="user[2].password"/><br/>

        <input type="submit" value="添加">

    </form>

</body>

 

动作类代码:

//数据封装到集合中

public class ParamAction4 extends ActionSupport {

    // 定义一个集合

    private Collection<User> users;

 

    public Collection<User> getUsers() {

        return users;

    }

 

    // 通过该方法将对象注入到集合中,不用显示的添加对象到集合中

    public void setUsers(Collection<User> users) {

        this.users = users;

    }

 

    public String execute() throws Exception {

        for (User user : users) {

            System.out.println(user);

        }

        return NONE;

    }

}

 

封装数据到Map中

表单代码:

<br/>-----封装请求参数到Map中:使用场景,批量添加-----<br/>

    <form action="${pageContext.request.contextPath }/paramAction5" method="post">

        用户名:<input type="text" name="users.u1.username"/>

        密码:<input type="password" name="users.u1.password"/><br/>

        用户名:<input type="text" name="users['u2'].username"/>

        密码:<input type="password" name="user['u2'].password"/><br/>

        <input type="submit" value="添加">

    </form>

 

动作类代码:

//数据封装到集合中

public class ParamAction5 extends ActionSupport {

    // 定义一个Map集合

    private Map<String, User> users;

 

    // 提供相应的settergetter方法

    public Map<String, User> getUsers() {

        return users;

    }

 

    public void setUsers(Map<String, User> users) {

        this.users = users;

    }

 

    @Override

    public String execute() throws Exception {

        for (Map.Entry<String, User> me : users.entrySet()) {

            System.out.println(me.getKey() + "=" + me.getValue());

        }

        return NONE;

    }

}

 

原文地址:https://www.cnblogs.com/Prozhu/p/5886419.html