SpringMVC-DispatcherServlet的原理

Controller类

package mvc;

import javax.servlet.http.HttpServletRequest;
import entity.User;

public class Controller {
   @RequestMapping("/login.do")
   public String showLogin() {
   	return "login";
   }
   @RequestMapping("/handle_login.do")
   public String handleLogin(User user) {
   	System.out.println(user);
   	return "reg";
   }
   @RequestMapping("/reg.do")
   public String showRed(HttpServletRequest req) {
   	return "reg";
   }
}

DispatchServlet类

package mvc;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class DispatchServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private HandlerMapping hm;
	@Override
	public void init() throws ServletException {
		hm = new HandlerMapping();
		SAXReader read = new SAXReader();
		String path = getInitParameter("config");
		InputStream in = getClass().getClassLoader().getResourceAsStream(path);
		try {
			Document doc = read.read(in);
			Element root = doc.getRootElement();
			List<Element> bs = root.elements("bean");
			for(Element b : bs) {
				String className = b.attributeValue("class");
				hm.parseController(className);
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String contextPath = request.getContextPath();
		String path = request.getRequestURI();
		System.out.println(path);
		Handler handler = hm.getHandler(path.substring(contextPath.length()));
		try {
			if(handler!=null) {
				path = handler.execute(request);
				path = "/WEB-INF/jsp/"+path+".jsp";
				request.getRequestDispatcher(path).forward(request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("系统错误!");
		}
	}
}

EncodingFilter类

package mvc;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Servlet Filter implementation class EncodingFilter
 */
public class EncodingFilter implements Filter {

    /**
     * Default constructor. 
     */
    public EncodingFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here

		// pass the request along the filter chain
		request.setCharacterEncoding("UTF-8");
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}
}

Handler类

package mvc;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;

public class Handler {
	private Object controller;
	private Method me;
	public Handler() {
	}
	public Handler(Object controller, Method me) {
		super();
		this.controller = controller;
		this.me = me;
	}
	public String execute(HttpServletRequest req) throws Exception{
		int count = me.getParameterCount();
		if(count==1) {
			Class<?>[] classes = me.getParameterTypes();
			for(Class cls : classes) {
				System.out.println("参数完全限定名:"+cls.getName());
				if(cls.getName().equals("javax.servlet.http.HttpServletRequest")) {
					return (String) me.invoke(controller,req);
				}
				// 通过字段名来获取到请求参数的值, 将所有方法名和方法装到一个map中,再通过set+"(通过请求来获取)属性名首字母大写",找到对应的方法,执行这个方法,传入实例,再传入参数(请求参数的值) 
				Method[] mes = cls.getDeclaredMethods();
				Object o = cls.newInstance();
				Map<String,Method> map = new HashMap<String,Method>();
				for(Method me : mes) {
					map.put(me.getName(), me);
				}
				Map<String, String[]> map2 = req.getParameterMap();
				Set<String> keySet = map2.keySet();
				for(String key : keySet) {
					System.out.println("属性名:"+key);
					String par = req.getParameter(key); //这是属性的值
					String last = key.substring(1);
					String fir = String.valueOf(key.charAt(0)).toUpperCase();
					key = fir+last;
					Method me = map.get("set"+key);
					me.invoke(o, par);
				}
				return (String) me.invoke(controller, o);
			}
		}
		return (String) me.invoke(controller);
	}
}

HandlerMapping类

package mvc;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.message.callback.PrivateKeyCallback.Request;

public class HandlerMapping {
	private Map<String,Handler> map = new HashMap<String,Handler>();
	public void parseController(String className) {
		try {
			Class<?> cls = Class.forName(className);
			Method[] mes = cls.getDeclaredMethods();
			for(Method me : mes) {
				RequestMapping ann = me.getAnnotation(RequestMapping.class);
				if(ann!=null) {
					String value = ann.value();
					map.put(value, new Handler(cls.newInstance(),me));
				}
			}
			System.out.println(map);
			System.out.println("初始化完毕!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public Handler getHandler(String url) {
		return map.get(url);
	}
}

RequestMapping注解

package mvc;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target(METHOD)
public @interface RequestMapping {
	String value();
}

mvc.xml文件内容

<beans>
	<bean class="mvc.Controller"></bean>
</beans>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值