SSH框架前后端数据交互

一、属性驱动
1.action中无实体类的属性驱动
无实体类的属性驱动,即前端页面发送到action中的数据不是action中实体类的某个属性,而是单独的,普通的变量。例如jsp页面要将一个username发送到action中:

jsp页面:

<form action="test.action"  method="post">
	<input type="text" name="username"> 
	<input type="submit" value="提交">
</form>

jsp页面通过表单用post方式将数据发送到名为test的动作方法中

动作类:

@ParentPackage("struts-default")
public class testAction extends ActionSupport{
	//别忘了继承ActionSupport
	private String username ; //这里的变量名要与页面表单中input框的name属性值一致
	//生成getter、setter方法
	public String getUsername(){
		return username ;
	}
	public void setUsername(String username){
		this.username = username ;
	}


//处理完毕之后跳转到result.jsp
	@Action(value="test",results= {@Result(name="success",location="/result.jsp")})
	public String execute(){
		System.out.println(username);
		return SUCCESS ;
	}

}

动作类中声明变量的名称要与页面表单中该属性的名称一致,同时生成getter、setter方法
此时,struts2的值栈栈顶对象是当前执行的动作类,该username属性在这个动作类对象中,使用struts2提供的debug标签查看result.jsp中的值栈内容:
在这里插入图片描述
此时,在result.jsp中就可以用el表达式获取该username属性的值:

${username}

el表达式获取属性值是直接查找Property Name,从上到下依次查找,找到了第一个与el表达式中名称一样的属性就返回属性值。这里不讨论值栈中Property Name有多个同名属性的问题。

二、模型驱动——有实体类
这种方式是action使用一个实体类对象去接收前端jsp页面传来的值
要求:
1、动作方法实现**ModelDriven<实体类名称>**接口,并覆写getModel()方法。
2、同时要先定义一个用来接收数据的实体类(记得实现可序列化接口)。
3、前端jsp页面表单中的参数名称要与实体类的数据成员名称一致。
User类:

public class User implements Serializable {

	private String username ;
	private String password ;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + "]";
	}
}

动作类中:

public class testAction2 extends ActionSupport implements ModelDriven<User> {
	//先实例化一个user对象
	private User user = new User() ;
	//在覆写的getMode()方法中返回这个user对象
	@Override
	public User getModel() {
		return user;
	}
}

这么一来,user对象就会被自动压入值栈中,此时的栈顶对象就是这个user对象

动作方法:
@Action(value=“test2”,results= {@Result(name=“success”,location="/result.jsp")})
public String execute() {

	System.out.println(user);
	return SUCCESS ;
}

前端jsp页面:

	<form action="test2.action"  method="post">
		username:<input type="text" name="username"> 
		password:<input type="text" name="password"> 
		<input type="submit" value="提交">
	</form>
	<s:debug></s:debug>

提交后action中的user对象的username和password就有值了,同时,result.jsp中的栈顶对象是该user对象:
在这里插入图片描述

一样可以通过el表达式取出值:

${username}
${password}

如果前端页面的表单中只有username,而没有password,则到action中这个参数password的值就是默认值null,到值栈中也是默认值null

结语:
请求参数封装事实上是由struts2自动的调用了setter和getter方法给实体类对象或者action中的变量赋值了。
通过这两种方式从前台表单获取数据,很基础很方便很重要。事实上还有一种有实体类的属性驱动,但是个人认为用的不多,因此没有介绍。

猜你喜欢

转载自blog.csdn.net/weixin_40616523/article/details/85162795
今日推荐