博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2——(4)OGNL与struts标签
阅读量:5905 次
发布时间:2019-06-19

本文共 7174 字,大约阅读时间需要 23 分钟。

一、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
myproject
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
struts.xml
Simple01.jsp
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" %>
Insert title here
注意:上面jsp需要引入标签  <%@taglib uri="/struts-tags" prefix="s" %>
最后的结果
  
   
如果想获取上面的name属性和dt属性
从Value Stack Contents中直接取,从Stack Context中取要用#key 
    
如果想格式化日期,则可以用<s:date>标签
<s:date name="dt" format="yyyy年MM月dd日"/>
session信息位于Stack Context中,下面我们来从页面读取session中的值:
public String execute(){		name = "tom";		dt = new Date();		//Map
session = ActionContext.getContext().getSession(); 或者 Map
session = (Map
) ActionContext.getContext().get("session"); session.put("msg", "Session Value Message"); return "success"; }
姓名:
日期:
session Message:
打开Debug可以看到如下内容
比较特殊的是attr先寻找request如果没有再找session(范围由小到大).
下面来看看if...else标签
添加一个int price属性,并初始化为10000
价格:
(
太贵了
太便宜了
很合适
)
那么如果有一个属性String sex = "M",想判断如果是"M"在页面显示“男”,"F"在页面显示“女”像上面这样用“==”判断行不行呢?答案是不行的。在struts标签里面可以用函数,应该这样做:
性别:
下面来看看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
adds = new ArrayList
();
标签里面:
这里的value属性如果是在栈里面(Action中)则直接写,如果在session中则需要加“#”,var是临时创建的一个变量,该变量会保存在context中,所以下面取值的时候是#address.street.
最后的结果:
其实还可以这样写
为什么可以这样写呢?
这是因为<s:iterator>这个标签在执行的时候会首先将要迭代的对象(如上面的adds)放入栈,当执行完后出栈。
<s:iterator>标签还有一个属性 status (迭代状态对象,存储迭代时候的状态信息)
  • :
    :
    :
    :
接下来我们来看一下这个<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: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>标签
查看页面源代码:
Insert title here

表单信息

我们发现struts标签默认为我们添加了很多属性,如:method=“post" ,但是有一点是我们不希望的,它在下面生成了<table>标签,这会影响我们对页面的设计,那么这该怎么办呢?其实很简单,可以添加一个属性theme="simple"
页面源代码:
Insert title here

表单信息

下面我们来看一下表单中用到的标签
姓名:
密码:
年龄:
Email:
性别:
是否已婚:
个人爱好:
运行结果:
说明:上面的“性别”部分是一个标签中的Map集合, 个人爱好部分的name是选中的项目集合, data是所有项目集合。
源代码下载:

转载于:https://www.cnblogs.com/lanzhi/p/6469591.html

你可能感兴趣的文章
flink watermark介绍
查看>>
Android Xutils 框架
查看>>
Sysbench 0.5版安装配置
查看>>
书摘—你不可不知的心理策略
查看>>
【博客话题】毕业——开始人生的艰苦历程
查看>>
Linux安装telnet
查看>>
sap scriptfom 多语言翻译
查看>>
黄聪:3分钟学会sessionStorage用法
查看>>
Entity Framework 全面教程详解(转)
查看>>
Windows上Python2.7安装Scrapy过程
查看>>
Chapter 3:Code Style in Django
查看>>
挖掘数据金矿 领军协同创新 曙光荣膺“2016大数据创新应用领袖企业”称号
查看>>
Fast通道获得Win10 Mobile Build 14977更新
查看>>
Firefox 跟踪保护技术将页面加载时间减少 44%
查看>>
java解析虾米音乐
查看>>
mysql 多行合并函数
查看>>
艾级计算机的发展与挑战
查看>>
RocketMQ事务消息实战
查看>>
手把手教你做出好看的文本输入框
查看>>
zabbix 3.2.7 (源码包)安装部署
查看>>