`
一日一博
  • 浏览: 229987 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2原理浅析

阅读更多
JavaEE把MVC设计模式引入了web领域,并在此基础上机构出了称为Model2的体系。


从上图不难看出,其实在配置文件配置的拦截器顺序,在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);
	    }
	}
  • 大小: 19.3 KB
  • 大小: 98.7 KB
分享到:
评论

相关推荐

    Struts1工作原理浅析【转】

    Struts1 工作原理浅析 一、Struts1 工作原理概述 Struts1 是一个基于 MVC 模式的 Web 应用框架,它的工作原理可以分为三个部分:Model、View 和 Controller。Model 负责处理业务逻辑,View 负责表现层,Controller...

    Struts1工作原理浅析.doc

    Struts1工作原理浅析 1.引入struts1 2.struts1工作原理 3.struts1工作机制 4.struts1的安装于基本配置 5.ActionServlet

    浅析Struts 体系结构与工作原理.doc

    浅析Struts 体系结构与工作原理.doc

    XSS转码 && struts2 property标签的bug

    最后,“浅析XSS漏洞原理.mht”文件可能深入探讨了XSS漏洞的基础概念,包括它的工作原理、危害性以及预防措施。文件可能还涵盖了常见的XSS防护手段,如使用HTTP头部的Content-Security-Policy(CSP)、输入验证、...

    struts2系列教程

    - **集成原理**:iBatis与Struts2集成的基本原理。 - **应用场景**:适合集成iBatis的情况及其优势。 #### 十六、集成jQuery - **16.1 什么是jQuery**:jQuery库的基本介绍。 - **16.2 jQuery操作CSS**:使用jQuery...

    <<项目架构那点儿事>>——浅析web层struts2的构建

    《项目架构那点儿事》——浅析Web层Struts2的构建 在Web开发领域,Struts2作为一款流行的MVC框架,为开发者提供了高效、灵活的架构支持。本篇文章将深入探讨Struts2在Web层的构建过程,通过分析提供的文件名,我们...

    Struts2入门宝典

    通过阅读这份宝典,开发者可以全面理解Struts2的工作原理和应用场景,为进一步深入学习和实践打下坚实的基础。无论是对于正在寻找高效Web开发框架的新手,还是想要提升技能的资深开发者,《Struts2入门宝典》都是一...

    struts2入门教程

    ### Struts2入门教程知识点概览 #### 一、Struts2简介 - **起源与发展**:Struts2并非一个全新的框架,而是基于Struts1和WebWork的优点结合而成的一个框架。它继承了Struts1的一些特性,同时吸收了WebWork的核心...

    postgresql和struts

    1. **工作原理**:“Struts1工作原理浅析.doc”深入讲解了Struts1如何接收HTTP请求、解析ActionMapping、调用Action类的方法,以及如何将结果传递给视图层。 2. **教程**:“struts1教程.doc”通常会涵盖Struts1的...

    struts2的速成教程,充电的都来看了

    ### Struts2速成教程知识点概览 #### 一、Struts2简介及发展历程 - **Struts2的由来**:Struts2是基于WebWork框架的思想,并吸收了Struts1的优点发展而来的一种Web应用框架。它既不是WebWork也不是Struts1的简单...

    Struts1相关学习资料汇总

    资源名称:Struts1相关学习资料汇总资源目录:【】Struts1工作原理浅析【】struts1标签库详解【】struts1核心思想【】struts1详细配置【】Struts_in_Action_中文版【】Struts中文手册资源截图: 资源太大,传百度...

    Struts2入门教程。包括jquery集成等。入门必看

    - **依赖注入**:讲解依赖注入的基本原理及其在Struts2中的应用。 #### 七、Struts2标签 - **标签库**:Struts2提供了一系列的HTML标签,用于简化表单和其他元素的创建。 - **标签使用**:通过具体示例说明如何在...

    浅析webwork

    【标题】:“浅析WebWork” 【正文】: WebWork是一个历史悠久的Java Web应用程序框架,它在早期的Web开发中扮演了重要的角色,为开发者提供了强大的MVC(模型-视图-控制器)架构支持。本篇文章将深入探讨WebWork...

    浅析Digester

    【标题】:浅析Digester 在Java开发中,我们经常需要处理XML文件,解析XML并将其内容映射到相应的Java对象上。这时,Apache Commons Digester库就派上了用场。本文将深入探讨Digester的功能、工作原理以及如何在...

Global site tag (gtag.js) - Google Analytics