5、Eternal框架-处理者

处理者Handler.java,处理所有的请求,包括控制器,静态资源。Handler

静态资源:通过流输出静态资源。

括控制器通过请求的url向持有者申请,请求的控制器、拦截器,然后调用控制器,把给过交给渲染者。

Handler.java代码:

package cn.eternal.handler;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.eternal.MultipartServlet;
import cn.eternal.config.CommonsConfig;
import cn.eternal.container.Container;
import cn.eternal.interceptor.InterceptorChain;
import cn.eternal.renderer.Renderer;
import cn.eternal.util.ActionContext;
import cn.eternal.util.ConverterUtil;

public class Handler {
	private ServletContext servletContext;
	private ConverterUtil converterUtil = new ConverterUtil();
    public void handle(String url,HttpServletRequest request, HttpServletResponse response,ServletContext servletContext) throws Exception {
    	MappingHandler matcher = null;
        Execution execution = null;
        MappingHandler[] MappingHandlers = Container.getMappingHandlers();
        for (int n=0;n<MappingHandlers.length;n++) {
        	matcher = MappingHandlers[n];
            String[] args = matcher.getMatchedParameters(url);
            if (args!=null) {
            	InstanceHandler instanceHandler = Container.getMhih().get(matcher);
                Object[] arguments = new Object[args.length];
                for (int i=0; i<args.length; i++) {
                    Class<?> type = instanceHandler.arguments[i];
                    if (type.equals(String.class))
                        arguments[i] = args[i];
                    else
                        arguments[i] = converterUtil.convert(type, args[i]);
                }
                execution = new Execution(instanceHandler, arguments);
                break;
            }
        }
        this.servletContext = servletContext;
        if (execution==null) {
        	StaticFileHandler staticFileHandler = new StaticFileHandler(this.servletContext);
        	staticFileHandler.handle(request, response);
        }else{
	    	if (MultipartServlet.isMultipartRequest(request)) {
	            request = new MultipartServlet(request, CommonsConfig.getMaxFileSize());
	        }
	        ActionContext.setActionContext(servletContext, request, response);
	        try {
	        	InterceptorChain chains = new InterceptorChain(Container.getInterceptors(matcher));
	            chains.doInterceptor(execution);
	            Object result = execution.execute();
	            handleResult(request, response, result);
	        }
	        finally {
	            ActionContext.removeActionContext();
	        }
        }
    }

    void handleResult(HttpServletRequest request, HttpServletResponse response, Object result) throws Exception {
        if (result==null)
            return;
        if (result instanceof Renderer) {
            Renderer r = (Renderer) result;
            r.render(this.servletContext, request, response);
            return;
        }
        if (result instanceof String) {
            String s = (String) result;
            if (s.startsWith("/")) {
                response.sendRedirect(request.getContextPath()+s);
                return;
            }
            return;
        }
        throw new ServletException("Cannot handle result with type '" + result.getClass().getName() + "'.");
    }
}

你可能感兴趣的:(mvc,框架,IOC,控制器)