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”/>