struts2的请求参数封装

来源:互联网 发布:文章类网站源码 编辑:程序博客网 时间:2024/05/17 02:00

一 静态参数封装

静态参数封装,对于每次其提交的参数都是一样的情况,可以使用静态参数来实现

静态参数封装只在其所需的其action中配置

例:

 <action name="hello" class="com.yu.web.action.HelloAction" method="saveUser">  <param name="name">struts</param>  <param name="age">2</param></action>

其所配置的参数名称必须和其pojo类的属性相对应,应为参数传递是通过注入的方式提交的

public class HelloAction extends ActionSupport {private String name;private int age;    public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String execute(){return SUCCESS;}public String saveUser(){System.out.println("name:"+name+"age:"+age);return null;}}

静态参数分装是通过staticParams的拦截器来实现的

如果我们不配置其staticParams拦截器,那么就不能得到其参数

<action name="hello" class="com.yu.web.action.HelloAction" method="saveUser">  <interceptor-ref name="exception"/>                <interceptor-ref name="alias"/>                <interceptor-ref name="servletConfig"/>                <interceptor-ref name="i18n"/>                <interceptor-ref name="prepare"/>                <interceptor-ref name="chain"/>                <interceptor-ref name="scopedModelDriven"/>                <interceptor-ref name="modelDriven"/>                <interceptor-ref name="fileUpload"/>                <interceptor-ref name="checkbox"/>                <interceptor-ref name="multiselect"/>                <!-- <interceptor-ref name="staticParams"/> -->                <interceptor-ref name="actionMappingParams"/>                <interceptor-ref name="params">                    <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>                </interceptor-ref>                <interceptor-ref name="conversionError"/>                <interceptor-ref name="validation">                    <param name="excludeMethods">input,back,cancel,browse</param>                </interceptor-ref>                <interceptor-ref name="workflow">                    <param name="excludeMethods">input,back,cancel,browse</param>                </interceptor-ref>                <interceptor-ref name="debugging"/>  <param name="name">struts</param>  <param name="age">2</param> <!--  <result name="success" type="chain">   <param name="namespace">/struts2</param>  <param name="actionName">error</param>  </result> -->  </action>

从上面的结果可以看出,当我们注销掉staticParams拦截器后,其参数无法分装

注意:当我们没有配置拦截器时,其默认调用defaultStack的拦截器,如果我们写了一个拦截器,那么默认的拦截器就不起作用了


二 动态参数封装

2.1动作类是实体

注意:表单中的字段名必须和其实体的属性一致

这种方式由params拦截器来实现

2.2动作类与实体模型分开

写好实体类后,再其动作类中设置一个实体类的属性‘

public class HelloAction extends ActionSupport {private User user;public User getUser() {System.out.println("getUser()");return user;}public void setUser(User user) {System.out.println("setUser()");this.user = user;}public String execute(){return SUCCESS;}public String saveUser(){System.out.println("name:"+user.getName()+"age:"+user.getAge());return null;}}

编写表单

<form action="${pageContext.request.contextPath}//struts/hello.action">        <input type="text" name="user.name"></input>        <input type="text" name="user.age"></input>        <input type="submit"></input>        </form>

注意其表单中name名称的编写

打印结果

从上面的结果看出,其getUser打印了两次,都有什么含义了

getUser()                          :判断对象是否为空,即是否存在实体类的对象
setUser()                           :如果为空,通过反射则创建一个实体类
getUser()                            :调用实体类对象
name:大大age:12             :结果显示


如果我们创建一个实体类对象,那么就不会执行setUser()


2.3模型驱动来实现

模型驱动实现的方式是通过实现ModelDriver<T>接口来实现的

public class HelloAction extends ActionSupport implements ModelDriven<User>{private User user=new User();public String execute(){return SUCCESS;}       //此方法在动作方法前执行          @Overridepublic User getModel() {// TODO Auto-generated method stubreturn user;}public String saveUser(){System.out.println("name:"+user.getName()+"age:"+user.getAge());return null;}}

注意:模型驱动类必须实例化实体类

表单中字段名只需和实体类的属性一致就可以

<form action="${pageContext.request.contextPath}//struts/hello.action">        <input type="text" name="name"></input>        <input type="text" name="age"></input>        <input type="submit"></input>        </form>
其实现由一个modelDriver的拦截器实现



0 0
原创粉丝点击