SSM框架流程及原理分析

您所在的位置:网站首页 ssm框架实验报告 SSM框架流程及原理分析

SSM框架流程及原理分析

2022-10-04 14:12| 来源: 网络整理| 查看: 265

前言:学ssm框架已经有很长时间,今天来复习一下 SSM图示流程:

在这里插入图片描述

Spring核心:Java反射 Mybatis:动态代理,而动态代理又是基于反射的,所以,ssm框架核心原理在反射。 (1)Spring(对象工厂): 平时开发接触最多的估计就是这个IOC容器,它可以装载bean(也就是Java中的类,当然也包括service、dao里面的),有了这个机制,就不用在每次使用这个类的时候为它初始化,很少看到关键字new。 (2)SpringMVC(视图控制器): 核心为一个DispatcherServlet,控制所有请求 这里奉上手写SpringMVC的核心DispatcherServlet源码

package servlet; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import annotation.HController; import annotation.HRequestMapping; /** * 手写SpringMVC * * @author hxz * @description TODO * @data 2020年1月2日 上午9:39:57 */ public class MyDispatcherServlet extends HttpServlet { //加载属性文件 private Properties properties = new Properties(); //装载beanname private List classNames = new ArrayList(); //ioc容器 private Map ioc = new HashMap(); //类似于以前自定义的cache缓存容器,这里也是起到一个容器的作用 //用于加载各个mapping private Map handlerMapping = new HashMap(); //容器加载所有的controller private Map controllerMap = new HashMap(); @Override public void init(ServletConfig config) throws ServletException { // 1.加载配置文件 doLoadConfig(config.getInitParameter("contextConfigLocation")); // 2.初始化所有相关联的类,扫描用户设定的包下面所有的类 doScanner(properties.getProperty("scanPackage")); // 3.拿到扫描到的类,通过反射机制,实例化,并且放到ioc容器中beanName默认是首字母小写 doInstance(); // 4.初始化HandlerMapping(将url和method对应上) initHandlerMapping(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { // 处理请求 doDispatch(req, resp); } catch (Exception e) { resp.getWriter().write("500!! Server Exception"); } } private void doDispatch(HttpServletRequest req, HttpServletResponse resp) throws Exception { if (handlerMapping.isEmpty()) { return; } String url = req.getRequestURI(); String contextPath = req.getContextPath(); url = url.replace(contextPath, "").replaceAll("/+", "/"); if (!this.handlerMapping.containsKey(url)) { resp.getWriter().write("404 NOT FOUND!"); return; } Method method = this.handlerMapping.get(url); // 获取方法的参数列表 Class[] parameterTypes = method.getParameterTypes(); // 获取请求的参数 Map parameterMap = req.getParameterMap(); // 保存参数值 Object[] paramValues = new Object[parameterTypes.length]; // 方法的参数列表 for (int i = 0; i < parameterTypes.length; i++) { // 根据参数名称,做某些处理 String requestParam = parameterTypes[i].getSimpleName(); if (requestParam.equals("HttpServletRequest")) { // 参数类型已明确,这边强转类型 paramValues[i] = req; continue; } if (requestParam.equals("HttpServletResponse")) { paramValues[i] = resp; continue; } if (requestParam.equals("String")) { for (Entry param : parameterMap.entrySet()) { String value = Arrays.toString(param.getValue()).replaceAll("\\[|\\]", "").replaceAll(",\\s", ","); paramValues[i] = value; } } } // 利用反射机制来调用 try { method.invoke(this.controllerMap.get(url), paramValues);// 第一个参数是method所对应的实例 // 在ioc容器中 } catch (Exception e) { e.printStackTrace(); } } private void doLoadConfig(String location) { // 把web.xml中的contextConfigLocation对应value值的文件加载到流里面 InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(location); try { // 用Properties文件加载文件里的内容 properties.load(resourceAsStream); } catch (IOException e) { e.printStackTrace(); } finally { // 关流 if (null != resourceAsStream) { try { resourceAsStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } private void doScanner(String packageName) { // 把所有的.替换成/ URL url = this.getClass().getClassLoader().getResource("/" + packageName.replaceAll("\\.", "/")); File dir = new File(url.getFile()); for (File file : dir.listFiles()) { if (file.isDirectory()) { // 递归读取包 doScanner(packageName + "." + file.getName()); } else { String className = packageName + "." + file.getName().replace(".class", ""); classNames.add(className); } } } //利用java的反射机制 private void doInstance() { if (classNames.isEmpty()) { return; } for (String className : classNames) { try { // 把类搞出来,反射来实例化 Class clazz = Class.forName(className); if (clazz.isAnnotationPresent(HController.class)) { ioc.put(toLowerFirstWord(clazz.getSimpleName()), clazz.newInstance()); } else { continue; } } catch (Exception e) { e.printStackTrace(); continue; } } } private void initHandlerMapping() { if (ioc.isEmpty()) { return; } try { for (Entry entry : ioc.entrySet()) { Class


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3