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,源码如下所示:

 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(, "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(, "jack"));
// 移除栈顶元素
vs.pop(); // 如何存储? map结构存储
vs.set("user1", new User(, "张三"));
vs.set("user2", new User(, "李四")); 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之OGNL和struts2标签库和ValueStack对象的更多相关文章

  1. Struts2 标签库详解2

    Struts2标签库 包括: OGNL Struts2标签分类 控制标签 :(if, elseif,else, iterator, append, merge, generator, subset, ...

  2. struts2标签库----控制标签详解

         前面几篇文章我们介绍了有关struts2的基本内容,简单理解了整个框架的运作流程.从本篇开始我们逐渐了解和使用struts2为我们提供的标签库技术,使用这些标签可以大大降低我们表现层的开发难 ...

  3. Struts2 标签库详解

    Struts2标签库 包括: OGNL Struts2标签分类 控制标签 :(if, elseif,else, iterator, append, merge, generator, subset, ...

  4. struts2学习笔记(2)——简单的输入验证以及标签库的运用

    struts2自带了一些标签库,运用好这些标签库会减少开发周期. 1.struts2标签库是在哪定义的? struts2标签库定义在struts2-core-2.1.8.jar这个文件中,具体在这个j ...

  5. java 标签库(核心,xml,sql ,国际化,函数)

    java标签库分分为上述几种,一般经常使用的是核心和函数,接下来会分别讲解这几种,和常见的用法. 一般标签库会和el表达式一起使用,所以在学习标签库前最后也学习下el表达式的使用. 导入后展开 可以从 ...

  6. Struts2入门(五)——OGNL和标签库

    一.前言 OGNL和标签库的作用,粗暴一点说,就是减少在JSP页面中出现java代码,利于维护. 1.1.OGNL 1.1.1.什么是OGNL? OGNL(Object-Graph Navigatio ...

  7. Struts2的标签库(二)——OGNL表达式

    Struts2的标签库(二) --OGNL表达式 1.Struts2中的OGNL表达式增加了ValueStack的支持. 注:ValueStack--实际上是一个容器对象,该对象在启动Struts2框 ...

  8. 【基于初学者的SSH】struts2 值栈的详解与struts2标签库+ognl表达式

    一:什么是值栈:struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值 特点:先进后出,最上面的元素叫做栈顶,也叫压栈. <s:debug></s:debug& ...

  9. 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】

    一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...

随机推荐

  1. Java的参数传递是「按值传递」还是「按引用传递」?

    JAVA传递的只有值,.传递的都是栈里的的值,只是有些栈里面的是值.有的是内存地址.(原文传递的都是栈里的的值有误,局部变量在栈中,成员变量在堆中,类变量(静态变量和常量)在方法区中,可以看做本文的变 ...

  2. xshell访问Ubuntu16.04显示乱码(即使在xshell设置了utf8)解决方案

    一开始问题是:(无法显示,也无法输入) 然后使用: locale -a 查看服务器安装的全部编码: (且服务器使用的 LANG=C) 只要用: 即可显示中文.也可以输入中文.

  3. 电脑kail linux 连接手机Nethunter,手机和电脑互传文件

    1.开启nethunter的ssh 修改/etc/ssh/sshd_config 参考:解决kali linux 开启ssh服务后连接不上的问题 2.如果在手机终端修改不了(我的就是怎么也改不了),可 ...

  4. ROS学习笔记(二) # ROS NodeHandles

    1. 自动启动和关闭 ros::NodeHandle nh: 这段代码执行之后,如果内部节点还没有启动,ros::NodeHandle 会启动这个节点:一旦所有的 ros::NodeHandle 实例 ...

  5. ubuntu14.04 安装 CUDA 7.5 / CUDA 8.0

    原文转自:http://blog.csdn.net/masa_fish/article/details/51882183 CUDA7.5和CUDA8.0的安装过程是一毛一样的.所以如果安装CUDA8. ...

  6. 【ARTS】01_09_左耳听风-20190107~20190113

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  7. 【Mysql sql inject】【入门篇】SQLi-Labs使用 part 2【12-14】

    这几关主要是考察POST形式的SQLi注入闭合 ## Less-12 - POST - Error Based- Double quotes- String ### 1)知识点 主要考察报错注入中的双 ...

  8. springboot系列七:springboot 集成 MyBatis、事物配置及使用、druid 数据源、druid 监控使用

    一.MyBatis和druid简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.M ...

  9. sklearn 岭回归

    可以理解的原理描述: [机器学习]岭回归(L2正则) 最小二乘法与岭回归的介绍与对比 多重共线性的解决方法之——岭回归与LASSO

  10. Android设计模式-观察者模式

    原文地址 http://blog.csdn.net/qq_25806863/article/details/69218968 观察者模式是一种使用频率非常高的设计模式,最常用的地方就是订阅-发布系统. ...