Struts2中的参数封装

Posted 跃小云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2中的参数封装相关的知识,希望对你有一定的参考价值。

一、静态参数封装

什么是静态参数? 
静态参数就是硬编码的,不可随意改变。

例子:

(1)我们首先创建一个Action类,里面有两个参数,用来封装请求参数

 

        public class User extends ActionSupport {
            private String username;    //用户名
            private int age;           //年龄

            public String getUsername() {
                return username;
            }

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

            public int getAge() {
                return age;
            }

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

            public String adduser(){ 
                System.out.println(username+":"+age);
                return null;
            }
        } 

 

(2)我们在struts.xml中配置静态参数,我们访问action1动作时,会输出 张三:18

            <package name="p1" extends="struts-default">
                <action name="action1" class="com.cad.struts2.User"  method="adduser"> 
                    <!--通过注入的方式封装静态参数-->
                    <param name="username">张三</param>
                    <param name="age">18</param>
                </action>
            </package>  

(3)原理

 我们在struts2的运行流程中提到过,我们动作类的动作方法执行之前,会有一系列的拦截器帮我们执行一些操作。 

        在struts-default.xml中,有很多拦截器,拦截器又分为很多拦截器栈,我们默认是使用defaultStack的拦截器栈。  

        这个拦截器栈中有一个叫做staticParams的拦截器帮我们完成静态参数的封装,将配置的静态方法通过action类中的set方法设置进去。

 

 

 

二、动态参数封装

什么是动态参数?

像我们用表单提交的数据,就是动态数据。数据是可变的

例子:
(1)第一步:我们先创建一个添加用户的表单
        <form action="${pageContext.request.contextPath }/action1" method="post">
            用户名:<input type="text" name="username"><br>
            年 龄:<input type="text" name="age"><br>
            <input type="submit" value="提交">
        </form> 
(2)第一种方式:数据参数和动作类写在一起 要求是表单中的name必须和我们类中的set方法后面的名称一致,例如表单中的username对应类中的setUsername,和参数并没有太大关系,和set方法有关系。
                public class User extends ActionSupport {
                    private String username;
                    private int age;

                    public String getUsername() {
                        return username;
                    }

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

                    public int getAge() {
                        return age;
                    }

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

                    public String adduser(){ 
                        System.out.println(username+":"+age);
                        return null;
                    }
                }  

(3)配置struts.xml文件  

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

            <action name="action1" class="com.cad.struts2.User"  method="adduser">

            </action>
        </package>

 

 

 

这一系列操作是由拦截器栈中的名为params的拦截器帮我们完成的

上面这种方式将参数和动作类写在一起,看起来太过混乱,我们能不能用一个JavaBean将参数给封装起来。 答案是能。

 第二种方式,将参数数据和动作类分开写

  (1)第一步,我们创建一个javaBean,User类,用来封装请求参数

                public class User  implements Serializable{
                    private String username;
                    private int age;

                    public String getUsername() {
                        return username;
                    }

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

                    public int getAge() {
                        return age;
                    }

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

  (2)第二步:创建一个添加用户的动作类,里面有一个user对象

  

                public class AdduserAction extends ActionSupport {
                    private User user;

                    public User getUser() {
                        return user;
                    }

                    public void setUser(User user) {
                        this.user = user;
                    }
                    public String adduser(){
                        System.out.println(user.getUsername()+":"+user.getAge());
                        return null;
                    }

                } 

(3)第三步:我们得改变一些我们的jsp页面的写法,因为表单的name要和类中的数据相对应,但类中只有一个user ,username去找动作类中的setUsername,肯定找不到。 我们这样写,他就会先找类中的user对象,然后去找user对象的username和age  

  

                <body>
                    <form action="${pageContext.request.contextPath }/action1" method="post">
                        用户名:<input type="text" name="user.username"><br>
                        年 龄:<input type="text" name="user.age"><br>
                        <input type="submit" value="提交">
                    </form>
                </body>

 原理:

这一系列操作还是拦截器params帮我们完成。我们在getUser和setUser里打印两句话来看看他到底是怎么执行的
                public User getUser() {
                    System.out.println("getuser");
                    return user;
                }

                public void setUser(User user) { 
                    System.out.println("setuser");
                    this.user = user;
                } 

                输出
                getuser   :先判断对象是否存在
                setuser   :如果判断不存在,调用set方法,通过反射创建一个对象,并且设置给该类   
                getuser   :然后再获取该对象,调用该对象的get和set方法对参数赋值 

  

 

 





以上是关于Struts2中的参数封装的主要内容,如果未能解决你的问题,请参考以下文章

Struts2学习———— 表单参数自动封装和参数类型自动转换

struts2的参数的封装形式

Struts2参数的封装

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

深入分析JavaWeb 45 -- Struts2封装请求参数与类型转换

深入分析JavaWeb 45 -- Struts2封装请求参数与类型转换