ognl
一:什么是值栈
1:ValueStack:值栈。其本身的数据结构是一个栈,使用者可以把一些对象存入栈中。然后使用动态的表达式来读取bean的属性。由于值栈中可能有多个对象
值栈会按照对象出栈的顺序依次尝试使用动态的表达式来读取值,知道成功读取值为止。struts2默认使用的是OgnlValueStack,即使用ognl这个动态表达式语言来读取值。
2:在Struts2执行一次请求的过程中,Struts2会把当前的Action对象自动放入值栈。这样,在渲染JSP时,JSP里的代码使用<s:property value="..."/>之类标签中的Ognl表达式
会直接作用于Action对象,从而方便的读取Action的属性。
二:如何获得值栈
1.1在自定义的拦截器中,使用ActionInvocation.getStack()方法。(ActionInvocation是拦截器的方法参数)
1.2在Action类中,让拦截器植入ValueStack或者使用ActionContext.getContext().getValueStack()来获取值栈。
注意:使用ActionContext分配的context的方式是基于线程的,如果使用这种方法,请确保其不出错!
1.3在jsp中,可以使用标签即可获取栈值栈中的数据!
三:如何将对象存入值栈
1.struts2自动存入Action:之前提到,,Struts2在执行一次请求的过程中会把当前的Action对象自动存入值栈中。
2.ModelDrivenInterceptor会存入Action的model属性:如果你使用了Struts2提供的 ModelDrivenInterceptor,则它会把Action对象的getModel()方法得到的对象存入值栈中。此时,值栈最底层为Action类,其次为这个model。
3.在自定义的拦截器中存入值栈:得到值栈对象后调用ValueStack.put(Object object)方法。
4.在Action类中存入值栈:得到值栈对象后调用ValueStack.put(Object object)方法。
5.在JSP中存入值栈:标签<s:push value="..."></s:push>是专门用来在JSP中把指定的value放入值栈的,但value被放入值栈的时间仅在s:push标签内,即程序运行到</s:push>标签处会把value从值栈中移出。另外,还有一些标签比如<s:iterator/>由于其功能的需要也会把一些对象放到值栈中。
代码如下:
通过调试可以发现其中的root对象是以ArrayList的方式存入user对象的!
Stack Context中的数据则存放在Context中其是以map集合的形式来存放数据的。在是用OGNL表达式来访问时需要加上“#”作为前缀。
使用ognl表达式:
1)“#”符号有三种用途
a、访问非根对象(struts中值栈为根对象),eg:OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
名称 作用域
eg:
1-1)parameters :包含当前HTTP请求参数的Map
#parameters.id[0]=>作用相当于request.getParameter("id")
1-2)request:包含当前HttpServletRequest的属性(attribute)的Map
#request.userName=>作用相当于request.getAttribute("userName");
1-3)session:包含当前HttpSession属性(attribute)的Map
#session.userName=>session.getAttribute("userName");
1-4)application:包含当前应用的ServletContext的属性(attribute)的Map
#application.userName=>application.getAttribute("userName");
演示案例:(省略javabean)
1:原始类型和包装类型
action类
- private User user;
- private String message;
- public String execute(){
- setUser(new User());
- getUser().setName("jbit");
- getUser().setAge();
- Address address=new Address();
- address.setCountry("中国");
- address.setCity("北京");
- address.setStreet("长安街");
- getUser().setAddress(address);
- setMessage("展示原始类型和JavaBean");
- return SUCCESS;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- public String getMessage() {
- return message;
- }
- public void setMessage(String message) {
- this.message = message;
- }
展示数据的result.jsp页面
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@taglib uri="/struts-tags" prefix="s" %>
- <%
- 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 'result.jsp' starting page</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="">
- <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:property value="message" default="展示数据" /><br/>
- 姓名:<s:property value="user.name" /><br/>
- 年龄:<s:property value="user.age" /><br/>
- 国家:<s:property value="user.address.country" />
- </body>
- </html>
2:多值类型的数据处理
action类代码:(数组)
- private String[] hobbies;
- private Double[] numbers=new Double[];
- public String execute(){
- System.out.println("hobbies的长度是"+hobbies.length);
- for(int i=;i<hobbies.length;i++){
- System.out.println("hobbies数组中第"+i+"个元素是:"+hobbies[i]);
- }
- System.out.println("numbers的长度是"+numbers.length);
- for(int i=;i<numbers.length;i++){
- System.out.println("numbers数组中第"+i+"个元素是:"+numbers[i]);
- }
- return SUCCESS;
- }
- public String[] getHobbies() {
- return hobbies;
- }
- public void setHobbies(String[] hobbies) {
- this.hobbies = hobbies;
- }
- public Double[] getNumbers() {
- return numbers;
- }
- public void setNumbers(Double[] numbers) {
- this.numbers = numbers;
- }
action类代码:泛型
- private List<String> hobbies;
- private List<Double> numbers;
- private List<User> users;
- public String execute(){
- System.out.println("hobbies的长度是"+hobbies.size());
- for(int i=;i<hobbies.size();i++){
- System.out.println("hobbies数组中第"+i+"个元素是:"+hobbies.get(i));
- }
- System.out.println("numbers的长度是"+numbers.size());
- for(int i=;i<numbers.size();i++){
- System.out.println("numbers数组中第"+i+"个元素是:"+numbers.get(i));
- }
- System.out.println("users的长度是"+users.size());
- for(int i=;i<users.size();i++){
- System.out.println("users数组中第"+i+"个元素是:"+users.get(i).getName());
- }
- return SUCCESS;
- }
- public List<String> getHobbies() {
- return hobbies;
- }
- public void setHobbies(List<String> hobbies) {
- this.hobbies = hobbies;
- }
- public List<Double> getNumbers() {
- return numbers;
- }
- public void setNumbers(List<Double> numbers) {
- this.numbers = numbers;
- }
- public List<User> getUsers() {
- return users;
- }
- public void setUsers(List<User> users) {
- this.users = users;
- }
array.jsp展示数据
- <body>
- <s:form action="ArraysDataTransfer.action">
- <s:textfield name="hobbies" label="爱好:"/>
- <s:textfield name="hobbies" label="爱好:"/>
- <s:textfield name="hobbies" label="爱好:"/>
- <s:textfield name="numbers[0]" label="数字:"/>
- <s:textfield name="numbers[1]" label="数字:"/>
- <s:textfield name="numbers[2]" label="数字:"/>
- <s:submit value="提交"/>
- </s:form>
- </body>
list.jsp展示数据
- <body>
- <s:form action="listDataTransfer">
- <s:textfield name="hobbies" label="爱好:"/>
- <s:textfield name="hobbies" label="爱好:"/>
- <s:textfield name="hobbies" label="爱好:"/>
- <s:textfield name="numbers[0]" label="数字:"/>
- <s:textfield name="numbers[1]" label="数字:"/>
- <s:textfield name="numbers[2]" label="数字:"/>
- <s:textfield name="users.name" label="姓名:"/>
- <s:textfield name="users.name" label="姓名:"/>
- <s:textfield name="users.name" label="姓名:"/>
- <s:submit value="提交"/>
- </s:form>
- </body>
ognl的更多相关文章
- Struts2入门(五)——OGNL和标签库
一.前言 OGNL和标签库的作用,粗暴一点说,就是减少在JSP页面中出现java代码,利于维护. 1.1.OGNL 1.1.1.什么是OGNL? OGNL(Object-Graph Navigatio ...
- Ognl表达式基本原理和使用方法
Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...
- 4. ValueStack 和 OGNL
1. 属性哪来的 当我们通过Action处理完用户请求以后,可以直接在页面中获取到 action 的属性值. 如果我们在页面中尝试遍历四个域中的属性,会发现域中并没有username之类的Action ...
- Struts2中的Ognl
OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整 ...
- Struts2(Ognl)
OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整 ...
- Strust OGNL详解
首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...
- Struts2深入学习:OGNL表达式原理
今天看了ognl表达式,不是很理解,准备以后再回头复习: http://developer.51cto.com/art/201203/322509.htm#case1
- OGNL的使用
访问Action中的普通属性: <s:property value="loginname"/><br/> 访问Action中的对象属性: <s:pro ...
- Struts2的OGNL表达式语言
一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...
- Struts 2的OGNL的根对象
Struts2中的OGNL表达式语言是对Xwork的OGNL的封装.我们要理解一下几点: 1. Struts2中将ActionContext作为OGNL的上下文环境(ActionContext内部含有 ...
随机推荐
- java.net.SocketException: Software caused connection abort: socket write error
用Java客户端程序访问Java Web服务器时出错: java.net.SocketException: Software caused connection abort: socket write ...
- int与Integer的爱恨情仇
int作为java中元老级的数据类型,可谓无处不在,自从jdk5诞生了Integer,从此不在孤单. 为什么要设计Integer呢?它与int有什么区别? 一.Integer是int的包装类型,是引用 ...
- (Spring4 json入门)Spring4+SpringMVC+页面数据发送与接收(json格式)
jar包(Maven仓库): Spring4 jar包(Maven仓库): 在测试过程中我查看了网上的一些教程,但是那些教程都是在Spring3环境下的,Spring3和Spring4解析json需要 ...
- Lind.DDD.Messaging框架通讯组件介绍
回到目录 大 家好,今天有时间来介绍一下Lind.DDD框架里的消息机制,消息发送这块一般的实现方法是将Email,SMS等集成到一个公用类库里,而本身 Email和SMS没什么关系,它们也不会有什么 ...
- Java Class.cast方法
1.Java api public T cast(Object obj); Casts an object to the class or interface represented 解释的比较笼统, ...
- jquery弹出下拉列表插件(实现kindeditor的@功能)
这几天有个工作需求,就是在富文本输入区域(kindeditor)可以有@功能,能够容易提示用户名的(像在qq群组@人一样).在网上找了一个叫bootstrap-suggest的插件,却不能满足我的需求 ...
- Oracle常用SQL查询(2)
三.查看数据库的SQL 1 .查看表空间的名称及大小 select t.tablespace_name, round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...
- jQuery - 全国省市县三级联动
最近有空用jquery做了一个全国省市县的三级联动,在以后或许可以用的到 ,遗憾的是我还没用封装,等有空看能不能封装成一个插件 废话不多说,贴上代码: <!doctype html> &l ...
- HTML5学习笔记二 HTML基础
一.HTML 标题 HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的. <h1>标题一</h1> <h2>标题二& ...
- UI笔记
tableView 自定义cell 还有之前的轮播图整理