struts2的请求参数封装

本文详细介绍了Struts2框架中的参数封装技术,包括静态参数封装和动态参数封装的不同方式及其实现原理。通过示例代码展示了如何配置Struts2以实现参数的自动填充。

一 静态参数封装

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

静态参数封装只在其所需的其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;
	}
       //此方法在动作方法前执行
          @Override
	public User getModel() {
		// TODO Auto-generated method stub
		return 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的拦截器实现



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值