Struts2对Ognl的支持

一. 写作背景

   由于工作性质的变化,最近一直在研究struts2,从源码到各个技术点的分析,突然之间发现以前对struts2的ognl这一块的知识覆盖的还不是很全面。再加上笔者身处在深圳这个城市,这些天来一直高温不断,人显得特别的烦躁不安,唯有技术(当然个人爱好还是很广泛的,例如溜冰、篮球、气枪打气球等)能让笔者从燥热中平静下来,故花上几个小时整理了这篇博客,若有失误之处,希望各位读者能够及时的指正。阅读本篇博客之前请先阅读笔者的另外一篇博客《OGNL》。笔者写博客不太喜欢说太多与技术无关的文字,那么直接上代码吧。

二. struts2之ognl

  struts2将ActionContext作为整个Ognl的上下文对象,然后将ValueStack(值栈)作为ActionContext的根对象,用户每次访问的Action放入到ValueStack的栈顶的位置, 故而我们可以直接访问Action中的属性。

  定义如下Action:

public class OgnlAction extends ActionSupport{

    private List<Student> list;

    public List<Student> getList() {
return list;
} public void setList(List<Student> list) {
this.list = list;
} public Student student = new Student(); public String execute(){
list = new ArrayList<Student>();
Student s1 = new Student();
s1.setAge(10);
s1.setName("zhangsan");
s1.setBirthday(new Date()); Student s2 = new Student();
s2.setName("lisi");
s2.setAge(20);
s2.setBirthday(new Date()); list.add(s1);
list.add(s2); ActionContext ctx = ActionContext.getContext();
ctx.getApplication().put("msg", "applicationMsg");
ctx.getSession().put("msg", "sessionMsg"); HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("msg", "requestMsg"); return SUCCESS;
}
}

在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>Insert title here</title>
</head>
<body>
<h2>访问Ognl上下文和Action的上下文</h2>
<p>request.msg: <s:property value="#request.msg"/>或者${request.msg }或者${requestScope.msg }</p>
<p>parameters.msg: <s:property value="#parameters.msg"/> </p>
<p>session.msg: <s:property value="#session.msg"/> </p>
<p>application.msg: <s:property value="#application.msg"/></p>
<p>attr.msg:<s:property value="#attr.msg"/>或者${attr.msg}</p> <h2>遍历list</h2>
<table>
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>生日</th>
</tr>
</thead>
<tbody>
<s:if test="list.size > 0"> <!-- list取的是OgnlAction中的list成员变量, size是ognl的伪属性 -->
<!-- 在使用s:iterator的时候,遍历到每个对象的时候会临时的放到栈顶的位置,因此可以直接取其属性 -->
<s:iterator value="list">
<tr>
<td>${name }</td>
<td>${age }</td>
<td><s:date name="birthday" format="yyyy-MM-dd"/> </td>
</tr>
</s:iterator>
</s:if>
<s:else>
<tr>
<td colspan="3">没有任何的数据</td>
</s:else>
</tbody>
</table> <h2>Checkbox</h2>
<!-- checkboxlist中的list表示从值栈中获取的list集合,
name表示checkbox的name,
label是展示在checkbox前的信息,
listKey是checkbox的value信息,
listValue是checkbox展示给用户看的信息
value中是集合,表示被选中的值
-->
<!-- list="list",取的是OgnlAction中的list这个成员变量,当访问OgnlAction的时候,会将该Action压入到ValueStack的栈顶的位置,
而ValueStack又是ActionContext的根对象,因此可以直接获取,不用# -->
<s:checkboxlist list="list" name="person" listKey="age" listValue="name" label="Student" value="{10}"></s:checkboxlist><br>
<s:set name="map" value="#{'aa':'AA', 'bb':'BB', 'cc':'CC', 'cc':'DD'}"></s:set> <!-- 自定一个Map对象,对象名为map -->
<!-- 访问上一行定义的map对象 -->
<s:checkboxlist list="#map" label="TEST" listKey="key" listValue="value" name="test"></s:checkboxlist><br>
<s:checkboxlist list="#{'xx':'XX', 'yy':'YY', 'zz':'ZZ'}" label="Test" name="test" listKey="value" listValue="key"></s:checkboxlist> <h2>以select的方式展示</h2>
<!--
s:select中,list表示从值栈中获取的值
value表示被选中的值
multiple="true" 表示多选
listKey 表示option的value
listValue表示展示给用户的信息
Label要展示在select前的信息
name是select的name
-->
<s:select list="list" value="{10}" multiple="true" listKey="age" listValue="name" label="Student" name="student"></s:select><br>
<s:select list="#map" listKey="key" listValue="value" label="TEST" name="test" headerKey="-1" headerValue="请选择"></s:select><br>
<s:select list="#{'xx':'XX', 'yy':'YY', 'zz':'ZZ'}" label="test" name="test" listKey="key" listValue="value" headerKey="-1" headerValue="请选择"></s:select>
<br>
<br>
<hr/> <h2>过滤,投影与集合</h2>
  <!-- 遍历年龄大于或等于20岁的所有的人 -->
<s:iterator value="list.{? age >= 20}">
${name}---${age}--<s:date name="age" format="yyyy-MM-dd"/><br>
</s:iterator>
<br>
<!-- 查找list中的名字为张三的第一个人的姓名 -->
<p>查找姓名是zhangsan的人的name: <s:property value="list.{^ name='zhangsan'}[0].name"/> </p>

<!-- 查找list中年龄大于20岁的最后一个人的年龄 -->
<p> 查找年龄大于等于20岁的最后一个人的age:
<s:property value="list.{$ age >= 20}[0].age"/>
</p> <p>
查找年龄大于20岁的所有的人姓名(返回一个集合):
<s:property value="list.{? age >= 20}.{name}"/>
</p>
<hr/> <h2>iterator的遍历</h2>
<s:iterator begin="1" end="10" step="2" var="i" status="s">
${i}-------${s.count}----${s.index}---${s.odd}--${s.even }---${s.last}---${s.first }<br>
</s:iterator>
<s:iterator value="#map" var="m">
<!-- 遍历的第一种方式
<s:property value="key"/>----<s:property value="value"/><br>
-->
<!-- 遍历的第二种方式
${key}----${value }<br>
-->
<!-- 遍历的第三种方式
${m.key }----${m.value }<br>
-->
<!--第四种方式
<s:property value="#m.key"/>----<s:property value="#m.value"/><br>
-->
<s:a href="hello?id=%{#m.key}">${m.value}</s:a><br> <!-- 使用%{}的目的是将括号中的内容强制作为ognl表达式来使用 -->
</s:iterator> <hr/>
<h2>取map的值</h1>
<s:property value="#map['aa']"/>
</body>
</html>

上一篇:ognl语言

Struts2对Ognl的支持的更多相关文章

  1. Struts2的OGNL表达式语言

    一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...

  2. Struts2之OGNL

    一.OGNL是什么? OGNL(Object-Graph Navigation Language)对象图导航语言,是一种表达式语言,它可以 1.遍历对象的结构图 2.存取对象的属性(实例属性和静态属性 ...

  3. Struts2的OGNL标签详解

    一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...

  4. struts2之OGNL和struts2标签库和ValueStack对象

    OGNL简介: (1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目.  struts2框架默认就支持Ognl表达式语言(所以 ...

  5. 【Struts2】Ognl与ValueStack

    一.OGNL 1.1 概述 1.2 OGNL 五大类功能 1.3 演示 二.ValueStack 2.1 概述 2.2 ValueStack结构 2.3 结论 2.3 一些问题 三.OGNL表达式常见 ...

  6. Struts2之OGNL与ValueStack

    时间:2017-1-12 12:02 --OGNL1.OGNL表达式是什么    OGNL的全称是Object-Graph Navigation Language的缩写,中文名是对象图导航语言,它是一 ...

  7. Struts2对AJAX的支持

    一.简介        struts2确实一个非常棒的MVC框架.这里部分记述一下struts2对AJAX的支持.实现AJAX有两种方式,一种是使用原生的javascript代码实现,一种是使用第三方 ...

  8. 2018.11.25 struts2与OGNL表达式的结合(高级)

    两者的结合原理 底层源码分析 栈原理 先进后出 我们的valuestack其实是一个接口 在实现类中有这个参数 CompoundRoot的类继承的是ArrayList,具体实现弹栈和压栈的方法具体实现 ...

  9. JavaWeb_(Struts2框架)Ognl小案例查询帖子

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

随机推荐

  1. Minimum Path Sum [LeetCode]

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  2. RabbitMq、ActiveMq、ZeroMq 和 kafka 比较

    MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求.下面我列出这些MQ之间的对比数据和资料.第一部分 ...

  3. Java数据库操作

    一.JDBC 1.JDBC Java数据库连接,用于Java程序中实现数据库操作功能,java.sql包中提供了执行SQL语句,访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口及类. 2. ...

  4. C# 自动运行代码 (创建windows 服务的形式 )

    本文转载自:http://blog.csdn.net/csethcrm/article/details/17917721 1.      新建项目 1.1 右键解决方案 – 添加 – 新建项目 1.2 ...

  5. BZOJ2095 [Poi2010]Bridges

    首先二分答案...然后这张图变成了有一些有向边,有一些无向边 然后就是混合图欧拉回路的判断 我们知道如果是有向图,它存在欧拉回路的等价条件是所有点的出度等于入度 对于混合图...先不管有向边,把无向边 ...

  6. 1172. Ship Routes

    http://acm.timus.ru/problem.aspx?space=1&num=1172 水题DP   大整数直接上java 代码: import java.math.BigInte ...

  7. js事件捕获,事件冒泡,事件委托以及DOM事件流

    一:DOM事件流: 事件流是从页面接收事件的顺序,DOM2级事件规定事件流包括三个阶段: ①事件捕获阶段:用意在于事件达到目标之前捕获它,在事件捕获阶段事件流模型:document→html→body ...

  8. (转)深入理解JavaScript 模块模式

    深入理解JavaScript 模块模式 (原文)http://www.cnblogs.com/starweb/archive/2013/02/17/2914023.html 英文:http://www ...

  9. 团队开发——冲刺2.b

    冲刺阶段二(第二天) 1.昨天做了什么? 收集游戏图片:开始.暂停.继续.重新开始.退出……为了界面的后期美工做准备. 2.今天准备做什么? 把“开始游戏”.“退出游戏”.“取消”等文字按钮加工成游戏 ...

  10. 在线生成CSS样式和兼容的字体格式

    http://www.fontsquirrel.com/tools/webfont-generator 在线生成CSS样式和兼容的字体格式.