[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方法取出配置文件中的内容,配置文件有三种写法

  1. Action级别,命名规范是"类名_语言名_地域名"
  2. 包级别,命名规范是"package_语言名_地域名"
  3. 全局级别,命名规范是"自定义名_语言名_地域名",同时在struts.xml文件中配置
    <constant name="struts.custom.i18n.resources" value="自定义名"></constant>   

自定义类型转换器

当对象中的属性没有get set方法时,通过自定义类型转换器进行转换,方法为:

  1. 实现一个转换器类,继承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();
    	}
    
    }

  2. 建立properties文件配置信息,如果是Action级别,文件名为"类名-conversion",格式为"属性名=转换器类名"。如果是全局级别文件名为"xwork-conversion",格式为"需要转换类名=转换器类名"

Struts工作流程


  1. 客户端发起HttpRequest请求
  2. 通过Application的web.xml文件中的配置,将请求发送到FilterDispatcher(StrutsPrepareAndExecuteFilter)处理
  3. FilterDispatcher调用ActionMapper查找请求对应的Action,并交给ActionProxy处理
  4. ActionProxy寻找到准备调用的Action类,并创建一个ActionInvocation实例调用它的invoke方法
  5. ActionInvocation的invoke方法会查找配置文件中的下一个拦截器(Intercepter)并调用它的intercept方法,如果没有下一个拦截器则会调用Action类的execute方法
  6. 每个intercept方法 的执行中还会调用ActionInvocation的invoke方法,当所有的拦截器都调用过invoke方法后,将会调用Action类的execute方法,并得到result结果
  7. 反向执行完每个拦截器intercept方法 的后半部分,最后发送HttpResponse结果











郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。