日期:2014-05-16  浏览次数:20642 次

css的源码学习日志--struts2

与struts1不同,struts2从filter入手。web.xml里配StrutsPrepareFilterStrutsExecuteFilter

prepareFilter在init中根据filterConfig new出来dispatcher,然后在doFilter中准备好prepare(dispatcher放到threadLocal中, 由配置中读取mapping放到prepare中等),放到threadLocal中。StrutsExecuteFilter.doFilter里有prepareOperations和executeOperations.传入刚才创建的dispatcher.

?

接收到request,由prepare得到mapping,execute执行executeAction最终调用到dispatcher.serviceAction(mapping).这个方法先创建extraContext放valueStack等,然后调用ActionProxy.execute(),如果mapping配到result,则直接到result.execute(). 这个ActionProxy由ActionProxyFactory由配置创建。ActionProxy中invocation.invoke()开始了ActionInvocation与Interceptors的相互调用,形成interceptor链。最终调用到action的相关方法,然后是post interceptors,返回页面。

?

filter-->operations.executeAction-->dispatcher-->actionProxy-->actionInvocation(interceptor)

--常见概念:

从struts-default.xml中可以看到很多东西。

configuration:完成configure的动作。

configuratioNProvider: 如Xml的,负责从xml文件读入配置并由configuration调用。

action: struts1要求action必须实现action,2不要求,但有个actionSupport提供大部分功能。

ActionContext: action访问上下文包括request, session, sc等。action可从静态方法得到其实例。页面上,可以通过XXXScope来访问相应scope的数据。--另外,action也可通过实现XXXAware来由interceptor注入相关上下文。注意,不要往获得的response里写东西,没用的。

Result: 处理后的结果类型。常见的有ServletDispatcher, ServletRedirect, Stream, PlainText等。redirect的区别:等同于response.sendRedirect是在浏览器端跳转,对restful有很大作用。redirectAction是请求到另一个action.用ActionMapper实现。

这些配置均可使用通配符。

Listener: 一个interceptor专门处理listener。

异常处理:有exception interceptor处理异常,通过exception-mapping配置。

convention: 约定大于配置。通过添加convention-plugin实现。通常将action(s),struts(2)下以Action结尾或实现了Action接口的类作为action。路径即是包名类名,结果是WEB-INF/content下相应目录的类名-结果等。如果找不到result,还可以进入action chain。开启约定映射的自动重加载,配置struts.devMode=true. 另外可用annotation来作配置。

资源文件:i18n国际化。struts.custom.i18n.resources=baseName,文件名为baseName_zh_CN.properties等。位置可在classpath下,包下等。可用占位符,用ActionSupport.getText替换。加载时先局部后全局。

标签库:主要有UI, logic, form等,还有OGNL,用#取值,内置范围对象如request等。

?

类型转换:有interceptor进行类型转换。有OGNL类型转换,对于集合,有泛型或局部-conversion.properties指定Element_propName=type。也可指定自定转换器或用annotation,实现TypeConverter。有conversionError处理转换错误进入input,invalid.fieldvalue.XXX可自定义提示。输入校验:除服务器端校验,还可生成客户端(js)校验,且只一个属性不同(form中validate=true)。返回input。在配置文件actionName-(aliasName)-validation.xml中validators中field中添加field-validator即可。页面用<s:fielderror/>提示。在message中用key读取资源。有不同风格(filed或validator先)。short-circuit=true可指定短路(即出现一个错误就返回)。也可在action类中添加validate()或validateMethodname()进行校验。注意校验规则。可到xwork validator的default.xml查找内建validtors。

convert与validate一起处理,产生fieldError再一起返回result。

文件上传下载:上传为fileUpload interceptor,下载为type=stream的result。