Struts2——(4)OGNL与struts标签
一、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"只会执行业务方法,不会将返回页面显示。
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标签的更多相关文章
- Struts2 学习笔记15 Struts标签 part1
来说一下Struts标签,之前我们也很多地方用到了,还是来总结一下. 首先是property标签. <li>property:<s:property value="user ...
- Struts2 学习笔记16 struts标签 part2
接下来说一下if标签.下面是结果图. <li><s:if test="#parameters.age[0]<0">error!</s:if> ...
- struts2之OGNL和struts2标签库和ValueStack对象
OGNL简介: (1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. struts2框架默认就支持Ognl表达式语言(所以 ...
- Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用
我之前虽然会用,但是一直分不清彼此之间有什么区别,所以查找资料,将它们进行整合区分,加深了解, 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的 ...
- [JavaEE] 深入理解Struts2的ognl标签
OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够 ...
- Struts2的OGNL标签详解
一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...
- Ognl值栈对象及struts标签
用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionContext对象:然后把Action对象放入值栈中: 最后再把值栈对象放入request中,传入jsp页面 ...
- struts2学习(8)struts标签1(数据标签、控制标签)
一.struts2标签简介: struts标签很多,功能强大,这是优点: 但是缺点的话,性能方面可能会,各方面速度啊啥的会降低:有人比较测试,struts性能比jstl低很多: 二.struts2 ...
- struts2 taglib struts标签学习整理中
项目中经常会用到struts标签,这样可以减少代码量. select用法: <s:select list="#request.sysTypes" name="rul ...
随机推荐
- macos中xcode使用opencv,错误总结
使用opencv时,进行编译时,会出现如上图所示错误,按图示更改就行了(我编译出来的有2处)主要参考 https://blog.csdn.net/fk1174/article/details/7011 ...
- [React Intl] Format Numbers with Separators and Currency Symbols using react-intl FormattedNumber
Using a react-intl FormattedNumber component, we'll pass a Number and a few additional props in orde ...
- java中String\十六进制String\byte[]之间相互转换函数
java二进制,字节数组,字符,十六进制,BCD编码转换2007-06-07 00:17/** *//** * 把16进制字符串转换成字节数组 * @param hex * @return */ pu ...
- es6三点运算符的用法
扩展运算符( spread )是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1,2,3]); console.log(1,. ...
- ASP.NET配置文件里经常使用到的节点信息
web.config文件是一个XML文件,是以<confirguration>为根结点展开的. 上一面从宏观上解说了一下有关配置的文件的内容,以下是一些有关于配置文件经常使用的操作. ...
- GTK入门学习:glade的使用
搭建好环境后,在终端敲 glade 就可以启动glade工具. glade的总体框图: 经常使用控件选择区:列举了经常使用的控件,经常使用的有三类:顶层(主窗体等).容器(各种布局容器等).控制和显示 ...
- js进阶 12-5 jquery中表单事件如何使用
js进阶 12-5 jquery中表单事件如何使用 一.总结 一句话总结:表单事件如何使用:可元素添加事件监听,然后监听元素,和javase里面一样. 1.表单获取焦点和失去焦点事件有哪两组? 注意是 ...
- Java RMI使用
1. Java RMI介绍 RMI:远程方法调用(Remote Method Invocation).能够让在某个java虚拟机上的对象像调用本地对象方法一样调用另一个java 虚拟机中的对象上的方法 ...
- php 静态方法和非静态方法的调用说明
1. php类中,静态方法调用当前类的非静态方法必须用self关键字,不能用$this 2. php类中,公有方法调用私有方法使用$this关键字,只能实例化调用 3. php类中,公有方法调用私有方 ...
- 使用 Google Guava 美化你的 Java 代码:1~4 【转】
文章转载自:http://my.oschina.net/leejun2005/blog/172328 1.使用Google Collections,Guava,static imports编写漂亮代码 ...