一、前言

OGNL和标签库的作用,粗暴一点说,就是减少在JSP页面中出现java代码,利于维护。

1.1、OGNL

1.1.1、什么是OGNL?

OGNL(Object-Graph Navigation Language):对象图形导航语言,是一种功能强大的表达式语言,通过简单的语法,就能够任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性的类型转换功能。

1.1.2、OGNL的基本知识

1.OGNL表达式的计算是围绕OGNL上下文进行的

OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。

它有一个上下文根对象。上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。

2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:<s:propertyvalue="xxx"/>。

3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

4.值栈(ValueStack) :

可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。

Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。

5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。

OGNL上下文存储图

1.1.3、OGNL中有三个重要的符号:#、%、$

"#"符号的用途:

1、访问非根对象,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

2、用于过滤和投影(projecting)集合,如persons.{?#this.age>25}.{age},persons.{?#this.name=='pla1'}.{age}[0]。(persons:表示存放在内含对象的值。其中问号?是把所有满足条件的元素都取出来。)

3、构造Map和List

"%"符号的用途:

"%"符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。(等下例子有介绍)

"$"符号的用途:

1、在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

2、在struts.xml中引用OGNL表达式,如:

下面通过例子来进行说明:

新建jsp页面:

<%@page import="java.util.LinkedList"%>
<%@page import="java.util.List"%>
<%@page import="com.Ogml.Persons"%>
<%@page import="org.apache.struts2.ServletActionContext"%>
<%@page import="com.opensymphony.xwork2.ActionContext"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!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>
</head>
<body>
<%
ActionContext ctx = ActionContext.getContext();
ctx.getApplication().put("msg", "application消息");
ctx.getSession().put("msg","session消息");
ctx.getParameters().put("msg", "parameters消息"); HttpServletRequest re = ServletActionContext.getRequest();
re.setAttribute("msg", "request消息");
%> <!-- 使用OGNL访问属性值 -->
<!--OGNL中的#号可以取出堆栈上下文中存放的对象 -->
<p>parameters:<s:property value="#parameters.msg"/></p>
<p>Application:<s:property value="#application.msg"/></p>
<p>session:<s:property value="#session.msg"/></p>
<p>request:<s:property value="#request.msg"/></p>
<!-- 使用attr:表示它会自动从request-session-applicatioin中寻找,如果找到则返回 -->
<p>attr:<s:property value="#attr.msg"/></p> <!--使用OGNL处理集合List,Map-->
<p>使用List集合:<s:select name="color" list="{'red','yellow','green'}" /></p>
<p>使用Map集合:
<s:set var="colors" value="#{'color1':'yellow' }"/>
<s:property value="#colors['color1']"/></p> <!-- 不使用%输出结果是:#colors['color1'] -->
<p>不使用%:<s:url value="#colors['color1']"/></p>
<!-- “%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。 -->
<p>使用%:<s:url value="%{#colors['color1']}"/></p> <!-- 过滤和投影(projecting) -->
<%
Persons p1 = new Persons();
p1.setUname("lisi");
p1.setAge(36);     
application.setAttribute("p", p1);
%>
<!-- 问号?是把所有满足条件的元素都取出来。 -->
<!-- {?#this.age>20}表示的是:获取当前对象的属性,这是一个表达式,如果是true的话,则后面查询的值会输出。false则不会 -->
<p>使用?#:<s:property value="#application.p.{?#this.age>20}.{uname}"/></p>
<!-- 输出的是[lisi],有中括号的表示这是一个列表 --> <!-- 上箭头^是开始的意思,即取符合条件的数据索引中第一条数据 -->
<p>使用^#:<s:property value="#application.p.{^#this.age>20}.{age}[0]"/></p>
<!-- 输出的是36,没有中括号,表示这个一个字符串 --> <!-- 前提必须在strtus.xml中添加
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> -->
<!-- 使用@访问静态方法 -->
<s:property value="@com.Ogml.Persons@sayhello()"/>
<!-- 使用@访问静态属性 -->
<s:property value="@com.Ogml.Persons@sex"/><br/> </body>
</html>

例子中有使用到^、@符号:

^符号表示的是去符合条件的第一条数据

@符号表示调用类的静态方法或者属性

另外还有美元符号$是结束的意思,即取符合条件的数据索引中最后一条数据,如:

#application.p.{$#this.age>=60}.{uname}输出的是[zhangsan]。

注意:如果使用OGNL要调用静态方法(但是据说Struts2最新版本不允许使用静态方法了,好像说是安全问题。有兴趣可以自己试下)或者静态属性的时候,struts.xml一定要配置:

<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>,该语句,不然无法调用。如下:

persons类代码如下:

package com.Ogml;

import java.io.StringWriter;

public class Persons {
public static String sex = "男";
private String uname;
private int age;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} public static void sayhello(){
System.out.println("hello");
}
}

Persons

仅作为笔记记录。

1.2、标签库

笔者对于标签库这些,真的不太感兴趣。但是没办法,还是的学着,发下牢骚。

1.2.1、标签库的好处

在Struts2中,它提供了大量的标签来生成页面效果,简单说来就是使用标签库中为我们提供的标签来达到我们想过的页面效果。而且标签库的使用非常简单,struts2把所有的标签都定义在URI为"/struts-tags"的命名空间下,我们只需要在页面中引入:<%@ taglib uri="/struts-tags" prefix="s"%>,就可以使用该标签库。

1.2.2、标签库的简单分类

UI标签:主要用于生产HTML元素的标签

非UI标签:主要用户数据访问,逻辑控制标签等

Ajax标签:用户Ajax支持的标签

对于UI标签,则可以分为两类:

1、表单标签:主要生成HTML页面的form元素以及普通标签元素

2、非表单标签:主要用于生成页面上的数据,tag页等标签

非UI标签,也可以分为两类:

1、流程控制标签:主要用于实现分支,循环等流程控制的标签

2、数据访问标签:主要包含输出valueStack中的值,完成国际化等功能的标签

这样就清晰多了。

Struts2入门(五)——OGNL和标签库的更多相关文章

  1. java struts2入门学习--OGNL语言常用符号和常用标签学习

    一.OGNL常用符号(接上一篇文章): 1.#号 1)<s:property value="#request.username"/> 作用于struts2的域对象,而不 ...

  2. java攻城师之路--复习java web之jsp入门_El表达式_JSTL标签库

    JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...

  3. Struts2 04--- 值栈 ognl(S标签)

           OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整 ...

  4. 复习java web之jsp入门_El表达式_JSTL标签库

    JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...

  5. java_web学习(五) JSTL标准标签库

    1.什么是JSTL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...

  6. java struts2入门学习--OGNL语言基本用法

    一.知识点学习 1.struts2中包含以下6种对象,requestMap,sessionMap,applicationMap,paramtersMap,attr,valueStack; 1)requ ...

  7. struts2 基础5 OGNL、标签、四大域、默认拦截器说明

    OGNL表达式 OGNL:对象导抗图语言 OGNL表达式是一个上下文的概念,上下文Map结构 OGNL表达式需要使用#标注命名空间.访问上下文(Context)中的对象需要使用#符号标注命名空间,如# ...

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

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

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

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

随机推荐

  1. 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

    读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内 ...

  2. JavaScript正则表达式,你真的知道?

    一.前言 粗浅的编写正则表达式,是造成性能瓶颈的主要原因.如下: var reg1 = /(A+A+)+B/; var reg2 = /AA+B/; 上述两个正则表达式,匹配效果是一样的,但是,效率就 ...

  3. C#多线程之基础篇3

    在上一篇C#多线程之基础篇2中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线 ...

  4. Android 7.1 - App Shortcuts

    Android 7.1 - App Shortcuts 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Shortcuts 文中如有纰漏,欢迎大家留言 ...

  5. Xamarin+Prism开发详解一:PCL跨平台类库与Profile的关系

    在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]中提到过以下错误,不知道大伙还记得不: 无法安装程序包"Microsoft.Identity.Client 1.0. ...

  6. C# 实时折线图,波形图

    此Demo是采用VS自带的Chart图表控件,制作实时动态显示的折线图,和波形图. 涉及到知识如下: Chart 控件,功能强大,可以绘制柱状图,折线图,波形图,饼状图,大大简化了对图的开发与定制. ...

  7. 【微信小程序开发】之如何获取免费ssl证书【图文步骤】

    微信小程序要求所有网络请求都走ssl加密,因此我们开发服务端接口需要配置为https 这篇文章介绍一下如何 在 startssl 申请一个免费的ca证书. 1. 打开网站  https://www.s ...

  8. 浅谈Slick(2)- Slick101:第一个动手尝试的项目

    看完Slick官方网站上关于Slick3.1.1技术文档后决定开始动手建一个项目来尝试一下Slick功能的具体使用方法.我把这个过程中的一些了解和想法记录下来和大家一起分享.首先我用IntelliJ- ...

  9. Open-Test 测试驱动模式与版本号管理机制

    以测试用例驱动项目开发,coding/case俩条线并走模式.   1.开发人员只负责功能实现:   2.测试人员提供自测用例,研发人员jenkins持续集成项目后自动化执行自测用例,通过后方可转测试 ...

  10. Hadoop1 Centos伪分布式部署

    前言:       毕业两年了,之前的工作一直没有接触过大数据的东西,对hadoop等比较陌生,所以最近开始学习了.对于我这样第一次学的人,过程还是充满了很多疑惑和不解的,不过我采取的策略是还是先让环 ...