关于DispatherServlet(手写)

xiaoxiao2025-04-20  14

DispatherServlet在Spring中充当一个前端控制器的角色,他的核心功能就是分发请求,请求会被分发给对应处理的类MSpringMVC中称为handle。接下来我们就去实现这个分发请求。框架的实现一般离不开反射代理,这次我们手动写DispatherServlet也是一样。简单的映射处理

首先接收一下几个文件

1.userInfoController:这个设计处理请求的类 并且具有返回值

2.DispatherServlet:主要是对请求进行分发,那个请求执行那个方法

3.applicationContext.xml:模拟Spring中的applicationContext.xml 

4.web.xml:注册前端控制器

(1)UserInfoController.java

package controller; public class UserInfoController { public String delete() { System.out.println("在这里我进行了删除用户的操作!"); return "index"; } }

(2)DispatherServlet.java

package servlet; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class DispatherServlet extends HttpServlet{ private static final long serialVersionUID = 1L; /* * 说明:DispatherServlet 主要对*.spring的请求做出处理 * 对请求进行拦截解析分发 */ //使用集合来保存 private Map<String,Element> map = new HashMap<String,Element>(); public void init(ServletConfig config) throws ServletException { //在初始化的部分 主要对.xml文件进行解析 //将XML文件转成流的形式 try { InputStream is = DispatherServlet.class.getClassLoader() .getResourceAsStream("applicationContext.xml"); //使用文件工厂 DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(is); //获取到根节点 Element root = doc.getDocumentElement(); //获取所有的节点为bean的节点 NodeList list = root.getElementsByTagName("bean"); //将方法名和该节点保存到map集合中 for(int i=0;i<list.getLength();i++) { Element e = (Element)list.item(i); String k =e.getAttribute("url"); map.put(k, e); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } //处理get post请求 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //获取请求的URL String url = request.getRequestURI(); //对URL进行拆分解析 /userInfo/delete.spring // 获取到方法的名称 String methodName = url.substring(url.lastIndexOf("/")+1, url.lastIndexOf(".")); url=url.substring(0,url.lastIndexOf("/")); //获取到该方法所在的类名 String objName = url.substring(url.lastIndexOf("/")+1); System.out.println(methodName+" "+objName); //拿到元素节点 Element e = map.get(objName); // 获取到类的完整路径 String classPath = e.getAttribute("class"); //获取该路径 的Class类信息 Class<?> c = Class.forName(classPath); //生成实例 Object obj = c.newInstance(); //根据类名生成方法 Method method = c.getMethod(methodName, new Class[] {}); //执行方法 得到返回值 Object value = method.invoke(obj, new Object[] {}); //进行视图解析器 解析 同样需要反射 进行拼接 在这我是用重定向 response.sendRedirect("../"+value+".jsp"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

3.applicatipnContext.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xml> <beans> <bean id="ui" class="controller.UserInfoController" url="userInfo"/> </beans>

4.web.xml

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>dispather</servlet-name> <servlet-class>servlet.DispatherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>dispather</servlet-name> <url-pattern>*.spring</url-pattern> </servlet-mapping> </web-app>

 

转载请注明原文地址: https://www.6miu.com/read-5028690.html

最新回复(0)