Struts2中属性驱动与模型驱动
属性驱动:
1、概念
能够利用属性驱动获取页面表单元素的内容
2、步骤
1、在action中声明属性,属性的名称和页面元素中name属性的值保持一致
2、action中的属性必须有set和get方法
LoginAction.java:
public class LoginAction extends ActionSupport implements ModelDriven<User>{
	private User mdoel = new User();
	@Override
	public User getModel() {
		// TODO Auto-generated method stub
		return this.mdoel;
	}
	public String login(){
		System.out.println(this.getModel().getUsername());
		System.out.println(this.getModel().getPassword());
		return SUCCESS;
	}
}
User.java:
public class User {
	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;
	}
}
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>
<!--
常量
用来改变default.properties文件里的常量的设置
-->
<constant name="struts.ui.theme" value="simple"></constant>
<!--
一般在开发的情况下,设置struts.devMode为true,这样改动完xml文件以后不用又一次启动了
-->
<constant name="struts.devMode" value="true"/>
<include file="struts-modeldriver.xml"></include>
</struts>
struts-modeldriver.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="login" namespace="/" extends="struts-default">
<action name="loginAction_*" method="{1}" class="com.leaf.struts.action.LoginAction">
<result>index.jsp</result>
</action>
</package>
</struts>
web.xml中添�过滤器:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
<s:form action="loginAction_login.action">
<table>
<tr>
<td>用户名</td>
<td><s:textfield name="username"/></td>
</tr>
<tr>
<td>密码</td>
<td><s:password name="password"/></td>
</tr>
<tr>
<td></td>
<td><s:submit/></td>
</tr>
</table>
</s:form>
</body>
</html>
原理图例如以下:
注意事项:
1、 必须使用struts2默认的拦截器栈中的ParameterInterceptor
2、 Action中的属性和表单中的name属性的值保持一致
3、 利用valueStack.setValue方法能够赋值了
总结:jsp页面表单中有name为username和password的文本框,相应在action中放入了username和password的相应属性。当jvm运行时,会先运行action,action会被压入栈顶,这样action的属性就暴露在了对象栈(对象栈的特点就是能够在jsp中利用ognl表达式直接取出属性的值)中,然后底层运行了ParameterInterceptor类的doIntercept方法,例如以下图:
在这种方法中具有拦截器的详细处理细节,并且表单中的数据被存放在ParameterInterceptor类中的Map结构中,即Map<String,Object>:[{username:value},{password:value}],它是通过valueStack将其放到栈顶即valueStack.setValue()方法(为action中的属性赋值),最后doInterceptor()返回invocation.invoke()将放行继续往下运行,之后运行action中的方法,而action中的属性在这步已经赋值了。
模型驱动:
1、假设页面上元素内容太多,用属性驱动实现,action中代码就会非常庞大,这个时候能够考虑用模型驱动来实现
2、步骤
1、action实现一个接口ModelDriver
2、在action中声明一个属性,该属性会封装页面中的数据,而且用new的方法给该属性创建对象
3、填充接口中的方法getModel,返回该属性的值
public class UserAction implementsModelDriver<User>{
privateUser model = new User();
publicUser getModel(){
returnthis.model;
}
}
LoginAction.java:
public class LoginAction extends ActionSupport{
	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;
	}
	public String login(){
		System.out.println(this.username);
		System.out.println(this.password);
		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>
<!--
常量
用来改变default.properties文件里的常量的设置
-->
<constant name="struts.ui.theme" value="simple"></constant>
<!--
一般在开发的情况下,设置struts.devMode为true,这样改动完xml文件以后不用又一次启动了
-->
<constant name="struts.devMode" value="true"/>
<include file="struts-propertydriver.xml"></include>
</struts>
struts-propertydriver.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="login" namespace="/" extends="struts-default">
<action name="loginAction_*" method="{1}" class="com.leaf.struts.action.LoginAction">
<result>index.jsp</result>
</action>
</package>
</struts>
web.xml中添�过滤器:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
<s:form action="loginAction_login.action">
<table>
<tr>
<td>用户名</td>
<td><s:textfield name="username"/></td>
</tr>
<tr>
<td>密码</td>
<td><s:password name="password"/></td>
</tr>
<tr>
<td></td>
<td><s:submit/></td>
</tr>
</table>
</s:form>
</body>
</html>
原理图例如以下:
从上图能够看出,ModelDriverInterceptor有两个作用:
1、 当前请求的action必须实现ModelDriver接口
2、 把model对象放入到了栈顶
总结:
当表单中数据提交到相应的action中时,struts2容器会创建action,而且把action放入到栈顶,实现ModelDriven的action类在对象栈中会有一个属性为model(username,password),之后ModelDrivenInterceptor类会把action中的model属性放入栈顶(这样model属性直接能够訪问了),之后再由ParameterInterceptor类负责把页面上表单中的值赋值给对象栈中的属性,由该类中的doInterceptor方法返回invocation.invoke()放行,回到action中,最后由jsp页面通过ognl表达式显示相应的信息。
Struts2中属性驱动与模型驱动的更多相关文章
- Struts2的属性驱动与模型驱动的区别
		
1.Struts2的属性驱动. Struts2的属性驱动指的是在action中JSP页面的每一个form中的name都对应在action中有一个属性与之对应.看下面代码片段: <form act ...
 - action类中属性驱动和模型驱动的区别
		
1.Struts2的属性驱动 在Action类中,属性××通过get××()和set××()方法,把参数在整个生命周期内进行传递,这就是属性驱动 代码如下: package org.abu.csdn. ...
 - struts2 中属性驱动(其实就是struts2 action 中处理 request  的参数【old 方式servlet api 封装数据到javabean中(or beanutils)】),这里属性驱动是新方式
		
1.属性驱动 a\ 一般的set public class UserAction extends ActionSupport { private String username; private S ...
 - Struts2(四)属性驱动和模型驱动
		
一.概述 所谓模型驱动,就是使用单独的JavaBean实例贯穿整个MVC流程,与之相对应的属性驱动方式,则使用属性作为贯穿MVC流程的信息携带者.属性无法独立存下,它必须依附于一个对象,这个对象就是A ...
 - strus2中获取表单数据 两种方式 属性驱动 和模型驱动
		
strus2中获取表单数据 两种方式 属性驱动 和模型驱动 属性驱动 /** * 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值 * 如果一个属性在对象栈,在页面 ...
 - Struts2属性驱动与模型驱动
		
为什么要使用属性驱动和模型驱动 struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在获 ...
 - Struts2 属性驱动、模型驱动、异常机制
		
模型驱动使用单独的VO(值对象)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果. 一.使用模型驱动 1.login.action采用模型驱动模式实现,采用模型驱动时必 ...
 - struts2属性Struts2中属性接收参数中文问题和简单数据验证
		
PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 一:如果表单提交数据中有中文时,尽量应用post方式. 需要在Struts. ...
 - Struts2的学习-属性驱动和模型驱动
		
1.新建空项目,并托管到码云 2.设立maven 3.设置pom.xml 4.建包 5.在java包里建立两个类 package com.nf.entity; public class User { ...
 
随机推荐
- 使用FTP搭建YUM
			
VSFTP搭建YUM源 1.安装FTP [root@FTP kel]# rpm -qa |grep vsftp vsftpd-2.2.2-6.el6_0.1.x86_64 首先需要安装的ftp软件为v ...
 - storm流式大数据处理流行吗
			
在如今这个信息高速增长的今天,信息实时计算处理能力已经是一项专业技能了,正是因为有了这些需求的存在才使得分布式,同时具备高容错的实时计算系统Storm才变得如此受欢迎,为什么这么说呢?下面看看新霸哥的 ...
 - 用Python组合Celery Redis RabbitMQ进行分布式数据抓取
			
首先,记录下遇到的问题吧,在抓取的过程中为了避免IO操作,主要用Redis做插入缓存,当内存占用率很大时,会周期性的持续到Mysql里 虽然是拆东墙补西墙,但把数据抓取完毕后持续化可以慢慢进行,毕竟数 ...
 - 在logopond中看到的优秀设计随想
			
本随笔仅仅只是自己对于设计作品的想法,不喜勿喷~ 昨日看到关于大神配色的文章,决定在logopond网站中看看优秀的作品,以为自己的配色找找灵感,学习学习,对自己有很强的震撼力的有: 以女性高跟性的抽 ...
 - Python的数据处理学习(三)
			
三.类的继承 Python 的class可以允许从零开始创建一个定制类,就像文章(二)创建Athlete类一样,也可以通过继承现有的其他类类创建一个类,这也包括用List.set和dict提供的p ...
 - (转)PHP开发框架浅析
			
开发框架的定义我没有找到很准确的描述,下面几句话基本概括了开发框架的的功能和用途 框架是一种应用程序的半成品: 框架就像是人的骨骼一样: 框架是一组可复用的组件: 框架是一个可复用的设计构件…… 简而 ...
 - win7 文件共享 xp
			
前几天因为需要将win7内一文件夹共享给XP使用,因为NT5跟NT6安全机制的问题,共享的实现没有XP共享的方便,很多人是牺牲(关闭)了win7的系统防火墙才达到共享给XP的目的,但是关闭防火墙势必会 ...
 - SQL语句查找重复记录
			
select * from AM_C4_ENTRY t where t.created_by in ( select t.created_by from AM_C4_ENTRY t group by ...
 - emWin(ucGui)的Edit控件退格处理方法 worldsing
			
在enWin(ucGui)中EDIT控件在数值模式(十进制/十六进制/二进制/浮点数)下编辑是,无法使用BackSpace键进行退格,主要涉及到的函数有: EDIT_SetBinMode() EDIT ...
 - UVaLive 6805 Pantun Grader (恶心的模拟)
			
题意:给定 n 首诗,然后让你给他打分,有四种规则,第一种是按音节打,如果音节在8-12之间,就加10,第二种就是按押韵打,如果13,24一个押韵就加20分. 第三种按音节数打,13,24有一个一样的 ...