struts2源码浅析(三)
接上篇http://mazhiyuan.iteye.com/blog/1202086,本文着重dispatcher和filter的探讨。
?
Dispatcher已经在之前讲过,FilterDispatcher是Struts2的核心控制器,首先看一下init()方法。
?
doFilter方法,struts2中最富盛名的方法了,每当有一个Request,都会调用这些Filters的doFilter方法
先来张图
??
从代码中看出,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