从前台到后台,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对象