struts2学习3——OGNL

目录:

一.OGNL简介
二.类型转换
三.OGNL表达式
四.Struts2标签与OGNL表达式


一.OGNL简介

什么是OGNL
   1.Object Graph Navigation language
   2.开源项目,取代页面中的Java脚本,简化数据访问
   3.和EL同属于表达式语言,但功能更为强大
OGNL在Struts2中做的两件事情
   表达式语言
       将表单或Struts2标签与特定的Java数据绑定起来,用于将数据移入,移出框架
   类型转换
       数据进入和流出框架,在页面数据的字符串类型和Java数据类型之间进行转换


值栈与OGNL
值栈(ValueStack)
1.由Struts2框架创建的存储区域,具有栈的特点
2.Action的实例会被存放到值栈中
OGNL访问值栈
1.按照从上到下的顺序

2.靠近栈顶的同名属性会被读取


二.类型转换

内置类型转换器

struts2提供了多种内置类型转换器,自动对客户端传来的数据进行类型转换

原始类型和包装类型




package cn.intro.action;

import com.opensymphony.xwork2.ActionSupport;

import cn.intro.entity.Address;
import cn.intro.entity.User;

public class ShowOriginalAndJavaBeanAction extends ActionSupport {
	
	private User user;
	private String message;
	@Override
	public String execute() throws Exception {
		setUser(new User());
		getUser().setName("jbit");
		getUser().setAge(23);
		Address address=new Address();
		address.setCountry("中国");
		address.setCity("北京");
		address.setStreet("长安街");
		getUser().setAddress(address);
		setMessage("展示原始类型和JavaBean");
		return SUCCESS;
	}
	// ... 所有参数的getter/setter方法
	
}

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	
	<package name="ognl" namespace="/" extends="struts-default">
		<action name="showOriginal" class="cn.intro.action.ShowOriginalAndJavaBeanAction">
			<result>result.jsp</result>
		</action>
		<action name="ArraysDataTransfer" class="cn.ognl.action.ArraysDataTransferAction">
			<result name="success">result2.jsp</result>
		</action>
		<action name="listDataTransfer" class="cn.ognl.action.ListDataTransferAction">
			<result>result2.jsp</result>
		</action>
	</package>
</struts>

result.jsp

<%@taglib uri="/struts-tags" prefix="s" %>
<body>  
信息:<s:property value="message" default="展示数据" /><br/>
姓名:<s:property value="user.name" /><br/>
年龄:<s:property value="user.age"  /><br/>
国家:<s:property value="user.address.country" />
</body>

result2.jsp

请查看控制台的输出

1.访问路径:http://localhost:8080/ch01/showOriginal.action

显示内容

信息:展示原始类型和JavaBean
姓名:jbit
年龄:23
国家:中国

2. arrary_input.jsp

<s:form action="ArraysDataTransfer.action">
    	<s:textfield name="hobbies" label="爱好:"/>
    	<s:textfield name="hobbies" label="爱好:"/>
    	<s:textfield name="hobbies" label="爱好:"/>
    	
    	<s:textfield name="numbers[0]" label="数字:"/>
    	<s:textfield name="numbers[1]" label="数字:"/>
    	<s:textfield name="numbers[2]" label="数字:"/>
    	<s:submit value="提交"/>
    </s:form>

访问路径:http://localhost:8080/ch01/array_input.jsp

3.list_input.jsp

<s:form action="listDataTransfer">
    	<s:textfield name="hobbies" label="爱好:"/>
    	<s:textfield name="hobbies" label="爱好:"/>
    	<s:textfield name="hobbies" label="爱好:"/>
    	
    	<s:textfield name="numbers[0]" label="数字:"/>
    	<s:textfield name="numbers[1]" label="数字:"/>
    	<s:textfield name="numbers[2]" label="数字:"/>
    	
    	<s:textfield name="users.name" label="姓名:"/>
    	<s:textfield name="users.name" label="姓名:"/>
    	<s:textfield name="users.name" label="姓名:"/>
    	<s:submit value="提交"/>
    </s:form>

访问路径:http://localhost:8080/ch01/list_input.jsp

action可以取到值


三.OGNL表达式

访问JavaBean
访问列表,数组
访问Map


注意事项
访问Bean属性
  Bean的类型必须遵循JavaBean的规范
     必须具有无参构造
  setter/getter方法符合JavaBean规范
访问集合对象
  可以使用属性名[index]的方式访问
     列表,数组
  可以使用属性名[key]的方式访问
     Map对象
  使用size或者length获取集合长度


1.访问JavaBean
  public class Address{
private String country;//国家
... //省略各个属性的setter和getter方法
  }


  public class User{//用户类
private String name;
private Address address;//家庭地址
... //省略各个属性的setter和getter方法
  }
(1).User对象作为Action的属性,其键名为user
(2).访问name属性,访问country属性
(3).user.name
    user.address.country


定义列表
<s:set name="list" value="{'jason','tom','jack'}"/>
访问列表
<s:property value="#list[0]"/>
<s:property value="#list.size"/>


<s:set>标签将一个值赋给指定范围的变量
<s:property>标签用于输出指定对象的属性值


遍历集合
<s:iterator value="list">
<s:property/>
</s:iterator>


定义Map
#{key1:value1,key2:value2,key3:value3,...,keyN:valueN}
举例:
<s:set name="map" value="#{'cn':'China','us':'the United States','fr':'France','jp':'Japan'}"/>
访问Map
访问已创建的Map,对象名为map
访问“China”
#map["cn"]
#map.cn




ActionContext的结构
1.值栈
2.非值栈对象
ActionContext中非值栈对象的访问
1.request
2.session
3.application
4.attr
5.parameters
6.自定义的非值栈对象。


el表达式是${sessionScope.loginUser}
ognl表达式是<s:property value="#session.loginUser"/>


ValueStack与request,sesion,application,parameters均存储在ActionContext中
ValueStack作为ActionContext的根对象。


值栈中内容可以直接访问,访问非值栈对象需要加添加#前面


举例

<s:set name="age" value="10" scope="request"/>  
<s:set name="username" value="'jason'" scope="session"/><!--如果value里面的值没有单引号,就代表寻找一个jason属性,而不是jason字符串。-->  
<s:set name="count" value="5" scope="application"/>  
#request.age:<s:property value="#request.age"/><br/>  
#session.username:<s:property value="#session.username"/><br/>  
#application.count:<s:property value="#application.count"/><br/>  
#attr.count:<s:property value="#attr.count"/><br/>  
<s:set name="country1" value="'China'"/>  
<s:set name="country2" value="'China'"/>  
#country1:<s:property value="#country1"/><br/>  
#country2:<s:property value="#country2"/><br/>  
#request.country2:<s:property value="#request.country2"/><br/>  

显示内容

#request.age:10
#session.username:jason
#application.count:5
#attr.count:5
#country1:China
#country2:China
#request.country2:China

调试信息

<s:debug/>

为什么country2可以用#request.country2来显示?因为有个包装类StrutsRequestWrapper。先在request里面找。然后在上下文中(ActionContext)找


在值栈的情况是

<s:iterator value="users1">
	<s:property/>
</s:iterator>
<s:iterator value="users2">
	<s:property value="name"/>
</s:iterator>

不在值栈的情况,并且如果都加上#,也都可以

<s:iterator value="users1" id="user"><!--使用了id,相当于用setter方法,把user变量set到上下文-->
	<s:property value="user"/><!--使用#user也可以-->
</s:iterator>
<s:iterator value="users2" id="user">
	<s:property value="#user.name"/>
</s:iterator>


四.Struts2标签与OGNL表达式


struts2标签的属性类型

1.对象类型:属性值作为OGNL表达式进行计算

<s:set name="myurl" value="'http://www.xxx.com'"/>
<s:property value="#myurl"/><!--显示http://www.xxx.com-->

2.字符串类型:属性值将直接输出,应使用%{... ...}再次计算。如URL标签

<s:set name="myurl" value="'http://www.xxx.com'"/>
<s:url value="#myurl"/><!--显示#myurl-->
<s:url value="%{#myurl}"/><!--显示http://www.xxx.com-->
如果分不清一个属性的值是否字符串类型,直接加上%{... ...}


URL标签

<s:url value="url">
   <s:param name="parname" value="parvalue"/>
</s:url/>

value属性:表示指定生成URL的地址
<s:param/>表示需要传递的参数信息
  name属性:表示传递的参数名称

  value属性:表示传递参数所具有的值.

举例

<s:set name="myurl" value="'http://www.baidu.com'"/>
<s:url value="%{#myurl}">
<s:param name="id" value="'123'"/>
<s:param name="name" value="'admin'"/>
</s:url>

输出

http://www.baidu.com?id=123&name=admin

日期标签
<s:date format="format" nice="true|false" name="name" id="id">
   ... ...
</s:date>
format属性:指定格式进行日期格式化
nice属性:该属性只有true和false两个值,用于指定是否输出指定日期与当前时间的时差,默认是false
name属性:表示当前需要的格式化的日期

id属性:表示引用该元素的id值

举例

在action中定义一个变量Date timeDate = new Date();

<s:date name="timeDate" format="yyyy/MM/dd" id="today"/><!-- 在上下文中增加一个非值栈的today对象,也可以写成var="today" -->
<s:property value="#today"/><!-- 显示2018/05/09 -->

s:date不输出

那么<s:date name="timeDate" format="yyyy/MM/dd"/>可以输出时间,但是就不会增加一个today对象了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值