[学习笔记] Struts2之OGNL
# 学习 # · 2021-03-23
OGNL在框架中的作用
1、OGNL(对象视图导航语言):是一个开源项目,取代页面中Java脚本,简化数据访问。OGNL和EL同属于表达式语言,但功能更为强大。
2、OGNL的应用:
(1)表达式语言:将表单或Struts 2标签与特定的Java数据绑定起来,用来将数据移入、移出框架。
(2)类型转换:数据进入和流出框架,在页面数据的字符串类型和Java数据类型之间进行转换。
3、OGNL融入Struts 2:
4、数据流入:数据最开始来自页面InputForm.html,表单以neme OGNL形式提交数据,请求以HTTPServletRequest进入Struts2框架,Struts2和OGNL对请求参数进行处理,类型转换并将数据匹配赋值最后保存至值栈。
5、数据流出:当Action完成业务处理后,最终会返回一个结果,并生成一个页面。
6、值栈(ValueStack):
(1)值栈类似于一个容器:存储区域,用来保存Mdel(模型)对象,用于在页面控制器之间数据传递交互展示。
(2)值栈具有栈的特征:可以存储多个对象,以先入后出原则存储,从上到下的顺序读取。
类型转换
1、内置转换器:Struts2提供内置转换器自动对客户端传来的数据进行类型转换。
(1)原始类型和包装类的转换。
(2)多值类型请求参数的处理:Struts2会将这样的数据转换为面向集合的数据类型。
(3)集合:Struts2支持将一系列请求参数自动转换到各种集合类型的属性。
2、自定义转换器:
(1)创建自定义类型转换器:
// 继承StrutsTypeConverter类编写自定义类型转换器
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("yyMMdd"),
new SimpleDateFormat("yyyy/MM/dd") };
/**
* 重写方法:将一个或多个字符串值转换为指定的类型
*/
public Object convertFromString(Map context, String[] values, Class toType) {
String dateStr = values[0];
for (int i = 0; i < dfs.length; i++) {
try {
return dfs[i].parse(dateStr);
} catch (Exception e) {
continue;
}
}
throw new TypeConversionException("转换错误");
}
/**
* 重写方法:将指定对象转化为字符串
*/
public String convertToString(Map context, Object object) {
Date date = (Date) object;
return new SimpleDateFormat("yyyy-MM-dd").format(date);
}
}
(2)配置自定义类型转换器(应用于全局范围):创建resources/xwork-conversion.properties文件。
# 格式:转换类全名=类型转换器类全名
java.util.Date=com.aduo.ognl.util.DateConverter
(3)配置自定义类型转换器(应用于特定类):在特定类相同目录下创建ClassName-conversion.properties文件。
# 格式:特定类的属性名=类型转换器类全名
brithday=com.aduo.ognl.util.DateConverter
3、处理类型转换错误:
(1)处理类型转换错误的前提条件:
A、启动StrutsConversionErrorInterceptor拦截器,拦截器已经包含在defaultStack拦截器栈中。
B、Action要继承ActionSupport类,实质是实现ValidationAware接口。
C、配置input结果映射
D、页面使用Struts2表单标签或<s:fielderror>标签
(2)修改所有类型的转换错误信息:修改xwork.default.invalid.fieldvalue键的值。
步骤一:在struts.xml中指定资源文件的基名
<constant name="struts.custom.i18n.resources" value="message"/>
步骤二:在资源目录下创建资源文件message.properties并修改键值
xwork.default.invalid.fieldvalue=字段“{0}”的值无效
(3)定制特定字段的类型转换错误信息:在Action范围的资源文件中添加I18N消息键invalid.fieldvalue.xxx。
步骤一:在Action包下创建RegisterAction.properties,指定键值
invalid.fieldvalue.birthday=生日转换错误
OGNL表达式
1、OGNL访问Bean属性:
<s:property value="Action中属性名" default="默认数据" />
<s:property value="Action中对象名.对象属性" />
(1)如果没有设置default,且value为null,则空字符展示。
2、OGNL访问集合对象:
/* 迭代集合/数组 */
<s:iterator value="集合/数组" >
<s:property/>
</s:iterator>
/* 迭代对象集合 */
<s:iterator value="对象集合" >
<s:property value="对象属性名1" />
<s:property value="对象属性名.." />
</s:iterator>
(1)访问列表或者数组的某一个元素:属性名[index]
(2)访问Map的某一个元素:属性名['Key']
(3)访问集合的长度:size或length
3、访问ActionContext中的数据:
(1)ActionContext:称为运行上下文。ActionContext中包含了框架处理一个请求时会用到的所有的数据。
(2)访问数据(非值栈对象)的方法:作用域存储的对象并不是在值栈中,取值时候, 通过 #作用域.对象名 访问。
4、查看ActionContext中的数据:
<s:debug/>
5、set标签:
<s:set name="country1" value="China"/>
<s:set name="country2" value="'China'" />
(1)name:指定变量的名字,类型为String。
(2)value:指定一个表达式赋给变量,类型为Object。
(3)scope:指定变量的作用域,默认为action,变量同时保存到request和ApplicationContext。
5、Struts2标签与OGNL表达式:
(1)Struts2标签的属性都可以使用OGNL表达式。Struts2标签的属性是具有类型的,分为字符串类型和对象类型。
(2)对于字符串类型的属性,访问其动态数据:使用%{...}
<s:set name="myurl" value="http://www.baidu.com" />
<s:url value="#myurl" /> // 显示#myurl
<s:url value="%{#myurl}" /> // 显示http://www.baidu.com
(3)对于对象类型的属性,将直接作为OGNL表达式进行计算。如果需要对对象类型的属性指定字符串常量,则必须在这个字符串常量外加上一对单引号或使用%{'constant string'}。
<s:property name="myurl" value="'http://www.baidu.com'" />
<s:property value="#myurl" /> // 显示http://www.baidu.com
<s:property value="%{#myurl}" /> // 显示http://www.baidu.com
URL标签和日期标签
1、URL标签:
(1)基本语法:
/**
* value:URL地址
* name:传递的参数名称
* value:传递参数的值
*/
<s:url value="url">
<s:param name="parname" value="parvalue"/>
</s:url>
(2)使用value指定URL地址:
<s:url value="http://www.baidu.com"/>
(3)使用变量生成URL地址:
<s:set name="myurl" value="'http://www.baidu.com'"/>
<s:url value="%{#myurl}"/>
(4)使用param指定参数:
<s:url value="show.action">
<s:param name="id" value="123"/>
</s:url>
2、日期标签:
(1)基本语法:
/**
* format:按照指定的格式进行日期格式化
* nice:指定输出日期与当前时间的时差
* name:需要格式化的日期
* id:引用该元素的id值
*/
<s:data format="format" nice="true|false" name="name" id="id" />
(2)指定日期格式进行格式化:
<s:date name="currentDate" format="dd/MM/yyyy" />
如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/274/
评论