(八)Struts2中的参数封装

一、静态参数封装

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

例子:

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

        public class User extends ActionSupport {

        private String username;    //用户名<br/>
        private int age;           //年龄

public String getUsername() {

            return username;<br/>
        }

public void setUsername(String username) {

            this.username = username;<br/>
        }

public int getAge() {

            return age;<br/>
        }

public void setAge(int age) {

            this.age = age;<br/>
        }

public String adduser(){

            System.out.println(username+&#34;:&#34;+age);<br/>
            return null;<br/>
        }<br/>
    }

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

            &lt;package name=“p1” extends=“struts-default”&gt;

            &lt;action name=&#34;action1&#34; class=&#34;com.cad.struts2.User&#34;  method=&#34;adduser&#34;&gt;<br/>
                &lt;!--通过注入的方式封装静态参数--&gt;<br/>
                &lt;param name=&#34;username&#34;&gt;张三&lt;/param&gt;<br/>
                &lt;param name=&#34;age&#34;&gt;18&lt;/param&gt;<br/>
            &lt;/action&gt;<br/>
        &lt;/package&gt;

(3)原理

 我们在struts2的运行流程中提到过,我们动作类的动作方法执行之前,会有一系列的拦截器帮我们执行一些操作。
在struts-default.xml中,有很多拦截器,拦截器又分为很多拦截器栈,我们默认是使用defaultStack的拦截器栈。
这个拦截器栈中有一个叫做staticParams的拦截器帮我们完成静态参数的封装,将配置的静态方法通过action类中的set方法设置进去。
二、动态参数封装

什么是动态参数?

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

例子:
(1)第一步:我们先创建一个添加用户的表单
        &lt;form action=“${pageContext.request.contextPath }/action1” method=“post”&gt;

        用户名:&lt;input type=&#34;text&#34; name=&#34;username&#34;&gt;&lt;br&gt;<br/>
        年 龄:&lt;input type=&#34;text&#34; name=&#34;age&#34;&gt;&lt;br&gt;<br/>
        &lt;input type=&#34;submit&#34; value=&#34;提交&#34;&gt;<br/>
    &lt;/form&gt; </pre>

(2)第一种方式:数据参数和动作类写在一起 要求是表单中的name必须和我们类中的set方法后面的名称一致,例如表单中的username对应类中的setUsername,和参数并没有太大关系,和set方法有关系。
                public class User extends ActionSupport {

                private String username;<br/>
                private int age;

public String getUsername() {

                    return username;<br/>
                }

public void setUsername(String username) {

                    this.username = username;<br/>
                }

public int getAge() {

                    return age;<br/>
                }

public void setAge(int age) {

                    this.age = age;<br/>
                }

public String adduser(){

                    System.out.println(username+&#34;:&#34;+age);<br/>
                    return null;<br/>
                }<br/>
            }

(3)配置struts.xml文件  

        &lt;package name=“p1” extends=“struts-default”&gt;
&lt;action name=“action1” class=“com.cad.struts2.User”  method=“adduser”&gt;
&lt;/action&gt;

    &lt;/package&gt;

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

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

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

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

                public class User  implements Serializable{

                private String username;<br/>
                private int age;

public String getUsername() {

                    return username;<br/>
                }

public void setUsername(String username) {

                    this.username = username;<br/>
                }

public int getAge() {

                    return age;<br/>
                }

public void setAge(int age) {

                    this.age = age;<br/>
                }<br/>
            }

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

  

                public class AdduserAction extends ActionSupport {

                private User user;

public User getUser() {

                    return user;<br/>
                }

public void setUser(User user) {

                    this.user = user;<br/>
                }<br/>
                public String adduser(){<br/>
                    System.out.println(user.getUsername()+&#34;:&#34;+user.getAge());<br/>
                    return null;<br/>
                }

}

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

  

                &lt;body&gt;

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

 原理:

这一系列操作还是拦截器params帮我们完成。我们在getUser和setUser里打印两句话来看看他到底是怎么执行的

            public User getUser() {<br/>
                System.out.println(&#34;getuser&#34;);<br/>
                return user;<br/>
            }

public void setUser(User user) {

                System.out.println(&#34;setuser&#34;);<br/>
                this.user = user;<br/>
            } 

输出

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