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. 微信小程序部署问题总结

    1.微信小程序免费SSL证书Https 申请(阿里云申请) 进入阿里云控制台后,选择CA证书服务 选择购买证书 但是阿里云的免费SSL证书藏得比较深,得这样操作才能显示出免费证书 点击Symantec ...

  2. 前端之JavaScript--基础

    JavaScript 独立的语言,浏览器具有js解释器 一. JavaScript代码存在形式: - Head中 <script> //javascript代码 alert(123); & ...

  3. android之monkey测试

    本文同时发表于本人个人网站 www.yaoxiaowen.com monkey测试算是android自动化测试当中最简单的一种工具了.虽然简单,不过对于测试app的稳定健壮,减少崩溃还是比较有用的.所 ...

  4. 商业智能(BI)选型手册(转载)

    摘自http://articles.e-works.net.cn/bi/Article126429.htm 1.前言 互联网时代企业数据呈现爆发式增长,全面考验着企业的数据处理和分析能力.面对大容量. ...

  5. Flask 框架 简介

    一.Flask介绍 Flask是一个基于Werkzeug,Jinja 2 轻量级的web开发框架, 使用Python开发, 上手简单. 二.安装Flask 三.第一个Flask程序 1.编写app.p ...

  6. SpringMVC 支持使用Servlet原生API作为目标方法的参数

    具体支持一下类型: * HttpServletRequest * HttpServletResponse * HttpSession * java.security.Pricipal * Locale ...

  7. Tomcat与SpringMVC结合分析(一)

    关键字: Bootsrap,Catalina,Server,Service,Engine,Host,Context,Wrapper,Valve,Pipeline,ContextConfig,Servl ...

  8. 通俗易懂的信息熵与信息增益(IE, Information Entropy; IG, Information Gain)

    信息熵与信息增益(IE, Information Entropy; IG, Information Gain) 信息增益是机器学习中特征选择的关键指标,而学习信息增益前,需要先了解信息熵和条件熵这两个 ...

  9. css实现梯形标签页

    html <nav>click me</nav> css nav{ position: relative; display: inline-block; padding: 15 ...

  10. AIO5凭证性质设置接收下/上差(%),但是订单操作不起效。

    问题: AIO5凭证性质设置接收下/上差(%),但是订单操作不起效. 例如: 现在采购订单下了200个,我想限制收货只能收两百以内. 在在线帮助上看到有接收下/上差(%)字段可以进行限制,但是在凭证性 ...