读书人

Xwork2 源码翻阅(一)

发布时间: 2012-11-08 08:48:11 作者: rapoo

Xwork2 源码阅读(一)

利用工作之余,看了一下xwork2 的源码,借此学学设计模式,
并仿照Struts2 和 xwork2, 写了一个简单的mvc框架。

?

这东西容易忘,遂把这段时间的成果整理一下,不然过段时间忘光了就可惜了。
写的也比较粗糙,望大家多提意见,一起学习提高。

我的email : shaolz1982@gmail.com

?

内容:
xwork-2.1.1 源码,
部分struts-2.0.11.2源码 (核心代码为 xwork-2.1.1, 在其上增加了部分外围功能),
?
Action 调用过程:

FilterDispatcher -> Dispatcher ->

DefaultActionProxy ->DefaultActionInvocation,Interceptor -> Result

?

web.xml

?

                <filter><filter-name>minimvc</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>minimvc</filter-name><url-pattern>/*.action</url-pattern></filter-mapping>

?

在web.xml中定义mvc 中转类,

FilterDispatcher:

?

看下源码:

?

public class FilterDispatcher implements StrutsStatics, Filter {

?

可以看到 FilterDispatcher 是一个 Filter, 而不是像struts1.x 一样的 servlet。

?

当我们提交请求时, 请求会先进入这个filter,执行 doFilter 方法。

?

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {        HttpServletRequest request = (HttpServletRequest) req;        HttpServletResponse response = (HttpServletResponse) res;        ServletContext servletContext = getServletContext();        String timerKey = "FilterDispatcher_doFilter: ";        try {            UtilTimerStack.push(timerKey);            request = prepareDispatcherAndWrapRequest(request, response);            ActionMapping mapping;            try {                mapping = actionMapper.getMapping(request, dispatcher.getConfigurationManager());            } catch (Exception ex) {                LOG.error("error getting ActionMapping", ex);                dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex);                return;            }            if (mapping == null) {                // there is no action in this request, should we look for a static resource?                String resourcePath = RequestUtils.getServletPath(request);                if ("".equals(resourcePath) && null != request.getPathInfo()) {                    resourcePath = request.getPathInfo();                }                if (serveStatic && resourcePath.startsWith("/struts")) {                    String name = resourcePath.substring("/struts".length());                    findStaticResource(name, request, response);                } else {                    // this is a normal request, let it pass through                    chain.doFilter(request, response);                }                // The framework did its job here                return;            }            dispatcher.serviceAction(request, response, servletContext, mapping);        } finally {            try {                ActionContextCleanUp.cleanUp(req);            } finally {                UtilTimerStack.pop(timerKey);            }        }    }

?

?其中

?

request = prepareDispatcherAndWrapRequest(request, response);

?

对 request 进行一些处理,如设置字符集。

mapping = actionMapper.getMapping(request, dispatcher.getConfigurationManager());

?

对request请求进行判断,如果是调用的action,则返回非空的 ActionMapping

?

public class ActionMapping {    private String name;    private String namespace;    private String method;    private Map params;    private Result result;

?

ActionMapping 是struts2 定义的一个类,内容是action的一些描述信息,

类似 xwork2 里边的 ActionConfig。

(关于这一步骤以及涉及的类,里边东西也不少,并没有仔细看,以后有机会在补充)

如非空,说明是要调用action, 进入框架的 Action调用流程,

?

?

dispatcher.serviceAction(request, response, servletContext, mapping);

?

?

读书人网 >软件架构设计

热点推荐