一、Struts2 数据回显
所谓的数据回显技术就是,
struts的表单项标签s:textField标签自动从栈中取回。
(垃圾技术。。。。)
1.1 数据回显的实现
action:
public String register() {
//模拟数据
UserEntity user=new UserEntity();
user.setName("小白");
user.setPwd("123");
//放入栈顶
ActionContext ac = ActionContext.getContext();
ValueStack vs = ac.getValueStack();
vs.push(user);
return "success";
}
index.jsp:
<s:form action="./user_register" method="post" theme="simple">
用户名:<s:textfield name="name"></s:textfield>
密码:<s:textfield name="pwd"></s:textfield>
生日:<s:textfield name="birth"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
action跳转到index.jsp。action中放入栈顶的user对象会自动填充到
index.jsp表单中。
1.2 数据回显的原理
<s:form action="./user_register" method="post" theme="simple">
用户名:<s:textfield name="name"></s:textfield>
密码:<s:textfield name="pwd"></s:textfield>
生日:<s:textfield name="birth"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
<s:textfield name="name"></s:textfield>
这个标签会自动从值栈对象的list集合中取值,
通过name值与list栈中对象的属性进行匹配。
1.3 数据回显案例
===>> UserAction.java
public class UserAction extends ActionSupport{
public String register() {
//模拟数据
UserEntity user=new UserEntity();
user.setName("小白");
user.setPwd("123");
//放入栈顶
ActionContext ac = ActionContext.getContext();
ValueStack vs = ac.getValueStack();
vs.push(user);
return "success";
}
}
===>> struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx" extends="struts-default">
<action name="user_*" class="org.jsft.demo.UserAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
===>> index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
<s:property value="user"/>
<!-- 表单 -->
<s:form action="./user_register" method="post" theme="simple">
用户名:<s:textfield name="name"></s:textfield>
密码:<s:textfield name="pwd"></s:textfield>
生日:<s:textfield name="birth"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
===>> 测试
直接访问
http://localhost:8080/struts4/user_register
二、Struts2 模型驱动
2.1 模型驱动的作用
有些控制器是不代表任何模型对象,即控制器不和实体进行绑定。
所以struts提供了模型驱动,
目的就是为了实现控制器与入参对象的解耦。
2.2 模型驱动的原理
模型驱动的实现是由于ModelDriven 拦截器。
1.当用户访问action对象时,就会把action对象创建出来,
然后进入拦截器栈。
2.首先ModelDriven拦截器会调用action对象的getModel()方法,
将getModel()返回的实例压入栈顶。
3.然后Parameters拦截器将请求的表单字段
映射到 ValueStack 栈的栈顶对象的各个属性中。
注意:
由于此时ValueStack 栈的栈顶对象是刚刚被压入的模型对象,所以该模型就被填充。
如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象.
一个模型类必须有一个不带任何参数的构造器.
2.3 模型驱动案例
===>> UserAction.java
public class UserAction extends ActionSupport implements ModelDriven<UserEntity>{
private UserEntity userEntity=new UserEntity();
/**
* 1.通过值栈对象操作list集合
* @return
*/
public String demo() {
return "index";
}
@Override
public UserEntity getModel() {
return userEntity;
}
}
===>> struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx" extends="struts-default">
<global-results>
<result name="input">/register.jsp</result>
</global-results>
<action name="demo" class="org.jsft.demo.UserAction" method="demo">
<result name="index">/index.jsp</result>
</action>
</package>
</struts>
===>> register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 表单 -->
<form action="./demo" method="get">
用户名:<input type="text" name="name"><br/>
密码:<input type="password" name="pwd" ><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
===>> index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<style type="text/css">
</style>
<body>
<!-- struts数据回显 -->
<s:form action="./index" method="post" theme="simple">
用户名:<s:textfield name="name"></s:textfield><br/>
密码:<s:password name="pwd"></s:password><br/>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
测试:
首先访问register.jsp。然后register.jsp会自动跳转到demo。然后
再由demo跳转到index.jsp。
此时register.jsp输入的数据会自动在index.jsp页面显示。
这是由于模型驱动和数据回显的共同作用。