Struts2-参数封装

Struts2的参数封装分为:

静态参数封装和动态参数封装

一、静态参数封装

假如我们有一个这样的动作类

public class Demo1Action extends ActionSupport {

	private String username;
	private int age;
	
	public String addUser(){
		System.out.println(username+","+age);
		return null;//不返回任何结果视图   NONE常量
	}
	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;
	}
}

struts.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<constant name="struts.devMode" value="true"/>
	<package name="p1" extends="struts-default">
		<action name="action1" class="com.itheima.web.action.Demo1Action" method="addUser">
			<!-- 当我们不写任何拦截器时,默认的拦截器栈defaultStack它来为我们工作。
				 但是,只要写了任何一个拦截器,默认的就全都不起作用了 -->
			<!-- 使用注入的方式,给动作类的中的参数赋值 -->
			<param name="username">张三</param>
			<param name="age">18</param>
		</action>
	</package>
</struts>

启动服务器,在浏览器访问就能获取到username和age,控制台输出:张三,18

这种赋值方式在配置文件中已经写死,想要更改就必须更改配置文件

那么这个值是怎么赋值给username和age的呢?

其实是struts-default.xml中的拦截器<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>帮我们做的。

二、动态参数封装

方式一、动作类与数据模型在同一类中

public class Demo1Action extends ActionSupport {

	private String username;
	private int age;
	public String addUser(){
		System.out.println(username+","+age);
		return null;//不返回任何结果视图   NONE常量
	}
	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;
	}
}

要求:表单中的name属性取值必须和动作类中数据模型set方法后面的名称一致

<form action="${pageContext.request.contextPath}/action2.action" method="post">
    	<%--表单中的name属性取值必须和动作类中数据模型的set方法后面的名称一致。 --%>
    	用户名:<input type="text" name="username" /><br/>
    	年龄:<input type="text" name="age"/><br/>
    	<input type="submit" value="提交" />
 </form>

这种方式其实和上面的静态赋值类似,只不过我们在jsp页面中的表单中添加数据,提交表单后由struts-default.xml中的拦截器

<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>帮我们赋值给username和age


方式二、数据模型与动作类分开写


注意:jsp页面写法和方式一不同,如果不加user就取不到值,因为表单中的name值和你动作类中的名称不匹配(动作类中是user)

<body>
    <form action="${pageContext.request.contextPath}/action3.action" method="post">
    	<%--表单中的name属性取值必须和动作类中数据模型的set方法后面的名称一致。 --%>
    	用户名:<input type="text" name="user.username" /><br/>
    	年龄:<input type="text" name="user.age"/><br/>
    	<input type="submit" value="提交" />
    </form>
  </body>

动作类和数据模型写法

//User类
import java.io.Serializable;

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;
	}

}
//动作类
public class Demo3Action extends ActionSupport {
	//定义数据模型对象
	
	//第一种情况
	private User user;
	//第二种情况
	private User user = new User();

	public String addUser(){System.out.println(user.getUsername()+","+user.getAge());
	return null;
	//不返回任何结果视图 NONE常量
	}

	public User getUser() {
	System.out.println("getUser");return user;
	}

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



第一种情况,我们在动作类中不创建User对象,只创建变量,控制台输出结果:


第二种情况,我们在动作类中创建User对象,控制台输出结果:


分析:第二中情况下,我们已经创建了User对象,Struts2框架先调用getUser方法,一看User对象已经存在,就不再调用setUser方法创建对象,直接再次调用getUser方法取值
,第一次调用get方法只判断对象存不存在,第二次调用get方法才是取值。



方式三、模型驱动

1.要想使用模型驱动,就必须动作类与数据模型分开 2.实现模型驱动的步骤: a.实现一个ModelDreven的接口 b.实现接口中的抽象方法getModel() c.在使用模型驱动的时候,数据模型必须由我们自己来实例化(必须我们自己new一个对象) 这个过程是由ModelDreven中的拦截器帮我们做的

3.代码实现
jsp页面
<body>
    <form action="${pageContext.request.contextPath}/action4.action" method="post">
    	<%--需要注意name属性的取值,已经不是一个普通的字符串了 --%>
    	用户名:<input type="text" name="username" /><br/>
    	年龄:<input type="text" name="age"/><br/>
    	<input type="submit" value="提交" />
    </form>
  </body>




动作类
public class Demo4Action extends ActionSupport implements ModelDriven<User>{


	//定义数据模型对象
	private User user = new User() ;//使用模型驱动,必须自己实例化模型对象
	
	
	//该方法返回的是数据模型
	public User getModel() {
		return user;
	}
	
	public String addUser(){
		System.out.println(user.getUsername()+","+user.getAge());
		return null;//不返回任何结果视图   NONE常量
	}


	public User getUser() {
		return user;
	}


	public void setUser(User user) {
		this.user = user;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值