Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理。

值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言。

值栈:ValueStack一种数据结构,操作数据的方式为:先进后出

OGNL : Object-GraphNavigation Language(对象图形导航语言)将多个对象的关系使用一种树形的结构展现出来,更像一个图形,那么如果需要对树形结构的节点数据进行操作,那么可以使用 对象.属性 的方式进行操作,OGNL技术底层采用反射实现。

一:数据的提交方式

1,<form>表单提交

<form action="/user/login_Login.action" method="post" >
用户代码:<inputname="usercode" type="text" ><br>
用户密码:<inputname="userpswd" type="password"><br>
<inputtype="submit" value="登录">
</form>

2,url的方式

http://localhost.egov.com/user/login_Login.action?usercode=admin&userpswd=admin

3,超链接

<a href="/user/delete.action?usercode=admin">删除</a>  

4,异步提交

ajax异步提交数据

二:数据存储

数据的存储依赖于框架提供的拦截器功能,拦截器可以对请求进行拦截,获取所有的请求参数,循环遍历设置到值栈中。框架默认将被请求的Action对象存放到值栈的栈顶。Struts2框架提供三种方式将参数存入值栈

1,属性驱动模式

Action中需要提供参数名称的set方法,框架会通过拦截器将请求参数获取到之后,会循环遍历将参数设置到值栈(栈顶对象)中。

<input name="usercode" type="text" >
Ognl.setValue("usercode",action,"admin");//此时根对象是action

2,模型驱动模式

必须要实现模型驱动接口,属于侵入性开发方式,不推荐使用

需要定义数据模型的类,将属性封装到数据模型类中,Action中只需要定义模型对象的类型属性(必须创建对象赋值),模型对象的get/set属性并不是必须的。

Action类需要实现ModelDriven接口,重写getModel()方法。

<inputname="usercode" type="text" ><br>表单依然是模型对象的属性名称作为参数名称
Ognl.setValue("usercode",user,"admin");//此时根(栈顶)对象是user对象

3,域驱动模式

与属性驱动的原理是类似,也是通过参数拦截器,将请求参数获取后循环设置到值栈中。

在Action对象中定义模型对象属性,并提供get/set方法;

在表单元素中增加模型对象属性的名称

<inputname="user.usercode" type="text" >
Ognl.setValue("user.usercode",action,"admin");//此时根对象是action

三:数据的传递

框架将Http对象和包装后的Map集合对象都存放到ActionContext上下文对象集合中。所以可以根据ActionContext来获取想要使用的对象。

1,获取HTTP对象

   ActionContext ac = ActionContext.getContext(); //上下文对象相当于request范围
(1) HttpServletRequest request =(HttpServletRequest)ac.get(StrutsStatics.HTTP_REQUEST); HttpSession session = request.getSession(false); ServletContext application = session.getServletContext();
ServletContext application = ac.get(StrutsStatics.SERVLET_CONTEXT); (2) HttpServletRequest request = ServletActionContext.getRequest(); (推荐使用)
HttpServletResponse response =ServletActionContext.getResponse(); (3) Action类实现ServletRequestAware,或ServletResponseAware (属于侵入性开发方式,不推荐使用) private HttpServletRequest request ; //set注入
private HttpServletResponse response ; @Override
public void setServletRequest(HttpServletRequest request) { //实现该方法,该方法由框架调用,传递参数。
this.request= request ;
} @Override
public void setServletResponse(HttpServletResponse response) {
this.response= response ;
}

2,获取Map集合

 ActionContext ac = ActionContext.getContext();

  Mapsession = ac.getSession();
Mapsession2 =(Map)ac.get("session");
Mapsession3=(Map)ac.get(ActionContext.SESSION); Mapapplication = ac.getApplication()
Mapapplication = ac.get(ActionContext.APPLICATION);
Mapapplication = ac.get("application");

3, 获取值栈对象以及参数集合对象

 ActionContext ac = ActionContext.getContext();
ValueStack vs = ac.getValueStack(); Map paramts = ac.getParameters();

四:数据的显示

用El表达式的形式,取request对象中的值

  ${requestScope.username }

  而这种表达式的方式可以表示成java代码的方式:

  <%
Stringusername =(String)request.getAttribute("username");//被重写的方法,底层是通过ognl查询值栈中的数据
out.print(username);
%>

从request返回取数据,实质上底层是通过Ognl语言操作值栈中的数据。 ActionContext对象的集合和OgnlValueStack值栈的集合为同一个集合对象,所以从值栈的Map集合中取数据,就相当于从ActionContext上下文中取数据。

Struts2(3) —— 数据处理的更多相关文章

  1. java之struts2的数据处理

    这里的数据处理,指的是页面上的数据与Action中的数据的处理. struts2中有3种方式来接收请求提交的数据.分别是:属性驱动方式.对象驱动方式.模型驱动方式 1. 属性驱动方式 要求页面中的表单 ...

  2. struts2 之 struts2数据处理

    开门见山,struts2的数据处理总结: 1. 在servlet中,如果要获取页面提交的数据要使用requerst.getParameter方法来获取,并且每次需要进行相关的类型转换工作,数据的获取及 ...

  3. 浅谈Struts2(三)

    一.Struts2收集client的参数 核心思路: <form method="post" action="XXXX"> <input ty ...

  4. java框架学习系列

    这篇文章的目的主要是作为一个框架学习的索引,方便查找及顺序学习 一.struts2学习 1. java之struts框架入门教程 2. java之struts2的执行流程讲解 3. java之stru ...

  5. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  6. struts2数据处理的几种方式

    package com.loaderman.c_data; import java.util.Map; import javax.servlet.ServletContext; import com. ...

  7. Struts2中的数据处理的三种方式对比(Action中三种作用域request,session,application对象)

    1:在Action中如何获得作用域(request,session,application)对象: 取得Map(键值对映射集)类型的requet,session,application; 对数据操作的 ...

  8. 深入浅出Struts2+Spring+Hibernate框架

    一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...

  9. Struts2入门(四)——数据输入验证

    一.前言 1.1.什么是输入验证?为什么需要输入验证? 在上一篇文章中,我们学习了数据类型转换,我们提到了表示层数据处理的两个方法,也提到了用户输入数据需要进行类型转换才能得到我们想要的数据,那么,我 ...

随机推荐

  1. C语言的标准输入输出

    1. 标准输入输出 标准输入.输出主要由缓冲区和操作方法两部分组.缓冲区实际上可以看做内存中的字符串数组,而操作方法主要是指printf.scanf.puts.gets,getcha.putcahr等 ...

  2. DDD 主题交流会总结及计划

    思维碰撞才能更加进步 2015年5月16日(上周六),我们举行了一次 DDD 主题的交流会,参会者主要是 ENode 群友.以及部分园友,为什么要搞这次交流会?原因很简单,就是希望可以提供对 DDD ...

  3. 项目中遇到的Integer问题--转

    Integer类型值相等或不等分析 http://www.cnblogs.com/zzllx/p/5778470.html 看到博客园一位博友写的面试问题,其中一题是 Integer a = 1; I ...

  4. SSH整合时执行hibernate查询报错:java.lang.ClassCastException: com.ch.hibernate.Department_$$_javassist_0 cannot be cast to javassist.util.proxy

    今天在整合ssh三个框架时,有一个功能,是查询所有员工信息,且员工表和部门表是多对一的映射关系,代码能正常运行到查询得到一个List集合,但在页面展示的时候,就报异常了, java.lang.Clas ...

  5. 【Java】记录一次代码优化

    前不久的项目时间紧张,为了尽快完成原型开发,写了一段效率相当低的代码. 最近几天闲下来,主动把之前的代码优化了一下:)   标签:Java.Mybatis.MySQL 概况:本地系统从另外一个系统得到 ...

  6. Mybatis高级查询之关联查询

    learn from:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps 关联查询 准备 关联结果查询(一对一) resul ...

  7. 微信浏览器是移动端的IE6?微信升级内核后Html5和CSS3兼容性总结

    今年4月,自从微信浏览器X5 升级Blink内核之后,各前端社区一片高潮,仿佛看到了前端er,眼含热泪进而抱头痛头的说:终于可以不用兼容这"移动端的IE6 "了,可以早点回家了!! ...

  8. 【Win10开发】自定义标题栏

    UWP 现在已经可以自定义标题栏了,毕竟看灰色时间长了也会厌烦,开发者们还是希望能够将自己的UI做的更加漂亮,更加与众不同.那么废话不多说,我们开始吧! 首先要了解ApplicationViewTit ...

  9. jQuery点击图片弹出放大特效下载

    效果体验:http://hovertree.com/texiao/jqimg/1/ 效果图: 代码如下: <!DOCTYPE html> <html> <head> ...

  10. touchstart,touchmove,touchend触摸事件的小小实践心得

    近段时间使用html5开发一个公司内部应用,而触摸事件必然是移动应用中所必须的,刚开始以为移动设备上或许也会支持鼠标事件,原来是不支持的,好在webkit内核的移动浏览器支持touch事件,并且打包成 ...