读书人

struts2源码浅析(3)

发布时间: 2012-06-30 17:20:12 作者: rapoo

struts2源码浅析(三)

接上篇http://mazhiyuan.iteye.com/blog/1202086,本文着重dispatcher和filter的探讨。

?

Dispatcher已经在之前讲过,FilterDispatcher是Struts2的核心控制器,首先看一下init()方法。

?

doFilter方法,struts2中最富盛名的方法了,每当有一个Request,都会调用这些Filters的doFilter方法

先来张图


struts2源码浅析(3)
?

?

从代码中看出,getMapping()方法返回ActionMapping类型的对象,该对象包含三个参数:Action的name、namespace和要调用的方法method。
如果getMapping()方法返回ActionMapping对象为null,则FilterDispatcher认为用户请求不是Action,自然另当别论.
FilterDispatcher会做一件非常有意思的事:如果请求以/struts开头,会自动查找在web.xml文件中配置的 packages初始化参数

protectedvoid findStaticResource(String name, HttpServletRequest request, HttpServletResponse response) throws IOException {    if (!name.endsWith(".class")) {//忽略class文件      //遍历packages参数      for (String pathPrefix : pathPrefixes) {        InputStream is = findInputStream(name, pathPrefix);//读取请求文件流        if (is != null) {          ...          // set the content-type header          String contentType = getContentType(name);//读取内容类型          if (contentType != null) {            response.setContentType(contentType);//重新设置内容类型          }         ...          try {           //将读取到的文件流以每次复制4096个字节的方式循环输出            copy(is, response.getOutputStream());          } finally {            is.close();          }          return;        }      }    }  }

?

如果用户请求的资源不是以/struts开头——可能是.jsp文件,也可能是.html文件,则通过过滤器链继续往下传送,直到到达请求的资源为止。
如果getMapping()方法返回有效的ActionMapping对象,则被认为正在请求某个Action,将调用Dispatcher.serviceAction(request, response, servletContext, mapping)方法,该方法是处理Action的关键所在。

本文到此结束,下一篇讲讲serviceAction,并以此结束struts2的源码之旅。

下一篇:http://mazhiyuan.iteye.com/blog/1202128

读书人网 >开源软件

热点推荐