- 浏览: 229928 次
- 性别:
- 来自: 武汉
最新评论
-
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 2071Struts2转码有个bug,可以导致应用挂掉(也可以执行类似 ... -
Struts2整合之动态图表OpenFlashChart
2012-07-06 15:56 2827Java开源项目中制作图表 ... -
Struts2整合之CKeditor和CKfinder
2012-07-11 17:29 3297先从官网上下载好最新的CKeditor和CKfinder包之后 ... -
Struts2之上传下载和页面渲染图片功能
2012-07-06 15:18 1794Struts2的上传下载是整合了commons-fileupl ... -
Struts2常用的数据标签
2012-06-30 16:24 1438<s:property /> <s:pr ... -
Struts2常用的集合控制标签
2012-06-30 15:56 2002<s:iterator/>迭代器标签 迭代器标签被 ... -
Struts2标签之token防止表单重复提交
2012-06-29 16:57 2086Struts2的token标签防止表单重复提交的思路是这样的: ... -
Struts2常用的UI标签
2012-06-29 17:03 1760<s:textfield />标签的label属性 ... -
Struts2中OGNL、ActionContext和值栈及线程安全浅析
2012-06-27 17:35 3142值栈(ValueStack) Struts2将OGNL ... -
Struts2之OGNL表达式中#,$,%的用法区别
2012-06-25 22:57 2563struts2 井号,星号,百分号 “#”主要有三种用途: 1 ... -
Struts2精萃之interceptor
2012-06-25 01:00 1908下面这段话能完美诠释拦截器的含义: 拦截器是AOP中的概念, ... -
Struts2的服务器端的四种输入校验方式
2012-06-24 16:34 2668Struts2的服务器端验证框架有四种方式校验,一种是利用do ... -
Struts2的客户端校验方式及自带的13种校验器
2012-06-24 16:22 2608如果要使用Struts2的验证框架,首先要开启这个拦截器。在 ... -
Struts2之国际化i18N配置
2012-06-23 19:19 3275在struts2中需要做国际化的有: jsp页面的国际化,a ... -
Struts2之Web应用中文乱码问题的6种解决方法
2012-06-23 17:29 1560在web应用中通常用下面几种方法解决中文问题: 1.HTM ... -
Struts2配置精要之struts.xml( global和default的配置)
2012-06-23 16:48 5046下面这个struts.xml囊括了所有可能用到的标签用法,例如 ... -
Struts2配置精要之常量constant配置详解(包括零配置Convention 的常量)
2012-06-18 02:30 4180这是目前为止收集的stru ... -
Struts2配置精要之Result Types(Struts2.3.4)
2012-06-17 19:36 10407struts2.3.4的Predefined Result ... -
Struts2配置精要之defaultStack与paramsPrepareParamsStack
2012-06-17 17:56 4254在Struts2.3.4的struts-default.xml ... -
Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活用法
2012-06-17 00:48 4754Struts2中Action接收参数的方法主要有以下三种: ...
相关推荐
Struts1 工作原理浅析 一、Struts1 工作原理概述 Struts1 是一个基于 MVC 模式的 Web 应用框架,它的工作原理可以分为三个部分:Model、View 和 Controller。Model 负责处理业务逻辑,View 负责表现层,Controller...
Struts1工作原理浅析 1.引入struts1 2.struts1工作原理 3.struts1工作机制 4.struts1的安装于基本配置 5.ActionServlet
浅析Struts 体系结构与工作原理.doc
最后,“浅析XSS漏洞原理.mht”文件可能深入探讨了XSS漏洞的基础概念,包括它的工作原理、危害性以及预防措施。文件可能还涵盖了常见的XSS防护手段,如使用HTTP头部的Content-Security-Policy(CSP)、输入验证、...
- **集成原理**:iBatis与Struts2集成的基本原理。 - **应用场景**:适合集成iBatis的情况及其优势。 #### 十六、集成jQuery - **16.1 什么是jQuery**:jQuery库的基本介绍。 - **16.2 jQuery操作CSS**:使用jQuery...
《项目架构那点儿事》——浅析Web层Struts2的构建 在Web开发领域,Struts2作为一款流行的MVC框架,为开发者提供了高效、灵活的架构支持。本篇文章将深入探讨Struts2在Web层的构建过程,通过分析提供的文件名,我们...
通过阅读这份宝典,开发者可以全面理解Struts2的工作原理和应用场景,为进一步深入学习和实践打下坚实的基础。无论是对于正在寻找高效Web开发框架的新手,还是想要提升技能的资深开发者,《Struts2入门宝典》都是一...
### Struts2入门教程知识点概览 #### 一、Struts2简介 - **起源与发展**:Struts2并非一个全新的框架,而是基于Struts1和WebWork的优点结合而成的一个框架。它继承了Struts1的一些特性,同时吸收了WebWork的核心...
1. **工作原理**:“Struts1工作原理浅析.doc”深入讲解了Struts1如何接收HTTP请求、解析ActionMapping、调用Action类的方法,以及如何将结果传递给视图层。 2. **教程**:“struts1教程.doc”通常会涵盖Struts1的...
### Struts2速成教程知识点概览 #### 一、Struts2简介及发展历程 - **Struts2的由来**:Struts2是基于WebWork框架的思想,并吸收了Struts1的优点发展而来的一种Web应用框架。它既不是WebWork也不是Struts1的简单...
资源名称:Struts1相关学习资料汇总资源目录:【】Struts1工作原理浅析【】struts1标签库详解【】struts1核心思想【】struts1详细配置【】Struts_in_Action_中文版【】Struts中文手册资源截图: 资源太大,传百度...
- **依赖注入**:讲解依赖注入的基本原理及其在Struts2中的应用。 #### 七、Struts2标签 - **标签库**:Struts2提供了一系列的HTML标签,用于简化表单和其他元素的创建。 - **标签使用**:通过具体示例说明如何在...
【标题】:“浅析WebWork” 【正文】: WebWork是一个历史悠久的Java Web应用程序框架,它在早期的Web开发中扮演了重要的角色,为开发者提供了强大的MVC(模型-视图-控制器)架构支持。本篇文章将深入探讨WebWork...
【标题】:浅析Digester 在Java开发中,我们经常需要处理XML文件,解析XML并将其内容映射到相应的Java对象上。这时,Apache Commons Digester库就派上了用场。本文将深入探讨Digester的功能、工作原理以及如何在...