一、OGNL

Object Graphic Navigation Language  对象图导航语言
依赖于 ognl.jar包
OGNL不是Struts框架独有的,它是和框架独立的一种技术。
例如:这样一个java项目中也能用
package com.test.struts.entity;

import java.io.Serializable;

public class Person implements Serializable{
private String name;
private Address address; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
} }
package com.test.struts.entity;

import java.io.Serializable;

public class Address implements Serializable{
private String street;
private String num; public Address(String street, String num) {
super();
this.street = street;
this.num = num;
} public String getStreet() {
return street;
} public void setStreet(String street) {
this.street = street;
} public String getNum() {
return num;
} public void setNum(String num) {
this.num = num;
} }
package com.test.struts.entity;

import ognl.OgnlException;

public class Test {
public static void main(String[] args) throws OgnlException {
Person p = new Person();
p.setName("dawanganban");
p.setAddress(new Address("http://blog.csdn.net/dawanganban", "110"));
//使用ognl工具对属性做操作
String val = (String) ognl.Ognl.getValue("address.street", p);
System.out.println(val);
//改变里面的值
ognl.Ognl.setValue("address.street", p, "http://www.baidu.com");
String val2 = (String) ognl.Ognl.getValue("address.street", p);
System.out.println(val2);
}
}
其作用如下:
(1)对属性获取和设置
(2)调用对象方法
(3)调用静态属性和方法
(4)对集合进行过滤
(5)支持java中的运算符和操作符
(6)定义List常量{"男","女"}
(7)定义Map常量#{"M":"男","F":"女"}

二、Struts2标签

Struts2使用OGNL表达式来访问ValueStack中的信息。
struts2提供了很多的标签,有些标签需要指定OGNL表达式。
struts2标签库在jar包中的位置  :struts2-core/META-INF/struts-tags.tld
(1)通用标签
debug ,properties, date, if...else, iterator, bean, push, action
<s:debug></s:debug> :显示值栈状态
下面以一个例子来说明:
 新建立一个工程,代码结构如下:
所添加的jar包如下(我下载的是struts-2.3.15.3-all.zip)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>myproject</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="struts2.2" extends="struts-default">
<action name="sample01" class="com.test.ognl.action.Simple01Action">
<result>Simple01.jsp</result>
</action>
</package>
</struts>
Simple01Action
package com.test.ognl.action;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class Simple01Action extends ActionSupport{
private String name;
private Date dt; public String execute(){
name = "tom";
dt = new Date();
return "success";
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDt() {
return dt;
}
public void setDt(Date dt) {
this.dt = dt;
} }
Simple01.jsp
<%@ 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>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
</body>
</html>
注意:上面jsp需要引入标签  <%@taglib uri="/struts-tags" prefix="s" %>

最后的结果
  
   
如果想获取上面的name属性和dt属性
从Value Stack Contents中直接取,从Stack Context中取要用#key 
	<s:property value="name"/>
<s:property value="dt"/>

    

如果想格式化日期,则可以用<s:date>标签
<s:date name="dt" format="yyyy年MM月dd日"/>
session信息位于Stack Context中,下面我们来从页面读取session中的值:
	public String execute(){
name = "tom";
dt = new Date();
//Map<String, Object> session = ActionContext.getContext().getSession(); 或者
Map<String, Object> session = (Map<String, Object>) ActionContext.getContext().get("session");
session.put("msg", "Session Value Message");
return "success";
}
<s:debug></s:debug>
姓名:<s:property value="name"/><br/>
日期:<s:date name="dt" format="yyyy年MM月dd日"/><br/>
session Message:<s:property value="#session.msg"/>
打开Debug可以看到如下内容

比较特殊的是attr先寻找request如果没有再找session(范围由小到大).
下面来看看if...else标签
添加一个int price属性,并初始化为10000
	价格:<s:property value="price"/>(
<s:if test="price>5000">
太贵了
</s:if>
<s:elseif test="price<5000">
太便宜了
</s:elseif>
<s:else>
很合适
</s:else>
)
那么如果有一个属性String sex = "M",想判断如果是"M"在页面显示“男”,"F"在页面显示“女”像上面这样用“==”判断行不行呢?答案是不行的。在struts标签里面可以用函数,应该这样做:
	性别:<s:if test='sex.equals("M")'>

</s:if>
<s:else>

</s:else>
下面来看看iterator迭代标签

新添加一个Address实体类
package com.test.ognl.action;

import java.io.Serializable;

public class Address implements Serializable{
private String street; public Address(String street) {
super();
this.street = street;
} public String getStreet() {
return street;
} public void setStreet(String street) {
this.street = street;
} }
添加一个集合属性并迭代赋值
private List<Address> adds = new ArrayList<Address>();
标签里面:
	<ul>
<s:iterator value="adds" var="address">
<li>
<s:property value="#address.street"/>
</li>
</s:iterator>
</ul>
这里的value属性如果是在栈里面(Action中)则直接写,如果在session中则需要加“#”,var是临时创建的一个变量,该变量会保存在context中,所以下面取值的时候是#address.street.
最后的结果:
其实还可以这样写
<ul>
<s:iterator value="adds">
<li>
<s:property value="street"/>
</li>
</s:iterator>
</ul>
为什么可以这样写呢?
这是因为<s:iterator>这个标签在执行的时候会首先将要迭代的对象(如上面的adds)放入栈,当执行完后出栈。
<s:iterator>标签还有一个属性 status (迭代状态对象,存储迭代时候的状态信息)
<ul>
<s:iterator value="adds" var="address" status="stat">
<li>
<s:property value="#stat.index"/>: <!-- 索引 -->
<s:property value="#stat.count"/>: <!-- 数量 -->
<s:property value="#stat.even"/>: <!-- 是否是奇数 -->
<s:property value="#stat.first"/>: <!-- 是否是第一个元素 -->
<s:property value="#address.street"/>
</li>
</s:iterator>
</ul>
接下来我们来看一下这个<s:bean>标签,这个标签可以创建一个对象放到context中。
先写一个Bean
package com.test.ognl.action;

public class ModelBean {
private String hello; public ModelBean() {
hello = "http://blog.csdn.net/dawanganban";
} public String getHello() {
return hello;
} public void setHello(String hello) {
this.hello = hello;
} }
标签中创建该对象,并取出属性。
	<s:bean name="com.test.ognl.action.ModelBean" var="mBean"></s:bean>
<s:property value="#mBean.hello"/>
下来再了解一下<s:push>标签,这个标签是临时压栈标签
    <s:push value="10">
//如果出了这个标签,压栈后的值会出栈。
   </s:push>
最后再了解一下<s:action>标签
这个标签可以实现一个页面中分多个模块,各个模块可以分别请求。
<s:action name="" namespace="" executeResult="true"></s:action>
如果executeResult="false"只会执行业务方法,不会将返回页面显示。
     (2)表单标签
form, textfield, password, checkbox, checkboxlist, radio,select, optgroup
这些表单标签比原始的html中的表单标签功能强大的多,可以实现默认填充等功能。下面我们来具体看一下。首先创建一个新的Action。
package com.test.ognl.action;

public class Simple02Action {
private String name;
private String pwd;
private int age;
private String email;
private String sex;
private boolean marry; public String execute() {
name="大碗干拌";
pwd="1234";
age=20;
email="739299362@qq.com";
sex = "M";
marry = true;
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public boolean isMarry() {
return marry;
}
public void setMarry(boolean marry) {
this.marry = marry;
} }
使用<s:form>标签
<s:form action="simple02" namespece="/">

</s:form>
查看页面源代码:
<!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>
<h1>表单信息</h1>
<form id="simple02" name="simple02" action="simple02" method="post" namespece="/">
<table class="wwFormTable">
</table></form>
</body>
</html>
我们发现struts标签默认为我们添加了很多属性,如:method=“post" ,但是有一点是我们不希望的,它在下面生成了<table>标签,这会影响我们对页面的设计,那么这该怎么办呢?其实很简单,可以添加一个属性theme="simple"
<s:form action="simple02" namespece="/" theme="simple">

</s:form>
页面源代码:
<!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>
<h1>表单信息</h1>
<form id="simple02" name="simple02" action="simple02" method="post" namespece="/"> </form>
</body>
</html>
下面我们来看一下表单中用到的标签
<s:form action="simple02" namespece="/" theme="simple">
姓名:<s:textfield name="name"/><br/>
密码:<s:password name="pwd" showPassword="true"/><br/>
年龄:<s:textfield name="age"/><br/>
Email:<s:textfield name="email"/><br/>
性别:<s:radio list='#{"M":"男","F":"女"}' name="sex"/><br/>
是否已婚:<s:checkbox name="marry"/><br/>
<s:bean name="com.test.ognl.action.ModelBean" var="data"></s:bean>
个人爱好:<s:checkboxlist name="myloves" list="#data.loves" listKey="key" listValue="value"/> </s:form>
运行结果:
说明:上面的“性别”部分是一个标签中的Map集合, 个人爱好部分的name是选中的项目集合, data是所有项目集合。


Struts2——(4)OGNL与struts标签的更多相关文章

  1. Struts2 学习笔记15 Struts标签 part1

    来说一下Struts标签,之前我们也很多地方用到了,还是来总结一下. 首先是property标签. <li>property:<s:property value="user ...

  2. Struts2 学习笔记16 struts标签 part2

    接下来说一下if标签.下面是结果图. <li><s:if test="#parameters.age[0]<0">error!</s:if> ...

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

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

  4. Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用

    我之前虽然会用,但是一直分不清彼此之间有什么区别,所以查找资料,将它们进行整合区分,加深了解, 一 介绍 1.Struts2的作用   Struts2标签库提供了主题.模板支持,极大地简化了视图页面的 ...

  5. [JavaEE] 深入理解Struts2的ognl标签

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

  6. Struts2的OGNL标签详解

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

  7. Ognl值栈对象及struts标签

    用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionContext对象:然后把Action对象放入值栈中: 最后再把值栈对象放入request中,传入jsp页面 ...

  8. struts2学习(8)struts标签1(数据标签、控制标签)

    一.struts2标签简介: struts标签很多,功能强大,这是优点: 但是缺点的话,性能方面可能会,各方面速度啊啥的会降低:有人比较测试,struts性能比jstl低很多:   二.struts2 ...

  9. struts2 taglib struts标签学习整理中

    项目中经常会用到struts标签,这样可以减少代码量. select用法: <s:select list="#request.sysTypes" name="rul ...

随机推荐

  1. 【Codeforces Round #433 (Div. 2) C】Planning

    [链接]h在这里写链接 [题意] 让你确定ti,使得∑(ti-i)*gi最小,其中ti∈[k+1..k+n],且每个ti都不能一样. 且ti>=i必须成立. [题解] 分解一下成为∑ti*gi ...

  2. [Android 4.4.2] 泛泰A870 Mokee4.4.2 20140531 RC1.0 by syhost

    欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam  (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo cr ...

  3. 关于idea新建子目录时往父目录名字后叠加而不是树形结构的解决方法(转)

    我们在IDEA中创建子目录时,子目录总是在父目录后面叠加而不是树形,如下 我们可以打开项目窗口的右上角的设置标志, 将红圈选项的√先去掉,创建好子目录后再将它选中就可以

  4. POJ3171 Cleaning Shifts DP,区间覆盖最值

    题目大意.N个区间覆盖[T1,T2]及相应的代价S,求从区间M到E的所有覆盖的最小代价是多少. (1 <= N <= 10,000).(0 <= M <= E <= 86 ...

  5. Emmet超详细教程

    Emmet超详细教程 一.总结 一句话总结:用的时候照着用,能提高效率. 1.快捷键如何使用? 需要敲代码的时候把快捷键放到旁边即可.照着敲. 二.Emmet超详细教程 Emmet的前身是大名鼎鼎的Z ...

  6. stm32的DMA重新工作

    下面是在战舰V3寄存器程序例子中找到的: //开启一次DMA传输void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx){    DMA_CHx->CCR&a ...

  7. vs 外部依赖项、附加依赖项以及如何添加依赖项目

    我们在 VS 中创建 Win32 控制台应用程序,vs 会为解决方案创建默认地创建 4 个 filters(资源管理器中没有对应的目录和文件夹): 头文件:一般为 .h 文件 外部依赖项 源文件:一般 ...

  8. 【t053】整数去位

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 键盘输入一个高精度的正整数N,去掉其中任意M个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对 ...

  9. Java CPU使用率过高分析

    http://note.youdao.com/publicshare/?id=d02cba2714709d4d4fe8a8627fc1cf41&type=note#/ (友情提示:本博文章欢迎 ...

  10. 【t083】买票

    [题目链接]:http://noi.qz5z.com/viewtask.asp?id=t083 [题解] 可以看一下: 钱数很小; 最大才10000; 即使每张票都是1元; 最多也只能买10000张票 ...