10.OGNL

1.OGNL简介

OGNL 的全称为Object Graph Navigation lanuage,即对象图导航语言。他是一个开源项目,工作在视图层,用来取代页面的java脚本,简化数据的访问操作。

OGNL在框架中主要做两件事:表达式语言和类型转换器

1.1类型转换器

为什么需要类型转换:
在给予HTTP协议的web应用中,客户端请求的所有内容(如在表单中输入的姓名,年龄,生日等)均已文本编码的方式传输到服务器端,但服务器端的编程语言(java)有着丰富的数据类型,如int,boolean.Date及自定义类型等。因此,当这些参数进入应用程序,必须转换为合适的服务器编程语言的数据类型

1.2内置转换器

1.2.1 原始类型和包装类

action类

private User user;
private String message;
public String execute()
{
user=new User;
user.setName("json");
Address address=new Address();
user.setAddress(address);
setMessage(“aaa”);
return success;
}

页面展示数据:

信息:<s:property value="message">
姓名:<s:property value=="user.name">
地址:<s:property value="user.address.name">


1.2.2多值类型请求参数的处理

1.数组:

<s:form action="Array">
<s:textfield name="hobbies" lable="爱好">
 <s:textfield name="hobbies" lable="爱好">
<s:textfield name="hobbies" lable="爱好">
<s:textfield name="number【0】" lable="数字">
<s:textfield name="number【1】" lable="数字">
<s:textfield name="number【2】" lable="数字">
<s/form>

action:

private String[] hobbies;
private Double[] numbers=new Double[3]
//省略setting,getting 方法

2.集合:

 <s:form action="Array">
 <s:textfield name="hobbies" lable="爱好">
  <s:textfield name="hobbies" lable="爱好">
 <s:textfield name="hobbies" lable="爱好">
 <s:textfield name="number【0】" lable="数字">
 <s:textfield name="number【1】" lable="数字">
 <s:textfield name="number【2】" lable="数字">
  <s:textfield name="users.name" lable="姓名">
  <s:textfield name="users.name" lable="姓名">
  <s:textfield name="users.name" lable="姓名">
 <s/form>

action:

private List hobbies;
private List<double> numbers;
private List<User> users;
//省略getset方法

2.自定义转换器

2.1创建自定义类型转换器

Struts 2提供了一个开发人员编写自定义类型转换器时可以使用的基类:org.apache.struts2.util.StrutsTypeConverter;StrutsTypeConverter类是抽象类,定义了两个抽象方法,用于不同的类型转换
(1)
public Object convertFromString(Map context, String[] values, Class toType)
将一个或多个字符串值转换为指定的类型。
context:表示OGNL上下文的Map对象
values:要转换的字符串
toType:转换的目标对象
(2)

public String convertToString(Map context, Object object) 

将指定对象转换为字符串

2.2配置自定义类型转换器

1.应用于全局范围的类型转换器
在classPath的根目录下创建一个名为xwork.conversion.properties的属性文件,其内容为:转换类全名=类型转换器全民

#java.util.Date=cn.ssh.ch10.converter.DateConverter

2.应用于特点类的类型转换器
需要在特定类的相同目录下创建一个名为ClassName-conversion.properties的属性文件:特定类的属性名=类型转换器类全名
3.创建和配置日期类型转换器


public class DateConverter extends StrutsTypeConverter {

	private final DateFormat[] dfs={
			new SimpleDateFormat("yyyy年MM月dd日"),
			new SimpleDateFormat("yyyy-MM-dd"),
			new SimpleDateFormat("MM/dd/yy"),
			new SimpleDateFormat("yyyy.MM.dd"),
			new SimpleDateFormat("yyyyMMdd"),
			new SimpleDateFormat("yyyy/MM/dd")
	};
	
	@Override
	public Object convertFromString(Map context, String[] values, Class toType) {		
		String dateStr=values[0];
		for(DateFormat df: dfs){
			try {
				return df.parse(dateStr);
			} catch (ParseException e) {				
				continue;
			}
		}
		throw new TypeConversionException();//异常处理实现消息输出
	}

	@Override
	public String convertToString(Map context, Object object) {
		Date date=(Date)object;
		return new SimpleDateFormat("yyyy-MM-dd").format(date);
	}

}

3.OGNL表达式

迭代数组
<s:iterator value=“hobbies”>
<s:property/>
</s:iterator >

url标签和日期标签

url标签

<s:url value="show.action">
<s:param name="id" value="123"/>
</s:url>

现在在页面 show.action?id=12

日期标签

<s:data format=“format” nice=“true|false” name=“name” id=“id”/>

猜你喜欢

转载自blog.csdn.net/qq_43051879/article/details/84821427