OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。中文名是对象图导航语言,我们通常叫做S标签。

        那么,怎么在一个jsp页面中导S标签呢?只要在jsp页面的顶部写上这行代码:<%@ taglib uri="/struts-tags" prefix="s"%>,就可以将S标签导入页面中使用了。

Struts 2默认的表达式语言是OGNL。OGNL既可以取值,又可以作为页面标签使用。

      首先简单介绍一下常用的OGNL页面标签:

form表单<s:form>
文本框:<s:textfield></s:textfield>
多行文本:<s:textarea></s:textarea>
密码框:<s:password></s:password>
下拉框:<s:select list="#{1:'请选择',2:'吃饭',3:'睡觉'}" name="select"></s:select>
下拉框:<s:combobox list="#{1:'请选择',2:'吃饭',3:'睡觉'}" name="下拉框" ></s:combobox>
单选框:<s:radio list="#{1:'打豆豆',2:'吃饭',3:'睡觉'}" name="单选框" value="1"></s:radio>
多选框:<s:checkboxlist list="#{1:'打豆豆',2:'吃饭',3:'睡觉'}" name="多选框" value="2"></s:checkboxlist>
</s:form>

标签在form表单里使用会自动换行,多选框也有另一种复杂一点的写法。但是ONGL不会作为常用的页面标签,因为我们一般写页面都有html的标签。

那么,既然它不会作为页面标签被我们常用,就来讲一下它的另一种用法,取值:它常用来获取值栈里面的值。

 既然说到值栈,那么先简单介绍一下值栈。

  值栈是struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值。存储在action对象中,每次访问action都会创建一个action对象,action对象里面有且只有一个值栈的对象。

  值栈的存值形式分为两种,一种是保存在content中,结果是map集合。另一种是保存在root中,结果是list集合。我们常用的是root。值栈有一个最大的特点就是先进后出,存在于最顶端的值可称为栈顶元素,上一个元素和下一个元素之间的关系可称为压栈。

    获取值栈对象:ActionContext actionContext = ActionContext.getContext();

                               ValueStack stack1 = actionContext.getValueStack();

package com.action;

import java.util.ArrayList;
import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.entity.Person;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack; public class IndexAction extends ActionSupport { private String name; public String getName() {
return name;
} private Person p; public Person getP() {
return p;
} private List<Person> lp = new ArrayList<>(); public List<Person> getLp() {
return lp;
} @Override
public String execute() throws Exception { // // 获取值栈对象
// ActionContext ac = ActionContext.getContext();
// // 值栈对象 存在于action对象中 (每一次访问action就会产生一个新的action对象)
// ValueStack vs = ac.getValueStack();
// vs.push("PUSH开头");
// vs.set("name", "哈哈");
// vs.push("PUSH结尾");
// 单个变量
name = "哈哈";
// 单个对象
p = new Person();
p.setName("haha");
p.setAge(18);
p.setSex("男");
// 单个集合
lp.add(new Person("asd", 1, "男"));
lp.add(new Person("asda", 12, "男")); // 域对象
HttpServletRequest req = ServletActionContext.getRequest();
req.setAttribute("name", "我是域对象的值"); return SUCCESS;
}
}
<!-- 获取值值栈对象(Map) -->
<s:property value="name"/>
<!-- 获取值 (String) -->
<s:property value="[2].top"/> --%>
<!-- 获取值 获取单个 变量 -->
<s:property value="name"/><br>
<!-- 获取值 获取单个对象 -->
<s:property value="p.name"/>
<s:property value="p.age"/>
<s:property value="p.sex"/><br>
<!-- 获取值 集合 第一种方式-->
<s:property value="lp[0].name"/>
<s:property value="lp[1].name"/><br>
<!-- 获取值 集合 第二种方式-->
<s:iterator value="lp">
<s:property value="name"/>
<s:property value="age"/>
<s:property value="sex"/><br>
</s:iterator>
<!-- 获取值 集合 第三种方式-->
<s:iterator value="lp" var="a">
<s:property value="#a.name"/>
<s:property value="#a.age"/>
<s:property value="#a.sex"/><br>
</s:iterator>
<!-- 获取值 集合 第四种方式-->
<c:forEach items="${lp}" var="p">
${p.name}
${p.age}
${p.sex}
</c:forEach>
<!-- 获取值 域对象 -->
<s:property value="#request.name"/>
<!-- s标签里放变量值 -->
<!-- value所绑定的值是值栈里面name的值 -->
<s:textfield value="%{name}"></s:textfield>
<!--在页面上输出一个字符串-->
<s:property value="'OGNL'"/>
<!--可以看见值栈里面所有的对象和值-->
<s:debug></s:debug>

Struts2 04--- 值栈 ognl(S标签)的更多相关文章

  1. Struts2的值栈和OGNL牛逼啊

    Struts2的值栈和OGNL牛逼啊 一 值栈简介: 值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务. 二 ...

  2. struts2(二)值栈 threadlocal ogal ui

    值栈(重要)和ognl表达式 1.  只要是一个mvc框架,必须解决数据的存和取的问题 2.  Struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构 3.  把数据存在值栈中,在页面上利用 ...

  3. 初学者易上手的SSH-struts2 04值栈与ognl表达式

    什么是值栈?struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值.,特点:先进后出.如果将它当做一个容器的话,而这个容器有两个元素,那么最上面的元素叫做栈顶元素,也就是所说的压 ...

  4. Struts2 的 值栈和ActionContext

    1.ValueStack 和 ActionContext 的关系与区别: -- 相同点:它们都是在一次HTTP请求的范围内使用的,它们的生命周期都是一次请求 -- 不同点:ValueStack 分为对 ...

  5. Struts2的值栈和对象栈

    ValueStack 如何得到值栈: 如何将对象存入值栈: 让值栈执行表达式来获得值: 在JSP中跳过栈顶元素直接访问第二层: 在JSP中访问值栈对象本身(而不是它们的属性) ActionContex ...

  6. Struts2 之值栈

    值栈(ValueStack) http://www.cnblogs.com/bgzyy/p/8639893.html 这是我的有关 struts2 的第一篇文章,对于里面我们说到的一个 struts2 ...

  7. 【struts2】值栈(后篇)

    在值栈(前篇)我们学习了值栈的基本知识,接下来,来看看在程序中具体如何使用值栈. 1 ActionContext的基本使用 1.1 如何获取? 要获取ActionContext有两个基本的方法,如果在 ...

  8. 【struts2】值栈(前篇)

    1 值栈是什么? 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心. Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action.Result.Intercept ...

  9. struts2中值栈

    值栈中的两个逻辑部分: 1.属性context,为OGNLContext类型,实际为ActionContext对象的一个引用,本质是一个Map,里面存放的各种Map,如request,session, ...

随机推荐

  1. 基于编辑距离来判断词语相似度方法(scala版)

    词语相似性比较,最容易想到的就是编辑距离,也叫做Levenshtein Distance算法.在Python中是有现成的模块可以帮助做这个的,不过代码也很简单,我这边就用scala实现了一版. 编辑距 ...

  2. JavaScript的DOM编程--09--节点的替换

    节点的替换: 1). replaceChild(): 把一个给定父元素里的一个子节点替换为另外一个子节点 var reference = element.replaceChild(newChild,o ...

  3. php curl 请求302跳转页面

    今天对接支付接口,需要获取支付页面,发现支付商那边给的链接会发送302 跳转,最后发现该方法,绝对给力: <?php $url = 'http://auto.jrj.com.cn/'; $ch ...

  4. 鸟哥的linux私房菜学习-(五)Linux系统的在线求助man page与info page

    1.man page man是manual(操作说明)的简写啦!只要下达:『man date』 马上就会有清楚的说明出现在你面前喔!如下所示: 进入man命令的功能后,你可以按下『空格键』往下翻页,可 ...

  5. 如何在MicroPython TPYBoard 添加自定义类库

    开始之前,首先要感谢一下TPYBoard技术交流群(157816561)-云之初晓网友的分享.   今天简单分享下如何将自己编写的一些Python脚本的类库添加到固件中,在使用时只需import调用, ...

  6. js 数组API之every、some用法

    every 判断数组中是否每个元素都满足条件 只有都满足条件才返回true: 只要有一个不满足就返回false: arr.every(function(value,index,array){retur ...

  7. Python爬虫知识点二

    一.request库 import json import requests from io import BytesIO #显示各种函数相当于api # print(dir(requests)) u ...

  8. 3、UML建模技术

    UML(统一建模语言)是当前软件开发中使用最为广泛的建模技术之一,通过使用UML可以构造软件系统的需求模型(用例模型).静态模型.动态模型和架构模型 UML类图 1.UML类图图示 在UML中,类使用 ...

  9. tomcat 发布简单的html网站

    1.建立一个文件夹D:\Demo 2.在Demo目录下,建立一个WEB-INF的文件夹并将web.xml放在里面,D:\Demo\WEB-INF\web.xml 3.将index.html文件放在De ...

  10. Task log(未)

    Keyword: fatal, crash, dead, out of memory, oom, anr in, non-protected File: main ,sys ,crash