广告
返回顶部
首页 > 资讯 > 精选 >SSM框架的示例分析
  • 424
分享到

SSM框架的示例分析

2023-06-15 09:06:40 424人浏览 八月长安
摘要

这篇文章主要为大家展示了“SSM框架的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SSM框架的示例分析”这篇文章吧。SSM图示流程:spring核心:Java反射mybatis:动态代

这篇文章主要为大家展示了“SSM框架的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SSM框架的示例分析”这篇文章吧。


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;public class MyDispatcherServlet extends HttpServlet {   //加载属性文件private Properties properties = new Properties();    //装载beannameprivate List<String> classNames = new ArrayList<String>();//ioc容器private Map<String, Object> ioc = new HashMap<String, Object>();    //类似于以前自定义的cache缓存容器,这里也是起到一个容器的作用    //用于加载各个mappingprivate Map<String, Method> handlerMapping = new HashMap<String, Method>();    //容器加载所有的controllerprivate Map<String, Object> controllerMap = new HashMap<String, Object>();@Overridepublic 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();}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected 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<String, String[]> 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<String, String[]> 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<String, Object> entry : ioc.entrySet()) {Class<? extends Object> clazz = entry.getValue().getClass();if (!clazz.isAnnotationPresent(HController.class)) {continue;}// 拼url时,是controller头的url拼上方法上的urlString baseUrl = "";if (clazz.isAnnotationPresent(HRequestMapping.class)) {HRequestMapping annotation = clazz.getAnnotation(HRequestMapping.class);baseUrl = annotation.value();}Method[] methods = clazz.getMethods();for (Method method : methods) {if (!method.isAnnotationPresent(HRequestMapping.class)) {continue;}HRequestMapping annotation = method.getAnnotation(HRequestMapping.class);String url = annotation.value();url = (baseUrl + "/" + url).replaceAll("/+", "/");handlerMapping.put(url, method);controllerMap.put(url, clazz.newInstance());System.out.println(url + "," + method);}}} catch (Exception e) {e.printStackTrace();}}private String toLowerFirstWord(String name) {char[] charArray = name.toCharArray();charArray[0] += 32;return String.valueOf(charArray);}}

从源码及可看出流程:
1)客户端发送请求到DispacherServlet(由web.xml拦截所有请求到改servlet);

2)由DispacherServlet(核心servlet)控制器查询HanderMapping,找到处理请求的Controller;(这里我用了一个map类似于缓存容器,装载所有的mapping即映射)

3)Controller层调用业务逻辑处理后,返回ModelAndView,即下一层(往往是service、serviceimpl,mapper层)返回的的数据;

4)DispacherSerclet查询视图解析器,找到ModelAndView指定的视图;

5)视图负责将结果显示到客户端。
(3)Mybatis(持久层框架):mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再通过得到Mapper文件sqlSession.getMapper()最后调用的是JDK的动态代理(exlipse一直Ctrl+鼠标左键点击到最后发现如此,源码附上)。

 protected T newInstance(MapperProxy<T> mapperProxy) {    return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);

发人员只需要创建Mapper接口,并使用Mapper接口即可。Mybatis会对Mapper接口产生动态代理对象,这个动态代理对象实现了Mapper接口,拥有Mapper中定义的所有方法,并对这些方法进行了增强。增强的逻辑是获得sql语句和执行sql语句。
动态代理:

  • 通过实现 InvocationHandler 接口创建自己的调用处理器;

  • 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;

  • 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;

  • 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。

框架核心原理

  • aop 面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理。Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP。提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上。允许用户实现自定义切面,用AOP来完善OOP的使用可以把Spring AOP看作是对Spring的一种增强。AOP的实现乃至spring框架基本上核心代码都是基于Java语言的反射机制(所谓的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。)。

  • AOP主要作用就是不通过修改源代码的方式、将非核心功能代码织入来实现对方法的增强。那么Spring AOP的底层如何实现对方法的增强?实现的关键在于使用了代理模式。代理模式的作用就是为其它对象提供一种代理,以控制对这个对象的访问,用于解决在直接访问对象时带来的各种问题,比如要访问的对象在远程的机器上。在面向对象系统中,由于其他某些原因(对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问)等

  • 代理主要分为两种方式:静态代理和动态代理

  • IOC IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以相较于传统的java servlet需要自己request.getParamiter等需要一系列取值,转换中文,转换值类型的繁琐,更重要的是使得程序的整个体系结构变得非常灵活。

  • 自定义一个IOC容器的思路:

  • Map做一个容器,然后用解析xml文件的工具解析出需要扫描的包。利用Java反射机制拿到具有的方法,属性,注入到Map容器中

  • DI 依赖注入,是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态地将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

以上是“SSM框架的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: SSM框架的示例分析

本文链接: https://www.lsjlt.com/news/279441.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SSM框架的示例分析
    这篇文章主要为大家展示了“SSM框架的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SSM框架的示例分析”这篇文章吧。SSM图示流程:Spring核心:Java反射Mybatis:动态代...
    99+
    2023-06-15
  • SSM框架下各层的示例分析
    这篇文章给大家分享的是有关SSM框架下各层的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SSM框架SSM框架是spring MVC ,Spring和Mybatis框架的整合,是标准的MVC模式,将整个系...
    99+
    2023-06-29
  • idea中ssm框架编码问题的示例分析
    这篇文章主要为大家展示了“idea中ssm框架编码问题的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“idea中ssm框架编码问题的示例分析”这篇文章吧。idea中ssm框架的编码问题介...
    99+
    2023-06-15
  • SSM框架整合之Spring+SpringMVC+MyBatis的示例分析
    这篇文章主要介绍了SSM框架整合之Spring+SpringMVC+MyBatis的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、基本概念1.1、SpringSp...
    99+
    2023-06-15
  • SSM框架下结合log4j、slf4j打印日志的示例分析
    这篇文章主要介绍SSM框架下结合log4j、slf4j打印日志的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:首先加入log4j和slf4j的jar包 <!-- 日志处理&...
    99+
    2023-05-30
    log4j ssm slf4j
  • Flask框架的示例分析
    这篇文章主要介绍Flask框架的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对于python中的框架来说,虽然有一些大型的框架可以供我们挑选,但有时候我们处理数据用不到那么难的框架,这样反而会增加处理数据的...
    99+
    2023-06-14
  • SpringMVC框架的示例分析
    小编给大家分享一下SpringMVC框架的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简介SpringMVC采用模型(Model)-视图(View)-控...
    99+
    2023-06-02
  • CSS框架sass的示例分析
    这期内容当中小编将会给大家带来有关CSS框架sass的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。sass结尾的文件有着更严格的格式要求,scss文件更贴近原生...
    99+
    2022-10-19
  • html中框架的示例分析
    小编给大家分享一下html中框架的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 框架是什么?框架就是在一个窗口可以显...
    99+
    2022-10-19
  • SSM框架流程及原理分析
    前言:学ssm框架已经有很长时间,今天来复习一下 SSM图示流程: Spring核心:Java反射 Mybatis:动态代理,而动态代理又是基于反射的,所以,ssm框架核心原理在反...
    99+
    2022-11-12
  • CSS框架开发的示例分析
    这期内容当中小编将会给大家带来有关CSS框架开发的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 Philip Walton 在AppFolio担任前端工程师,他...
    99+
    2022-10-19
  • 使用flexible.js框架的示例分析
    这篇文章主要介绍使用flexible.js框架的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!基本概念1、视窗viewport可能写过移动端的朋友就知道viewport是什么...
    99+
    2022-10-19
  • php开发框架的示例分析
    这篇文章给大家分享的是有关php开发框架的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、LaravelLaravel是一款免费并且开源的PHP应用框架,它是为开发基于MVC的WEB应用而设计的,个人觉...
    99+
    2023-06-14
  • java框架整合的示例分析
    java框架整合的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。框架整合:Springmvc + Mybatis + Shiro(权限) + REST(服务) + We...
    99+
    2023-06-05
  • php中laravel框架的示例分析
    这篇文章主要介绍了php中laravel框架的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。laravel的安装首先安装laravel之前要安装composer,如果...
    99+
    2023-06-15
  • SimpleCommand框架ImageLoader API的示例分析
    这篇文章主要介绍SimpleCommand框架ImageLoader API的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在ImageLoader中有以下几个不同的构造器: public ...
    99+
    2023-05-30
    simplecommand imageloader
  • PHP之CI框架的示例分析
    这篇文章将为大家详细讲解有关PHP之CI框架的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言CodeIgniter 是一个简单快速的PHP MVC框架。EllisLab 的工作人员发布了 ...
    99+
    2023-06-20
  • 持久层ORM框架中Hibernate框架的示例分析
    这篇文章主要介绍了持久层ORM框架中Hibernate框架的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言hibernate的概念:hibernate是一个orm...
    99+
    2023-06-25
  • Java的ORM框架jOOQ2.0.4的示例分析
    本篇文章给大家分享的是有关Java的ORM框架jOOQ2.0.4的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。jOOQ 2.0.4 发布,该版本引入很多源码生成的提升...
    99+
    2023-06-17
  • Spring框架初始化的示例分析
    这篇文章将为大家详细讲解有关Spring框架初始化的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Spring能做什么?Spring的主要目的是使J2EE易用和促进好编程习惯。倒置控制容器 S...
    99+
    2023-05-30
    spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作