码迷,mamicode.com
首页 > 其他好文 > 详细

Struts2原理

时间:2015-02-10 18:37:48      阅读:305      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

•Struts2 是一个用来开发 MVC 应用程序的框架. 它提供了 Web 应用程序开发过程中的一些常见问题的解决方案:
–对来自用户的输入数据进行合法性验证
–统一的布局
–可扩展性
–国际化和本地化
–支持 Ajax
–表单的重复提交
–文件的上传下载
–…..

1.    简述 Struts2框架的工作流程:
①. 请求发送给 StrutsPrepareAndExecuteFilter
②. StrutsPrepareAndExecuteFilter 判定该请求是否是一个 Struts2 请

③. 若该请求是一个 Struts2 请求, 则 StrutsPrepareAndExecuteFilter
把请求的处理交给 ActionProxy
④. ActionProxy 创建一个 ActionInvocation 的实例, 并进行初始化
⑤. ActionInvocation 实例在调用 Action 的过程前后, 涉及到相关拦截
器( Intercepter) 的调用。
⑥. Action 执行完毕, ActionInvocation 负责根据 struts.xml 中的配置
找到对应的返回结果。 调用结果的 execute 方法, 渲染结果。
⑦. 执行各个拦截器 invocation.invoke() 之后的代码
⑧. 把结果发送到客户端
2. Struts2 拦截器 和 过滤器 的区别:
①、 过滤器依赖于 Servlet 容器, 而拦截器不依赖于 Servlet 容器。
②、 Struts2 拦截器只能对 Action 请求起作用, 而过滤器则可以对几乎所
有请求起作用。
③ 、 拦截器可以访问 Action 上下文 (ActionContext) 、 值栈里的对象
(ValueStack) , 而过滤器不能.
④、 在 Action 的生命周期中, 拦截器可以多次调用, 而过滤器只能在容器
初始化时被调用一次。

①. 基于 MVC 架构, 框架结构清晰。
②. 使用 OGNL: OGNL 可以快捷的访问值栈中的数据、 调用值栈中对象的方

③. 拦截器: Struts2 的拦截器是一个 Action 级别的 AOP, Struts2 中的
许多特性都是通过拦截器来实现的, 例如异常处理, 文件上传, 验证等。 拦截器
是可配置与重用的
④. 多种表现层技术. 如: JSP、 FreeMarker、 Velocity 等
4. Struts2 如何访问 HttpServletRequest、 HttpSession、 ServletContext
三个域对象 ?
①. 与 Servlet API 解耦的访问方式
> 通过 ActionContext 访问域对象对应的 Map 对象
> 通过实现 Aware 接口使 Struts2 注入对应的 Map 对象
②. 与 Servlet API 耦合的访问方式
> 通过 ServletActionContext 直接获取 Servlet API 对象
> 通过实现 ServletXxxAware 接口 的方式使 Struts2 注入对应的对象
5. 拦截器的生命周期与工作过程 ?
每个拦截器都是需要实现 Interceptor 接口
> init() : 在拦截器被创建后立即被调用, 它在拦截器的生命周期内只
被调用一次. 可以在该方法中对相关资源进行必要的初始化;
> intercept(ActionInvocation invocation) : 每拦截一个动作请求,
该方法就会被调用一次;
> destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周
期内也只被调用一次;
6. 如何在 Struts2 中使用 Ajax 功能 ?
①. JSON plugin
②. DOJO plugin
③. DWR plugin
④. 使用 Stream 结果类型

Action 配置相关的 Annotation

•与 Action 相关的两个 Annotation 是 @Action 和 @Actions
•@Action 主要用于修饰 Action 类里的方法, 用于将方法映射为指定的 URL.
–@Action 可以指定一个 value 属性, 用于指定该 Action 映射的URL(类似于在 struts.xml 文件中配置该 Action 时为 <action /> 元素指定的 name 属性值)
–@Action 还可以指定一个 param 属性, 该属性是一个字符串数组, 用于该 Action 指定参数名和参数值. params 属性值应该遵守如下格式: {“name1”, “value1”, “name2”, “value2”, …}. 该属性用于为该 Action 注入属性值
•@Actions 也用于修饰 Action 类里的方法, 用于将该方法映射到多个 URL. @Actions 用于组织多个 @Action. 
 
Result 配置相关的 Annotation
•和 Result 配置相关的 3 个 Annotation 是 @Result , @Results 和 @ResultPath
•@Results 用于组织多个 @Result, 因此它只需一个 value 属性值, 该 value 属性值为多个 @Result。
•@Result 用于定义逻辑视图和物理视图之间的对应关系, 也就是相当于 struts.xml 文件里 <result …/> 元素里的作用
–name*: 指定 result 的名字, 相当于 <result …/> 节点的 name 属性
–type: 指定视图资源的类型, 相当于 <result …/> 节点的 type 属性
–locations: 指定实际视图的位置, 相当于 <result …></result> 的中间部分
–params: 为视图资源指定参数值. 属性值应满足 {name1, value1, name2, value2…} 的格式. 相当于 <result…></result> 的 <param> 子节点
•@Result 有如下两种用法
–Action 级的 Result 映射: 以 @Actions 组合多个 @Action 后修饰的 Action 类. 这种 Result 映射对该 Action 里的所有方法都有效
–方法级的 Result 映射: 将多个 @Result 组成数组后作为 @Action 的 results 属性值. 这种 Result 映射仅对被修饰的方法有效
•@ResultPath 用于改变被修饰 Action所对应的物理视图资源的根路径. 例如: 默认情况下, Conversion 插件会到 WEB-INF/content 路径下寻找物理视图资源. 但若使用 @ResultPath(“/simpleit”) 修饰 Action, 系统将会到 simpleit 目录下寻找物理资源
 
包和命名空间相关的 Annotation
•与包和命名空间相关的 Annotation 有如下 2 个
–@Namespace: 修改 Action. 该 Annotation 只需指定一个 value 属性值, 用于指定被修改的 Action 所在的命名空间.
–@ Namespaces: 修饰 Action. 用于组合多个 @Namespace.
 
•与异常相关的 Annotation 有 @ExceptionMapping 和 @ExceptionMappings
•@ExceptionMappings 用于定义异常类和物理视图之间的对应关系, 也就是它只需指定一个 value 属性值, 该 value 属性值为多个 @ExceptionMapping
•@ExceptionMapping: 用于定义异常类和物理视图之间的对应关系, 也就是相当于 struts.xml 文件里 <exception-mapping …/> 元素的作用. 使用 @ExceptionMapping 时必须指定如下两个属性:
–exception: 用于指定异常类, 相当于 <exception-mapping…/> 元素的 exception
–result: 用于指定逻辑视图名, 相当于 <exception-mapping …/> 元素的 result
•@ ExceptionMapping 有如下两种用法:
–Action 级的异常定义: 以 @ExceptionMappings 组合多个 @ExceptionMapping 后修饰 Action 类. 这种异常定义对 Action 里的所有方法都有效.
–方法级的异常定义: 将多个 @ExceptionMapping 组成数组后作为 @Action 的 exceptionMappings 属性值. 这种异常定义仅对修饰的方法有效. 
•拦截器配置相关的 Annotation 有 @InterceptorRef, @InterceptorRefs, @DefaultInterceptorRef
•@InterceptorRefs 用于指定多个 @InterceptorRef, 因此该 Annotation 只需指定一个 value 属性值, 该 value 属性值为多个 @ InterceptorRef
•@InterceptorRef 用于为指定 Action 引用拦截器或者拦截器栈. 也就是 struts.xml 文件中 <action…> 节点内部的 <interceptor-ref …/> 子元素的作用. 属性如下
–vlaue*: 用于指定所引用拦截器或拦截器栈的名字, 相当于 <interceptor-ref …/> 子元素中的 name 属性
–params: 用于覆盖所引用该拦截器的默认参数值. 该属性应满足 {name1, value1, name2, value2, …} 的格式. 相当于 <interceptor-ref …/> 元素的 <param> 子元素.
•@InterceptorRef 有如下两种用法
–Action 级的拦截器配置
–方法级的拦截器配置
•@DefaultInterceptorRef: 主要用于修饰包, 用于指定该包的默认拦截器. 这个 Annotation 只有一个 value 属性, 用于指定默认拦截器的名字.
相关简单配置文件

<struts>

<!-- 开启动态方法调用 使用action名字!方法名: hello!test.action。默认是调用execute方法
-->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />

<!-- 改变Action访问后缀 -->
<constant name="struts.action.extension" value="action,php,asp,,"></constant>

</struts>

web.xml配置:

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Struts2原理

标签:

原文地址:http://www.cnblogs.com/kui447/p/4284421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!