Struts2学习笔记

来源:互联网 发布:sql数据库查询语句大全 编辑:程序博客网 时间:2024/06/10 18:39

学习资料:

官网

turorials

入门,其中get start部分里面有基本各知识点简单例子

Guides

深入指南(重点)

FAQ


研磨Struts


重要知识点

1、Struts2体系架构、系统结构


注:上图为比较老的版本框架图,其中Filter部分中,FilterCleanUp及FilterDispatcher已经被StrutsPrepareAndExecuteFilter、StrutsPrepareFilter、StrutsExecutionFilter替换。

架构图上有好多东西,不要着急,接下来逐个击破。首先看看它们各自是做什么的,跟着图上的箭头一个一个来看:

  • FilterDispatcher是整个Struts2的调度中心,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并停止过滤器链上还没有执行的过滤器。
  • ActionMapper提供了HTTP请求与action执行之间的映射,简单点说,ActionMapper会判断这个请求是否应该被Struts2处理,如果需要Struts2处理,ActionMapper会返回一个对象来描述请求对应的ActionInvocation的信息。
  • ActionProxy是一个特别的中间层,位于Action和xwork之间,使得我们在将来有机会引入更多的实现方式,比如通过WebService来实现等。
  • ConfigurationManager是xwork配置的管理中心,通俗的讲,可以把它看做struts.xml这个配置文件在内存中的对应。
  • struts.xml是Stuts2的应用配置文件,负责诸如URL与Action之间映射的配置、以及执行后页面跳转的Result配置等。
  • ActionInvocation:真正调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会执行这些拦截器、Action以及相应的Result。
  • Interceptor(拦截器):拦截器是一些无状态的类,拦截器可以自动拦截Action,它们给开发者提供了在Action运行之前或Result运行之后来执行一些功能代码的机会。类似于我们熟悉的javax.servlet.Filter。
  • Action:动作类是Struts2中的动作执行单元。用来处理用户请求,并封装业务所需要的数据。
  • Result:Result就是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result实现,Struts2中支持多种视图类型,比如Jsp,FreeMarker等。
  • Templates:各种视图类型的页面模板,比如JSP就是一种模板页面技术。
  • Tag Subsystem:Struts2的标签库,它抽象了三种不同的视图技术JSP、velocity、freemarker,可以在不同的视图技术中,几乎没有差别的使用这些标签。

可参考:

《研磨struts2》第三章 Struts2的架构和运行流程 之 3.1 Struts2的系统架构


2、性能调优(参考guide's Performance Tuning)

关闭日志及开发模式

不要使用不需要的拦截器,如I18nInterceptor,它会导致每次新的请求都创建session

使用正确的HTTP headers ( Cache-Control & Expires)

无需要就不要创建session

......


3、拦截器实现原理及编写


4、Struts2核心类、接口

StrutsPrepareAndExecutionFilter

Action

Result

Interceptor

ActionMapping

ActionProxy

ActionInvocation

ActionContext

StrutsTestCase

StrutsSpringTestCase


5、如何在Action中获取到HttpServletRequest、HttpServletResponse及HttpSession对象?

 可参考:

《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext

方法一:通过ServletActionContext来获取:

HttpServletRequest request = ServletActionContext.getRequest();  HttpServletResponse response = ServletActionContext.getResponse();  ServletContext servletContext = ServletActionContext.getServletContext();  PageContext pageContext = ServletActionContext.getPageContext();  HttpSession session = ServletActionContext.getRequest().getSession(); 
方法二:

通过IoC/DI的方式来获取相应的Servlet对象

       还可以通过IoC/DI的方式来获取相应的Servlet对象,对应关系是:

  • ServletRequestAware:通过这个接口来获取HttpServletRequest对象
  • ServletResponseAware:通过这个接口来获取HttpServletResponse对象

用ServletRequestAware来示例一下。

(1)修改Action,让其实现ServletRequestAware接口,示例代码如:

public class OgnlAction extends ActionSupport implements ServletRequestAware{      private HttpServletRequest request = null;        public void setServletRequest(HttpServletRequest request) {          this.request = request;      }            public String execute(){                  request.setAttribute("request", "Request的属性值");          request.getSession().setAttribute("sessionTestKey", "测试SessionAware");          return this.SUCCESS;      }     } 




0 0
原创粉丝点击