[Java Web]Struts2基础总结(三)
OGNL表达式
OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁。主要用法有:
访问值栈中action的属性
username = <s:property value="username"/>访问值栈中的对象的属性(需要get set方法)
<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/>
访问值栈中对象的方法
<s:property value="password.length()"/>访问值栈中action的方法
<s:property value="add()" />访问静态方法
<s:property value="@sturts.action.Test@add()"/>访问静态属性
<s:property value="@sturts.action.Test@NAME"/>访问构造方法
<s:property value="new struts.action.User(8)"/>
访问List/Set/Map
<s:property value="users"/>访问List/Set中某个元素
<s:property value="users[1]"/>访问List中的元素某个属性的集合
<s:property value="users.{age}"/>访问List中某个元素的属性
<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/>访问Map中某个元素
<s:property value="users.zhangsan"/> | <s:property value="users['zhangsan']"/> | <s:property value="users[\"zhangsan\"]"/>访问Map中所有的Key
<s:property value="users.keys"/>访问Map中所有的Value
<s:property value="users.values"/>访问容器的大小
<s:property value="users.size()"/> | <s:property value="users.size"/>投影(? 选择满足条件的所有元素)
<s:property value="users.{?#this.age==1}[0]"/>投影(^ 选择满足条件的第一个元素)
<s:property value="users.{^#this.age>1}.{age}投影($ 选择满足条件的最后一个元素)
<s:property value="users.{$#this.age>1}.{age}"/>
声明式的异常处理
在程序中放弃try catch处理异常,通过struts.xml中的<exception-mapping>处理,该标签即可放在<action>标签中,也可以作为默认处理方案放在<global-exception-mapping>中,例如:
<global-results> <result name="error">/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping> </global-exception-mappings> <action name="user" class="struts.action.UserAction"> <result>/admin.jsp</result> <exception-mapping result="error" exception="java.sql.SQLException" /> <result name="error">/error.jsp</result> </action>
I18N国际化处理
用于项目的国际化,前台页面可以通过<s:text>或者<s:i18n>通过ActionSupport的getText方法取出配置文件中的内容,配置文件有三种写法
- Action级别,命名规范是"类名_语言名_地域名"
- 包级别,命名规范是"package_语言名_地域名"
- 全局级别,命名规范是"自定义名_语言名_地域名",同时在struts.xml文件中配置
<constant name="struts.custom.i18n.resources" value="自定义名"></constant>
当对象中的属性没有get set方法时,通过自定义类型转换器进行转换,方法为:
- 实现一个转换器类,继承StrutsTypeConverter类,重写convertFromString和convertToString方法:
public class MyPointConverter extends StrutsTypeConverter{ @Override public Object convertFromString(Map context, String[] values, Class toClass) { Point p = new Point(); String[] strs = (String[])values; String[] xy = strs[0].split(","); p.x = Integer.parseInt(xy[0]); p.y = Integer.parseInt(xy[1]); return p; } @Override public String convertToString(Map context, Object o) { // TODO Auto-generated method stub return o.toString(); } }
- 建立properties文件配置信息,如果是Action级别,文件名为"类名-conversion",格式为"属性名=转换器类名"。如果是全局级别文件名为"xwork-conversion",格式为"需要转换类名=转换器类名"
Struts工作流程
- 客户端发起HttpRequest请求
- 通过Application的web.xml文件中的配置,将请求发送到FilterDispatcher(StrutsPrepareAndExecuteFilter)处理
- FilterDispatcher调用ActionMapper查找请求对应的Action,并交给ActionProxy处理
- ActionProxy寻找到准备调用的Action类,并创建一个ActionInvocation实例调用它的invoke方法
- ActionInvocation的invoke方法会查找配置文件中的下一个拦截器(Intercepter)并调用它的intercept方法,如果没有下一个拦截器则会调用Action类的execute方法
- 每个intercept方法 的执行中还会调用ActionInvocation的invoke方法,当所有的拦截器都调用过invoke方法后,将会调用Action类的execute方法,并得到result结果
- 反向执行完每个拦截器intercept方法 的后半部分,最后发送HttpResponse结果
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。