- 浏览: 227015 次
- 性别:
- 来自: 武汉
最新评论
-
spp_1987:
org.springframework.beans.facto ...
Hibernate4之多对多双向关联 -
spp_1987:
后台保存订单下面 有很多订单 调了 对应什么方法 实现的?
Hibernate4之多对多双向关联 -
spp_1987:
订单 和 商品之间 有中间表存在吗???
Hibernate4之多对多双向关联 -
spp_1987:
跟 官方 hibernate4.2.5提供 的 manytom ...
Hibernate4之JPA规范配置详解 -
zhuguopei_java:
谢谢。楼主你这是解释源码吗
Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活用法
JavaEE把MVC设计模式引入了web领域,并在此基础上机构出了称为Model2的体系。
从上图不难看出,其实在配置文件配置的拦截器顺序,在ActionInvocation调度的时候,其实是一个递归算法,每个interceptor类里面代码被invocation.invoke()分成两部分,前一部分都会在执行Action的execute方法之前执行,然后再拦截器按反序再执行后半部分。
从struts2.1.3版本开始,官方团队极力推荐用StrutsPrepareFilter取代原ActionContextCleanUp,用StrutsExecuteFilter取代原FilterDispatcher,并在全新的核心控制器StrutsPrepareAndExecuteFilter中集成了StrutsPrepareFilter和StrutsExecuteFilter的功能。
这个时候在struts2的StrutsPrepareAndExecuteFilter与一系列拦截器Interceptor实现了Model2架构,如下图:
其实图中的ActionContextCleanUp改成StrutsPrepareFilter,第三步的FilterDispatcher之前会执行StrutsExecuteFilter,不得不说官方团队也有偷懒的时候,在最新的2.3.4版本中的文档估计是以前2.1版本的图。上图是我修改后的流程图,技术粗糙请见谅。
这是官方文档中的介绍:
1.The web browser requests a resource (/mypage.action, /reports/myreport.pdf, et cetera)
2.The Filter Dispatcher looks at the request and determines the appropriate Action
3.The Interceptors automatically apply common functionality to the request, like workflow, validation, and file upload handling
4.The Action method executes, usually storing and/or retrieving information from a database
5.The Result renders the output to the browser, be it HTML, images, PDF, or something else
要想灵活运用struts2个人认为必须对常用的类非常熟悉,那么不得不提到Action的基类ActionSupport了。
这里的ActionSupport实现了很多接口,我们一一来了解:
Action:
Validateable:
ValidationAware:
TextProvider:
LocaleProvider:
除了ActionSupport这个关键的基类外,还有个常用的类就是ServletActionContext,这个类继承了ActionContext并实现StrutsStatics接口,所以他可以称为Struts2直接访问Servlet API(如HttpServletRequest,HttpSession,HttpServletResponse,ServletContext)的工具类
从上图不难看出,其实在配置文件配置的拦截器顺序,在ActionInvocation调度的时候,其实是一个递归算法,每个interceptor类里面代码被invocation.invoke()分成两部分,前一部分都会在执行Action的execute方法之前执行,然后再拦截器按反序再执行后半部分。
从struts2.1.3版本开始,官方团队极力推荐用StrutsPrepareFilter取代原ActionContextCleanUp,用StrutsExecuteFilter取代原FilterDispatcher,并在全新的核心控制器StrutsPrepareAndExecuteFilter中集成了StrutsPrepareFilter和StrutsExecuteFilter的功能。
....... <filter> <filter-name>struts2Filter</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> .......
这个时候在struts2的StrutsPrepareAndExecuteFilter与一系列拦截器Interceptor实现了Model2架构,如下图:
其实图中的ActionContextCleanUp改成StrutsPrepareFilter,第三步的FilterDispatcher之前会执行StrutsExecuteFilter,不得不说官方团队也有偷懒的时候,在最新的2.3.4版本中的文档估计是以前2.1版本的图。上图是我修改后的流程图,技术粗糙请见谅。
这是官方文档中的介绍:
1.The web browser requests a resource (/mypage.action, /reports/myreport.pdf, et cetera)
2.The Filter Dispatcher looks at the request and determines the appropriate Action
3.The Interceptors automatically apply common functionality to the request, like workflow, validation, and file upload handling
4.The Action method executes, usually storing and/or retrieving information from a database
5.The Result renders the output to the browser, be it HTML, images, PDF, or something else
要想灵活运用struts2个人认为必须对常用的类非常熟悉,那么不得不提到Action的基类ActionSupport了。
public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable{ ... }
这里的ActionSupport实现了很多接口,我们一一来了解:
Action:
/** * 定义了Action5个常用的字符串常量,并且规定至少要有一个默认的execute方法 * 在ActionSupport实现execute方法返回值是SUCCESS */ public interface Action { public static final String SUCCESS = "success"; public static final String NONE = "none"; public static final String ERROR = "error"; public static final String INPUT = "input"; public static final String LOGIN = "login"; public String execute() throws Exception; }
Validateable:
/** * 验证框架,在ActionSupport中此方法的实现为空,如果Action中需要验证只需重写 * validate()方法就会在执行execute之前调用,然后通过ValidationAware接口中的 * addFieldError这些方法就可以达到服务端验证的效果。 */ public interface Validateable { void validate(); }
ValidationAware:
public interface ValidationAware { //为当前Action添加Action级别的错误信息集 void setActionErrors(Collection<String> errorMessages); Collection<String> getActionErrors(); //为当前Action添加Action级别的错误信息集 void setActionMessages(Collection<String> messages); Collection<String> getActionMessages(); //为制定字段添加错误信息集 void setFieldErrors(Map<String, List<String>> errorMap); Map<String, List<String>> getFieldErrors(); //为当前Action添加Action级别的错误信息 void addActionError(String anErrorMessage); //为当前Action添加Action级别的普通信息 void addActionMessage(String aMessage); //为制定字段添加错误信息 void addFieldError(String fieldName, String errorMessage); boolean hasActionErrors();//判断当前Action环境中是否存在Action级别错误 boolean hasActionMessages();//判断当前Action环境中是否存在Action级别消息 boolean hasErrors();//判断当前Action环境中是否存在Action级别错误 boolean hasFieldErrors();//判断当前Action环境中是否存在字段错误消息 }
TextProvider:
/** * 通过key得到资源文件中的value,如果是全局类型有变量的value可以带上变量值 * 通常此方法配合validation框架使用 */ public interface TextProvider { boolean hasKey(String key); String getText(String key); String getText(String key, String defaultValue); String getText(String key, String defaultValue, String obj); String getText(String key, List<?> args); String getText(String key, String[] args); String getText(String key, String defaultValue, List<?> args); String getText(String key, String defaultValue, String[] args); String getText(String key, String defaultValue, List<?> args, ValueStack stack); String getText(String key, String defaultValue, String[] args, ValueStack stack); ResourceBundle getTexts(String bundleName); ResourceBundle getTexts(); }
LocaleProvider:
public interface LocaleProvider { Locale getLocale(); }
除了ActionSupport这个关键的基类外,还有个常用的类就是ServletActionContext,这个类继承了ActionContext并实现StrutsStatics接口,所以他可以称为Struts2直接访问Servlet API(如HttpServletRequest,HttpSession,HttpServletResponse,ServletContext)的工具类
public class ServletActionContext extends ActionContext implements StrutsStatics { private static final long serialVersionUID = -666854718275106687L; public static final String STRUTS_VALUESTACK_KEY = "struts.valueStack"; public static final String ACTION_MAPPING = "struts.actionMapping"; @SuppressWarnings("unused") private ServletActionContext(Map context) { super(context); } public static ActionContext getActionContext(HttpServletRequest req) { ValueStack vs = getValueStack(req); if (vs != null) { return new ActionContext(vs.getContext()); } else { return null; } } public static ValueStack getValueStack(HttpServletRequest req) { return (ValueStack) req.getAttribute(STRUTS_VALUESTACK_KEY); } public static ActionMapping getActionMapping() { return (ActionMapping) ActionContext.getContext().get(ACTION_MAPPING); } //得到当前web应用中的PageContext对象 public static PageContext getPageContext() { return (PageContext) ActionContext.getContext().get(PAGE_CONTEXT); } public static void setRequest(HttpServletRequest request) { ActionContext.getContext().put(HTTP_REQUEST, request); } //得到当前web应用中的HttpServletRequest对象 public static HttpServletRequest getRequest() { return (HttpServletRequest) ActionContext.getContext().get(HTTP_REQUEST); } public static void setResponse(HttpServletResponse response) { ActionContext.getContext().put(HTTP_RESPONSE, response); } //得到当前web应用中的HttpServletResponse对象 public static HttpServletResponse getResponse() { return (HttpServletResponse) ActionContext.getContext().get(HTTP_RESPONSE); } //得到当前web应用中的ServletContext对象 public static ServletContext getServletContext() { return (ServletContext) ActionContext.getContext().get(SERVLET_CONTEXT); } public static void setServletContext(ServletContext servletContext) { ActionContext.getContext().put(SERVLET_CONTEXT, servletContext); } }
发表评论
-
Struts2远程执行漏洞
2013-01-25 22:44 1993Struts2转码有个bug,可以导致应用挂掉(也可以执行类似 ... -
Struts2整合之动态图表OpenFlashChart
2012-07-06 15:56 2770Java开源项目中制作图表 ... -
Struts2整合之CKeditor和CKfinder
2012-07-11 17:29 3267先从官网上下载好最新的CKeditor和CKfinder包之后 ... -
Struts2之上传下载和页面渲染图片功能
2012-07-06 15:18 1736Struts2的上传下载是整合了commons-fileupl ... -
Struts2常用的数据标签
2012-06-30 16:24 1411<s:property /> <s:pr ... -
Struts2常用的集合控制标签
2012-06-30 15:56 1968<s:iterator/>迭代器标签 迭代器标签被 ... -
Struts2标签之token防止表单重复提交
2012-06-29 16:57 2042Struts2的token标签防止表单重复提交的思路是这样的: ... -
Struts2常用的UI标签
2012-06-29 17:03 1716<s:textfield />标签的label属性 ... -
Struts2中OGNL、ActionContext和值栈及线程安全浅析
2012-06-27 17:35 3093值栈(ValueStack) Struts2将OGNL ... -
Struts2之OGNL表达式中#,$,%的用法区别
2012-06-25 22:57 2520struts2 井号,星号,百分号 “#”主要有三种用途: 1 ... -
Struts2精萃之interceptor
2012-06-25 01:00 1873下面这段话能完美诠释拦截器的含义: 拦截器是AOP中的概念, ... -
Struts2的服务器端的四种输入校验方式
2012-06-24 16:34 2635Struts2的服务器端验证框架有四种方式校验,一种是利用do ... -
Struts2的客户端校验方式及自带的13种校验器
2012-06-24 16:22 2573如果要使用Struts2的验证框架,首先要开启这个拦截器。在 ... -
Struts2之国际化i18N配置
2012-06-23 19:19 3230在struts2中需要做国际化的有: jsp页面的国际化,a ... -
Struts2之Web应用中文乱码问题的6种解决方法
2012-06-23 17:29 1506在web应用中通常用下面几种方法解决中文问题: 1.HTM ... -
Struts2配置精要之struts.xml( global和default的配置)
2012-06-23 16:48 4995下面这个struts.xml囊括了所有可能用到的标签用法,例如 ... -
Struts2配置精要之常量constant配置详解(包括零配置Convention 的常量)
2012-06-18 02:30 4106这是目前为止收集的stru ... -
Struts2配置精要之Result Types(Struts2.3.4)
2012-06-17 19:36 10336struts2.3.4的Predefined Result ... -
Struts2配置精要之defaultStack与paramsPrepareParamsStack
2012-06-17 17:56 4223在Struts2.3.4的struts-default.xml ... -
Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活用法
2012-06-17 00:48 4698Struts2中Action接收参数的方法主要有以下三种: ...
相关推荐
Struts1工作原理浅析
struts2原理图
Struts1工作原理浅析【转】
struts1工作原理 struts2工作原理 struts1和struts2比较 spring mvc工作原理 struts和spring mvc比较
struts2原理解析。包含官网的流程图。
Struts1工作原理浅析 1.引入struts1 2.struts1工作原理 3.struts1工作机制 4.struts1的安装于基本配置 5.ActionServlet
Struts1与Struts2原理 区别详解汇总
struts2工作原理、请求响应流程。。。。。。。。。。。。。。。
Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。 核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。...
struts 框架原理图 原理流程 跳转
Struts2 工作原理 Struts2框架 有图
Hibernate、Spring和Struts工作原理及使用理由
《Struts2技术内幕:深入解析Struts2架构设计与实现原理》以Struts2的源代码为依托,通过对Struts2的源代码的全面剖析深入探讨了Struts2的架构设计、实现原理、设计理念与设计哲学,对从宏观上和微观上去了解Struts2...
韩顺平老师讲的Struts运行原理,自己画的图,有需要可以参考下
作为struts2的初学者,有时候理解struts框架的原理,网上看图会一头雾水,所以要是能自己体会实现struts框架的整个过程,对理解struts思路会更加清晰一些,这个源码就是自己实现的过程,代码有详细注释
《Struts2技术内幕:深入解析Struts2架构设计与实现原理》以Struts2的源代码为依托,通过对Struts2的源代码的全面剖析深入探讨了Struts2的架构设计、实现原理、设计理念与设计哲学,对从宏观上和微观上去了解Struts2...
struts2原理分析 最新版 最全面 易懂
struts2工作原理图
struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别...
Spring+Hibernate+Struts工作原理