属性驱动:

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中属性驱动与模型驱动的更多相关文章

  1. Struts2的属性驱动与模型驱动的区别

    1.Struts2的属性驱动. Struts2的属性驱动指的是在action中JSP页面的每一个form中的name都对应在action中有一个属性与之对应.看下面代码片段: <form act ...

  2. action类中属性驱动和模型驱动的区别

    1.Struts2的属性驱动 在Action类中,属性××通过get××()和set××()方法,把参数在整个生命周期内进行传递,这就是属性驱动 代码如下: package org.abu.csdn. ...

  3. struts2 中属性驱动(其实就是struts2 action 中处理 request 的参数【old 方式servlet api 封装数据到javabean中(or beanutils)】),这里属性驱动是新方式

    1.属性驱动 a\  一般的set public class UserAction extends ActionSupport { private String username; private S ...

  4. Struts2(四)属性驱动和模型驱动

    一.概述 所谓模型驱动,就是使用单独的JavaBean实例贯穿整个MVC流程,与之相对应的属性驱动方式,则使用属性作为贯穿MVC流程的信息携带者.属性无法独立存下,它必须依附于一个对象,这个对象就是A ...

  5. strus2中获取表单数据 两种方式 属性驱动 和模型驱动

    strus2中获取表单数据 两种方式 属性驱动 和模型驱动 属性驱动 /** * 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值 * 如果一个属性在对象栈,在页面 ...

  6. Struts2属性驱动与模型驱动

    为什么要使用属性驱动和模型驱动 struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在获 ...

  7. Struts2 属性驱动、模型驱动、异常机制

    模型驱动使用单独的VO(值对象)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果. 一.使用模型驱动 1.login.action采用模型驱动模式实现,采用模型驱动时必 ...

  8. struts2属性Struts2中属性接收参数中文问题和简单数据验证

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 一:如果表单提交数据中有中文时,尽量应用post方式. 需要在Struts. ...

  9. Struts2的学习-属性驱动和模型驱动

    1.新建空项目,并托管到码云 2.设立maven 3.设置pom.xml 4.建包 5.在java包里建立两个类 package com.nf.entity; public class User { ...

随机推荐

  1. Cocos2d-android (01) 创建一个简单的cocos2d应用程序

    下载Cocos2d-android的源代码:cocos2d-android-1 git@github.com:ZhouWeikuan/cocos2d.git 将项目导入到eclipse中.运行实例: ...

  2. iOS学习笔记之回调(二)

    写在前面 上一篇学习笔记中简单介绍了通过目标-动作对实现回调操作:创建两个对象timer和logger,将logger设置为timer的目标,timer定时调用logger的sayOuch函数.在这个 ...

  3. Macbook pro内存升级

    http://support.apple.com/kb/HT1270?viewlocale=zh_CN&locale=zh_CN#link1 https://support.apple.com ...

  4. Spring MVC + Spriing + MyBatis整合,写给新人

    开发环境: 开发工具:MyEclipse 8.6 数据库:MySQL 操作系统:WIN8.1 Jar包: Spirng和SpringMVC版本:3.2.9 MyBatis版本:3.2.8 其他关联Ja ...

  5. VHDL之Port map and open

    编SPI的master控制器,使用公司基本的元件,有些端口用不着,恰巧好二哥(不知年龄的数字组组长,本名Holger)来了,于是请教之,告曰open关键词.后来深感自己VHDL水平太水,下了一本电子书 ...

  6. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  7. javascript里面dom操作和兼容问题汇总

    DOM     增,删,改,查 oUl.children         获取UL的子节点         有length的属性 oUl.children[0]    获取UL第1个子节点     使 ...

  8. 转】windows下使用批处理脚本实现多个版本的JDK切换

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/5209386.html 感谢! 一.JDK版本切换批处理脚本 我们平时在window上做开发的时候,可能需要同时开 ...

  9. Spark RDD概念学习系列之RDD的缓存(八)

      RDD的缓存 RDD的缓存和RDD的checkpoint的区别 缓存是在计算结束后,直接将计算结果通过用户定义的存储级别(存储级别定义了缓存存储的介质,现在支持内存.本地文件系统和Tachyon) ...

  10. [翻译]创建ASP.NET WebApi RESTful 服务(7)

    实现资源分页 本章我们将介绍几种不同的结果集分页方式,实现手工分页,然后将Response通过两个不同的方式进行格式化(通过Response的Envelop元数据或header). 大家都知道一次查询 ...