二. 手写SpringMVC框架

1 新建DispatcherServlet

1.2 在src目录下,新建applicationContext.xml

1.3 在 Dispatcher S ervlet 的构造方法中解析a pplicationContext.xml 配置文件

import java.io.IOException;

import java.io.InputStream;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

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.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

@WebServlet(“*.do”)

public class DispatcherServlet extends HttpServlet {

private Map

public DispatcherServlet() {

try {

InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(“applicationContext.xml”);

// 1,通过工厂模式,创建documentBuilderFactory 工厂对象

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory. newInstance();

// 2,创建DocumentBuilder 对象

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

// 3,得到Document 对象(注意导入org.w3c.dom 包中的)

Document document = documentBuilder.parse(inputStream);

// 4,获得所有的bean 标签

NodeList nodeList = document.getElementsByTagName(“bean”);

for (int i = 0; i < nodeList.getLength(); i++) {

Node node = nodeList.item(i);

if(node.getNodeType() == Node. ELEMENT_NODE) {

//(注意导入org.w3c.dom 包中的)

//强转成Element 类的对象,里面有比Node 类更方便的方法

Element element = (Element)node;

String id = element.getAttribute(“id”);

String className = element.getAttribute(“class”);

boolean flag = map.containsKey(id);

if(flag == true)

return;

Object o = Class. forName(className).newInstance();

map.put(id, o);

} catch (ParserConfigurationException | SAXException | IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e) {

e.printStackTrace();

@Override

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//设置编码

request.setCharacterEncoding(“UTF-8”);

response.setCharacterEncoding(“UTF-8”);

response.setContentType(“text/html;charset=UTF-8”);

//假设url 是:http://localhost:8080/mymvc2/hello.do

// ServletPath 是Servlet 的访问路径: /hello.do

// 思路是:

// 第1 步:/hello.do -> hello 或者/book.do -> book

// 第2 步:hello -> HelloController 或者book -> BookController

String servletPath = request.getServletPath(); // /hello.do

int lastDotIndex = servletPath.lastIndexOf(“.do”);

servletPath = servletPath.substring(1, lastDotIndex); // hello

1.4 在DispatcherServlet的service方法中,通过ServletPath获取对应的Controller对象,优化反射的代码

@Override

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//设置编码

request.setCharacterEncoding(“UTF-8”);

response.setCharacterEncoding(“UTF-8”);

response.setContentType(“text/html;charset=UTF-8”);

//假设url 是:http://localhost:8080/mymvc2/hello.do

// ServletPath 是Servlet 的访问路径: /hello.do

// 思路是:

// 第1 步:/hello.do -> hello 或者/book.do -> book

// 第2 步:hello -> HelloController 或者book -> BookController

String servletPath = request.getServletPath(); // /hello.do

int lastDotIndex = servletPath.lastIndexOf(“.do”);

servletPath = servletPath.substring(1, lastDotIndex); // hello

//通过ServletPath 获取对应的Controller 对象

Object xxxController = map.get(servletPath);

String ac = request.getParameter(“ac”);

System. out.println(“=======” + ac + “======”);

if (StringUtil. isEmpty(ac))

ac = “index”;

try {

//这里只能try…catch 异常,因为在重写的方法里,不能抛出比父类更大的异常

Method method = xxxController.getClass().getDeclaredMethod(ac, HttpServletRequest. class,HttpServletResponse. class);

if (method != null) {

method.invoke(xxxController, request, response);

} else {

throw new RuntimeException(“ac 值违法”);

} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {

e.printStackTrace();

1.5 写一个简单的EmpController

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class EmpController {

public void index(HttpServletRequest request,HttpServletResponse response) {

System. out.println(“EmpController…index”);

(代码格式问题各位大佬别吐槽,复制过来的有时间改)

Original: https://www.cnblogs.com/lijili/p/16102947.html
Author: 雾里看瓜
Title: 二. 手写SpringMVC框架

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622022/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球