struts2之OGNL和struts2标签库和ValueStack对象
2017-03-07 16:20
627 查看
OGNL简介:
(1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。
struts2框架默认就支持Ognl表达式语言(所以struts必须引用的包:ognl.jar);
(2)struts2的ognl的作用:页面取值使用;
(3)OGNL和EL的区别:
EL表达式语言:用于页面取值,jsp页面取值的标准(默认可以直接使用,应用范围更加广泛);
OGNL表达式语言:struts2标签默认支持的表达式语言,必须配置struts标签使用,不能离开struts2标签直接使用;
(4)OGNL 有一个上下文(Context)概念,[OgnlContext对象:OgnlContext对象是ognl表达式语言的核心];
其实上下文就是一个MAP结构,它实现了 java.utils.Map 的接口。
(5)ognl表达式语言取值,取根元素的值,不用带#符号;ognl表达式语言取值,取非根元素的值,需要带#符号;
用一个OGNL和struts标签结合的实例演示一下struts的标签的强大功能:
1:第一还是引入struts2核心包,省略
2:创建一个实体类,用于测试显示在页面的信息,如User.java,源码如下所示:
3:创建完成实体类之后就可以开始开发action,如OgnlAction.java,源码如下所示:
4:开发完action,配置struts.xml文件,这里使用主次配置,所以这里配置ognl.xml,然后在struts.xml文件中引入ognl.xml配置文件即可:
5:最后书写ognl.jsp显示页面,用于显示信息,源码如下所示:
运行效果如下所示:
革命尚未成功,OGNL ko , go!!!
6:ValueStack, 即值栈对象(根元素的值存储在root中,非跟元素的值存储在context中)。
(1):值栈对象是整个struts数据存储的核心,或者叫中转站。
(2):用户每次访问struts的action,都会创建一个Action对象、值栈对象、ActionContext对象; 然后把Action对象放入值栈中; 最后再把值栈对象放入request中,传入jsp页面。
(3):(key: struts.valueStack); 开发者只需要通过ActionContext对象就可以访问struts的其他的关键对象。 (ActionContext是给开发者用的,便于学习与使用。)
(4)值栈的根元素和非根元素如何存储的关系:
(5)值栈操作根元素和非根元素的如何操作(ActionContext.getContext() = #,取值的时候理解):
(6):页面获取元素的方法:
(1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。
struts2框架默认就支持Ognl表达式语言(所以struts必须引用的包:ognl.jar);
(2)struts2的ognl的作用:页面取值使用;
(3)OGNL和EL的区别:
EL表达式语言:用于页面取值,jsp页面取值的标准(默认可以直接使用,应用范围更加广泛);
OGNL表达式语言:struts2标签默认支持的表达式语言,必须配置struts标签使用,不能离开struts2标签直接使用;
(4)OGNL 有一个上下文(Context)概念,[OgnlContext对象:OgnlContext对象是ognl表达式语言的核心];
其实上下文就是一个MAP结构,它实现了 java.utils.Map 的接口。
(5)ognl表达式语言取值,取根元素的值,不用带#符号;ognl表达式语言取值,取非根元素的值,需要带#符号;
用一个OGNL和struts标签结合的实例演示一下struts的标签的强大功能:
1:第一还是引入struts2核心包,省略
2:创建一个实体类,用于测试显示在页面的信息,如User.java,源码如下所示:
package com.bie.ognl; /** * @author BieHongLi * @version 创建时间:2017年3月7日 下午8:45:27 * */ public class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User(int id, String name) { super(); this.id = id; this.name = name; } }
3:创建完成实体类之后就可以开始开发action,如OgnlAction.java,源码如下所示:
package com.bie.ognl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** * @author BieHongLi * @version 创建时间:2017年3月7日 下午8:43:00 * */ public class OgnlAction extends ActionSupport{ private static final long serialVersionUID = 1L; @Override public String execute() throws Exception { //测试迭代标签 List<User> list=new ArrayList<User>(); Map<Integer, User> map=new HashMap<Integer, User>(); //初始化 for(int i=1;i<11;i++){ User user=new User(i,"张三"+i); list.add(user); map.put(user.getId(), user); } //保存list信息 ActionContext.getContext().getContextMap().put("list", list); //保存map信息 ActionContext.getContext().getContextMap().put("map", map); return "success"; } }
4:开发完action,配置struts.xml文件,这里使用主次配置,所以这里配置ognl.xml,然后在struts.xml文件中引入ognl.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="ognlpackage" extends="struts-default"> <action name="ognl" class="com.bie.ognl.OgnlAction"> <result name="success">ognl.jsp</result> </action> </package> </struts>
5:最后书写ognl.jsp显示页面,用于显示信息,源码如下所示:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ognl显示信息的页面</title> <style type="text/css"> .odd{background-color:pink;} .even{background-color:yellow;} </style> </head> <body> <h1>1:list显示信息</h1> <table cellpadding="5" cellspacing="10"> <tr> <th>编号</th> <th>姓名</th> <th>奇偶行</th> </tr> <s:iterator value="#request.list" var="user" status="us"> <tr class=<s:property value="#us.even?'even':'odd'"/>> <td><s:property value="#user.id"/></td> <td><s:property value="#user.name"/><br/></td> <td><s:property value="#us.even" /></td> </tr> </s:iterator> </table> <h1>1:迭代map信息</h1> <table cellpadding="5" cellspacing="10"> <tr> <th>编号</th> <th>编号2</th> <th>姓名</th> <th>奇偶行</th> </tr> <s:iterator value="#request.map" var="Muser" status="mu"> <tr class=<s:property value="#us.even?'even':'odd'"/>> <td><s:property value="#Muser.value.id"/></td> <!-- 迭代编号的两种方式 --> <td><s:property value="#Muser.key"/></td> <td><s:property value="#Muser.value.name"/><br/></td> <td><s:property value="#mu.even" /></td> </tr> </s:iterator> </table> </body> </html>
运行效果如下所示:
革命尚未成功,OGNL ko , go!!!
6:ValueStack, 即值栈对象(根元素的值存储在root中,非跟元素的值存储在context中)。
(1):值栈对象是整个struts数据存储的核心,或者叫中转站。
(2):用户每次访问struts的action,都会创建一个Action对象、值栈对象、ActionContext对象; 然后把Action对象放入值栈中; 最后再把值栈对象放入request中,传入jsp页面。
(3):(key: struts.valueStack); 开发者只需要通过ActionContext对象就可以访问struts的其他的关键对象。 (ActionContext是给开发者用的,便于学习与使用。)
package com.bie.lesson09; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.util.ValueStack; /** * @author Author:别先生 * @date Date:2017年9月23日 上午11:18:51 * * struts的数据流转,如何从后台到页面 */ public class OgnlAction extends ActionSupport{ /** * */ private static final long serialVersionUID = 1L; @Override public String execute() throws Exception { //获取值栈对象,方式一: HttpServletRequest request = ServletActionContext.getRequest(); ValueStack vs = (ValueStack) request.getAttribute("struts.valueStack"); //获取值栈对象,方式二: ActionContext ac = ActionContext.getContext(); ValueStack vs2 = ac.getValueStack(); System.out.println(vs == vs2); return SUCCESS; } }
(4)值栈的根元素和非根元素如何存储的关系:
(5)值栈操作根元素和非根元素的如何操作(ActionContext.getContext() = #,取值的时候理解):
package com.bie.lesson09; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.util.ValueStack; /** * @author Author:别先生 * @date Date:2017年9月23日 上午11:18:51 * * struts的数据流转,如何从后台到页面 */ public class OgnlAction extends ActionSupport{ /** * */ private static final long serialVersionUID = 1L; // 全局元素,根元素值 private User user = new User(1, "tom"); @Override public String execute() throws Exception { ActionContext ac = ActionContext.getContext(); //映射数据 //ac.getContextMap().put("request_data", "request_data"); // 数据存储request @SuppressWarnings("unchecked") Map<String,Object> map = (Map<String, Object>) ac.get("request"); map.put("request_data", "request_data"); map.put("cn", "China"); ac.getSession().put("session_data", "session_data"); ac.getApplication().put("application_data", "application_data"); // 二、值栈对象的存储数据的原理 ValueStack vs = ac.getValueStack(); /***************操作根元素的几种方法*****************/ // 设置数据: 入栈 // 栈顶 //vs.getRoot().push(new User(2, "jack")); vs.push(new User(2, "jack")); // 移除栈顶元素 vs.pop(); // 如何存储? map结构存储 vs.set("user1", new User(3, "张三")); vs.set("user2", new User(4, "李四")); System.out.println(vs); return SUCCESS; } }
(6):页面获取元素的方法:
<?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="ognlPackage" extends="struts-default"> <action name="ognl" class="com.bie.lesson09.OgnlAction"> <result name="success">success.jsp?userName=${#request.request_data}</result> </action> </package> </struts>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>struts2 hello </title> </head> <body> <h1>hello world struts2</h1> <h1>${requestScope.request_data }</h1> <h1>${sessionScope.session_data }</h1> <h1>${applicationScope.application_data }</h1> <!-- 页面: 必须要拿到ValueStack --> <h1>根元素的值:</h1> <s:property value="user.id"/><br/> <s:property value="user.name"/><br/> <s:property value="user.address"/><br/> <s:property value="user.address.provice"/><br/> <s:property value="user.address.city"/><br/> <br/><br/> <!-- 非根元素的值 --> <s:property value="#request.cn"/><br/> <s:property value="#session.session_data"/><br/> <s:property value="#application.application_data"/> <br/><br/> <!-- 自动找request/session/application,找到后立刻返回 --> <s:property value="#attr.cn"/><br/> <s:property value="#attr.session_data"/><br/> <s:property value="#attr.application_data"/><br/> <br/><br/> <!-- 获取请求的参数数据 --> <s:property value="#parameters.userName"/> <!-- struts的调试标签:可以观测值栈数据 --> <s:debug></s:debug> </body> </html>
package com.bie.lesson09; /** * @author Author:别先生 * @date Date:2017年9月23日 下午5:20:46 * * */ public class Address { private String provice; private String city; public String getProvice() { return provice; } public void setProvice(String provice) { this.provice = provice; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public Address(String provice, String city) { super(); this.provice = provice; this.city = city; } public Address() { super(); } }
相关文章推荐
- Struts2中ActionContext、Ognlcontext、OgnlValueStack对象关系图,ognl表达式根元素分析
- 3.11.3: Struts2的标签库---Struts2的ognl表达式语言
- struts2中几个核心的组件ActionContext、ValueStack、OGNL表达式
- Struts2知识点回顾(八)OGNL与ValueStack
- Struts2中OGNL,valueStack,stackContext的学习
- struts2 OGNL ValueStack概念理解 # % $ 的区别
- Struts2 学习系列 (4) ValueStack和OGNL
- struts2获取jsp内置对象和ValueStack对象方法
- Struts2中OGNL,valueStack,stackContext的学习
- 3.11.4: Struts2的标签库---ognl中的集合操作
- Struts2_ValueStack,OGNL详解(转)
- Struts2 OGNL valueStack琐碎总结
- Web框架梳理:第一章:Struts2入门、传值、分页、对象、值栈、OGNL、响应方式、标签、拦截器
- Struts2 ValueStack & ActionContext & OGNL 关系小结
- struts2之valueStack(OGNL) (总结)
- Struts2 使用OGNL表达式访问ENUM对象
- Struts2-Ognl表达式与ValueStack
- 为何使用EL表达式能够访问valueStack中对象的属性、采用OGNL表达式创建List/Map集合对象
- OGNL(Object-Graph Navigation Language对象图定位语言)和struts2标签
- 关于Struts2中的ValueStack,ActionContext,OgnlContext的理解之二:Struts2中的OGNL