轻量级java web实践-3(框架源码-1)

从这里开始,web.xml

<filter>
    <filter-name>dispatcher</filter-name>
    <filter-class>org.express.portal.DispatcherFilter</filter-class>
    <init-param>
        <param-name>container</param-name>
        <param-value>Guice</param-value>
    </init-param>
    <init-param>
        <param-name>maxFileSize</param-name>
        <param-value>104857600</param-value>
    </init-param>
    <init-param>
        <param-name>modules</param-name>
        <param-value>com.cbc.tv.portal.PortalModule</param-value>
    </init-param>
    <init-param>
        <param-name>template</param-name>
        <param-value>Velocity</param-value>
    </init-param>
</filter>

从上面的filter,DispatcherFilter是起点

源码如下:

public class DispatcherFilter implements Filter
{
    private final Logger log = LoggerFactory.getLogger(getClass());
    private Dispatcher dispatcher;
    public void init(final FilterConfig filterConfig) throws ServletException
    {
        log.info("Init DispatcherFilter...");
        this.dispatcher = new Dispatcher();
        this.dispatcher.init(new Config()
        {
            public String getInitParameter(String name)
            {
                return filterConfig.getInitParameter(name);
            }
            public ServletContext getServletContext()
            {
                return filterConfig.getServletContext();
            }
        });
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException
    {
        HttpServletRequest httpReq = (HttpServletRequest) req;
        HttpServletResponse httpResp = (HttpServletResponse) resp;
        String method = httpReq.getMethod();if ("GET".equals(method) || "POST".equals(method))
        {
            if (!dispatcher.service(httpReq, httpResp))
                chain.doFilter(req, resp);return;
        }
        httpResp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
    }
    
    public void destroy()
    {
        log.info("Destroy DispatcherFilter...");this.dispatcher.destroy();
    }

Dispatcher.java

void initTemplateFactory(Config config)
    {
        String name = config.getInitParameter("template");if (name == null)
        {
            name = JspTemplateFactory.class.getName();
            log.info("No template factory specified. Default to '" + name + "'.");
        }
        TemplateFactory tf = Utils.createTemplateFactory(name);
        tf.init(config);
        log.info("Template factory '" + tf.getClass().getName() + "' init ok.");
        TemplateFactory.setTemplateFactory(tf);
    }

    void initComponents(List<Object> beans)
    {
        List<Interceptor> intList = new ArrayList<Interceptor>();for (Object bean : beans)
        {
            if (bean instanceof Interceptor)
                intList.add((Interceptor) bean);
            if (this.exceptionHandler == null && bean instanceof ExceptionHandler)this.exceptionHandler = (ExceptionHandler) bean;
                addActions(bean);
        }

        if (this.exceptionHandler == null)
            this.exceptionHandler = new DefaultExceptionHandler();
        this.interceptors = intList.toArray(new Interceptor[intList.size()]);

        // sort interceptors by its annotation of 'InterceptorOrder':
        Arrays.sort(this.interceptors, new Comparator<Interceptor>()
        {
            public int compare(Interceptor i1, Interceptor i2)
            {
                InterceptorOrder o1 = i1.getClass().getAnnotation(InterceptorOrder.class);
                InterceptorOrder o2 = i2.getClass().getAnnotation(InterceptorOrder.class);int n1 = o1 == null ? Integer.MAX_VALUE : o1.value();int n2 = o2 == null ? Integer.MAX_VALUE : o2.value();if (n1 == n2)return i1.getClass().getName().compareTo(i2.getClass().getName());return n1 < n2 ? (-1) : 1;
            }
        });

        this.urlMatchers = urlMap.keySet().toArray(new UrlMatcher[urlMap.size()]);
        // sort url matchers by its url:
        Arrays.sort(this.urlMatchers, new Comparator<UrlMatcher>()
        {
            public int compare(UrlMatcher o1, UrlMatcher o2)
            {
                String u1 = o1.url;
                String u2 = o2.url;int n = u1.compareTo(u2);
                if (n == 0)throw new ConfigException("Cannot mapping one url '" + u1 + "' to more than one action method.");return n;
            }
        });
    }

    // find all action methods and add them into urlMap:
    void addActions(Object bean)
    {
        Class<?> clazz = bean.getClass();
        Method[] ms = clazz.getMethods();for (Method m : ms)
        {
            if (isActionMethod(m))
            {
                Mapping mapping = m.getAnnotation(Mapping.class);
                String url = mapping.value();
                UrlMatcher matcher = new UrlMatcher(url);
                if (matcher.getArgumentCount() != m.getParameterTypes().length)
                {
                    warnInvalidActionMethod(m, "Arguments in URL '" + url + "' does not match the arguments of method.");continue;
                }
                log.info("Mapping url '" + url + "' to method '" + m.toGenericString() + "'.");
                urlMap.put(matcher, new Action(bean, m));
            }
        }
    }

    public boolean service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        String url = req.getRequestURI();
        String path = req.getContextPath();if (path.length() > 0)
            url = url.substring(path.length());
        // set default character encoding to "utf-8" if encoding is not set:

        if (req.getCharacterEncoding() == null)
            req.setCharacterEncoding("UTF-8");if (log.isDebugEnabled())
        log.debug("Handle for URL: " + url);
        Execution execution = null;for (UrlMatcher matcher : this.urlMatchers)
        {
            String[] args = matcher.getMatchedParameters(url);if (args != null)
            {
                Action action = urlMap.get(matcher);
                Object[] arguments = new Object[args.length];for (int i = 0; i < args.length; i++)
                {
                    Class<?> type = action.arguments[i];if (type.equals(String.class))
                        arguments[i] = args[i];elsearguments[i] = converterFactory.convert(type, args[i]);
                }
                execution = new Execution(req, resp, action, arguments);break;
            }
        }

        if (execution != null)
        {
            handleExecution(execution, req, resp);
        }
        return execution != null;
    }

你可能感兴趣的:(java,Web)