Struts2处理请求过程分析

 

public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter {

    protected PrepareOperations prepare;// 进行请求预处理操作
    protected ExecuteOperations execute;// 执行请求逻辑执行处理
    protected List<Pattern> excludedPatterns = null;// 不被struts处理的url排除列表

    public void init(FilterConfig filterConfig) throws ServletException {
        InitOperations init = new InitOperations();
        Dispatcher dispatcher = null;
        try {
            FilterHostConfig config = new FilterHostConfig(filterConfig);
            // 初始化struts内部日志
            init.initLogging(config);
            // 初始化Dispatcher
            dispatcher = init.initDispatcher(config);
            // 初始化静态资源加载器
            init.initStaticContentLoader(config, dispatcher);

            // 初始化进行预处理的操作类
            prepare = new PrepareOperations(dispatcher);
            // 初始化进行请求处理的逻辑执行的操作类
            execute = new ExecuteOperations(dispatcher);
            // 初始化url排除列表
            this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);

            // 用户可扩展的初始化操作
            postInit(dispatcher, filterConfig);
        } finally {
            // 初始化后的清理工作
            if (dispatcher != null) {
                dispatcher.cleanUpAfterInit();
            }
            init.cleanup();
        }
    }

    /**
     * Callback for post initialization
     */
    protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig) {
    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        try {
            // 1.如果当前url在排除列表中,则跳过当前处理
            if (excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
                chain.doFilter(request, response);
            } else {
                // 设置编码和国际化
                prepare.setEncodingAndLocale(request, response);
                // 创建Action上下文
                prepare.createActionContext(request, response);
                // 将Dispatcher实例绑定(存储)到当前线程
                prepare.assignDispatcherToThread();
                // 为了文件上传multipart/form-data,包装request
                request = prepare.wrapRequest(request);
                // 查找能处理请求的Action映射
                ActionMapping mapping = prepare.findActionMapping(request, response, true);

                // 找不到Action映射,则尝试将该请求当作静态资源请求处理了
                if (mapping == null) {
                    // 尝试执行静态资源请求
                    boolean handled = execute.executeStaticResourceRequest(request, response);
                    // 不能处理
                    if (!handled) {
                        chain.doFilter(request, response);
                    }
                } else {// 找到了对应的Action映射,则执行action
                    execute.executeAction(request, response, mapping);
                }
            }
        } finally {
            // 做一些清理工作
            prepare.cleanupRequest(request);
        }
    }

    public void destroy() {
        prepare.cleanupDispatcher();
    }

}

 

转载于:https://www.cnblogs.com/rouqinglangzi/p/7158271.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值