Struts2的传值方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ITdevil/article/details/84036691

从前台到后台,struts2的传值方式共三种:属性驱动对象驱动以及模型驱动

一、属性驱动

页面代码:input框中的name值只是填写单纯的属性名称

<form action="FieldDrivenValueAction" method="POST">
		用户名:<input name="username">
		<br>
		密码:<input name="password">
		<br>
		性别:<input name="sex">
		<br>
		年龄:<input name="age">
		<br>
		<input type="submit" value="提交"/>
</form>

后台代码:注意点:要为类中的每个属性提供getXXX和setXXX方法。这样前台提交form表单时,我们就能在后台接收到相应的属性值。

public class FieldDrivenValueAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	
	private String username;
	private String password;
	private String sex;
	private String age;
	
	
	public String addUser(){
		System.out.println(username);
		System.out.println(age);
		return "success";
	}
	
	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;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	
}

二、对象驱动

1.首先我们要新建实体类,目的是为了解耦,在action中将不是逻辑处理的代码抽离出来。

public class User {
	private String username;
	private String password;
	private String sex;
	private String age;
	........getXXX\setXXX略
}

2.页面,input框中name属性的填写方式也变了,并不是单纯的属性名了,而是“对象.属性名”的方式

<form action="ObjectDrivenValueAction" method="POST">
		用户名:<input name="user.username">
		<br>
		密码:<input name="user.password">
		<br>
		性别:<input name="user.sex">
		<br>
		年龄:<input name="user.age">
		<br>
		<input type="submit" value="提交"/>
</form>

3.后台,新建一个属性为我们的实体对象,并提供getXXX和setXXX方法。这样提交form表单时,我们就能在实体对象中取得前台传过来的属性值。

public class ObjectDrivenValueAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
	public String addUser(){
		System.out.println(user.getUsername());
		System.out.println(user.getAge());
		return "success";
	}
}

三、模型驱动(也是最为常用的一种方式)

1.我们同样需要新建实体对象

2.页面,input框中的name属性只是填写简单的属性值

form action="ModelDrivenValueAction" method="POST">
		用户名:<input name="username">
		<br>
		密码:<input name="password">
		<br>
		性别:<input name="sex">
		<br>
		年龄:<input name="age">
		<br>
		<input type="submit" value="提交"/>
</form>

3.后台,前两种方式Action只是继承自ActionSuppport,模型驱动就有些不同了,我们要实现ModelDriven接口,并且重写它的getModel方法,这样前台的属性值就会传到后台定义的实体属性User中去。

public class ModelDrivenValueAction implements ModelDriven<User>{
	
	private User user;
	
	@Override
	public User getModel() {
		if(user==null){
			user = new User();
		}
		return user;
	}
	
	public String addUser(){
		System.out.println(user.getUsername());
		System.out.println(user.getSex());
		return "success";
	}

}	

手动分割线

前台向后台的传值都熟知了,那么后台怎么往前台传值呢?这里就要用到struts的值栈Ognl表达式了。关于值栈,分为两个部分,一个是root(本质是一个List集合),一个是context(本质是存放有键值对的map对象),这里不做过多介绍了。后台向前台传值的时候,可以将值直接放入值栈中,也可以放入到context中,这样前台就可以通过ognl表达式获取到前台穿过来的值了,详细看例子。

1.页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>    
<!--使用struts2的标签,必须加上该指令-->
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>信息展示页面</title>
</head>
<body>
    <!--便于看到值栈-->
	<s:debug></s:debug>
    <!--从值栈中取值,直接填写属性值-->
	username:<s:property value="username"/><br/>
	Age:<s:property value="age"/>
	<hr>
    <!--从ActionContext中取,必须加上‘#’-->    
	username2:<s:property value="#user2.username"/>
	age2:<s:property value="#user2.age"/>
	
</body>
</html>

2.后台

public class AfterToBeforeAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	

	public String receiveValue(){
		User user = new User();
		user.setUsername("haha");
		user.setAge("88");
		
		User user2 = new User();
		user2.setUsername("boniu");
		user2.setAge("8");
		
		ActionContext ac = ActionContext.getContext();
        //从context中获取到值栈对象
		ValueStack stack = ac.getValueStack();
		//压栈,将值放入到栈中,前台取值时通过属性名即可获取
		stack.push(user);
		//放入context中,前台取值时要加'#'号
		ac.put("user2", user2);
		return "success";
	}

}

值栈具体是什么样子的,可以通过我们页面上使用的struts2标签<s:debug />看到其部分,这里贴两张图,供大家参考,有机会再详谈值栈。

图1中绿色标记的,即是我们通过stack.push()方法将user对象压入栈中的体现

图2中的user2即是我们通过context.put()方法放入context中的user2对象

猜你喜欢

转载自blog.csdn.net/ITdevil/article/details/84036691
今日推荐