Spring和SpringMVC总结篇

作者:肥宅兜
链接:https://www.cnblogs.com/doudouxiaoye/p/5693399.html

1.为什么使用Spring ?

  1. 方便解耦,简化开发;
    通过Spring提供的IoC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。
  2. AOP编程的支持;
    通过Spring提供的AOP功能,方便进行面向切面的编程,如性能监测、事务管理、日志记录等。
  3. 声明式事务的支持;
  4. 方便集成各种优秀框架;
  5. 降低Java EE API的使用难度;
    如对JDBC,JavaMail,远程调用等提供了简便封装

2. 什么是IOC,为什使用IOC ?

IOC全称Iversion of Controller,控制反转。

这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。

它能指导我们如何设计出松耦合、更优良的程序。

3. 什么是AOP,为什么使用AOP ?

AOP全称:Aspect-Oriented Programming,面向切面编程。

AOP,面向切面编程,就是把可重用的功能提取出来,然后将这些通用功能在合适的时候织入到应用程序中,比如事务管理、权限控制、日志记录、性能统计等。

AOP并没有帮助我们解决任何新的问题,它只是提供了一种更好的办法,能够用更少的工作量来解决现有的一些问题,使得系统更加健壮,可维护性更好。

4. 什么是Spring的事务管理?

事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。

开发中为了避免这种情况一般都会进行事务管理。

Spring的声明式事务通常是指在配置文件中对事务进行配置声明,其中包括了很多声明属性,它是通过Spring Proxy帮你做代理,自己不用额外的写代码,只要在Spring配置文件中声明即可;通常用在数据库的操作里面;

编程式事务就是指通过硬编码的方式做事务处理,这种处理方式需要写代码,事务中的逻辑可以自己定制;可以是数据库的东东,也可以是其他的操作。

Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。

5. Spring框架支持以下五种bean的作用域:

  • singleton : 默认值,bean在每个Spring ioc 容器中只有一个实例。
  • prototype:一个bean的定义可以有多个实例。
  • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

6. 什么是Spring的MVC框架?

Spring配备构建Web应用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。

Spring mvc是一个基于mvc的web框架。Spring mvc是Spring框架的一个模块,Spring mvc和Spring无需通过中间整合层进行整合。

7. 如何启用注解:

在spring的xml配置中添加<mvc:annotation-drivern>即可

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
 xmlns:context="http://www.springframework.org/schema/context"  
 xmlns:p="http://www.springframework.org/schema/p"  
 xmlns:mvc="http://www.springframework.org/schema/mvc"  
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 xsi:schemaLocation="http://www.springframework.org/schema/beans  
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
      http://www.springframework.org/schema/context  
      http://www.springframework.org/schema/context/spring-context.xsd  
      http://www.springframework.org/schema/mvc  
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
>

      <!-- 注解扫描 -->
      <context:component-scan base-package="club.sscai.annotation"/>
      <!--使用mvc注解声明  -->
      <mvc:annotation-driven/>

      <!-- 不使用mvc注解声明则要注入以下两个bean
      <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
      <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
       -->

      <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

8. Spring MVC的请求流程:

  • 第一步:发起请求到前端控制器(DispatcherServlet)
  • 第二步:前端控制器请求HandlerMapping查找Handler可以根据xml配置、注解进行查找
  • 第三步:处理器映射器HandlerMapping向前端控制器返回Handler
  • 第四步:前端控制器调用处理器适配器去执行Handler
  • 第五步:处理器适配器去执行Handler
  • 第六步:Handler执行完成给适配器返回ModelAndView
  • 第七步:处理器适配器向前端控制器返回ModelAndView。ModelAndView是springmvc框架的一个底层对象,包括 Model和view
  • 第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)
  • 第九步:视图解析器向前端控制器返回View
  • 第十步:前端控制器进行视图渲染。视图渲染将模型数据(在ModelAndView对象中)填充到request域
  • 第十一步:前端控制器向用户响应结果

9. web.xml的配置

10. 注解的处理器映射器和适配器

  1. 注解映射器
    spring3.1之前默认加载映射器是org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping,3.1之后要使用:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
    在springmvc.xml中配置RequestMappingHandlerMapping:
<!-- 注解处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
使用RequestMappingHandlerMapping需要在Handler中使用@controller
标识此类是一个控制器(Handler),使用@requestMapping指定Handler方法所对应的url。
  1. 注解适配器
    spring3.1之前默认加载映射器是
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter,3.1之后要使用:
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
<!-- 注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
RequestMappingHandlerAdapter,不要求Handler实现任何接口,
它需要和RequestMappingHandlerMapping注解映射器配对使用,主要解析Handler方法中的形参。

11. spring 与 mybatis整合过程

  • 第一步:整合dao层
    mybatis和spring整合,通过spring管理mapper接口。
    使用mapper的扫描器自动扫描mapper接口在spring中进行注册。
  • 第二步:整合service层
    通过spring管理 service接口。
    使用配置方式将service接口配置在spring配置文件中。
    实现事务控制。
  • 第三步:整合springmvc 由于springmvc是spring的模块,不需要整合。 主要配置有:
    1. mybatis配置文件sqlMapConfig.xml配置别名自动扫描(实体类)
    2. mapper扫描器(接口,数据库访问接口)
    3. 数据库连接池配置
    4. 声明式事务配置
    5. 启用注解扫描:
    6. 配置注解映射器和适配器:
    7. 视图解析器:
    8. 配置控制类: DispatcherServlet前端控制器
    9. 配置spring配置文件加载类:ClassLoadListener

12. 前端控制器从上边的文件中加载处理映射器、适配器、视图解析器等组件,如果不在springmvc.xml中配置,使用默认加载的 DispatcherSerlvet.properties。

13. 视图解析器配置前缀和后缀:

14. sqlMapConfig.xml,mybatis自己的配置文件。

15. 配置数据源:

16. 事务控制(applicationContext-transaction.xml),在applicationContext-transaction.xml中使用spring声明式事务控制方法。

17. 加载spring配置

18. 静态资源访问不被拦截:

<resources mapping="/resources/**" location="/resources/" />
<resources mapping="/images/**" location="/images/" />
<resources mapping="/js/**" location="/js/" />

19. @RequestMapping的作用

  1. url映射
  2. 窄化请求映射
  3. 限制http请求方法

20. controller方法的返回值

  1. 返回ModelAndView
    需要方法结束时,定义ModelAndView,将model和view分别进行设置。
  2. 返回string
    如果controller方法返回string,
   1). 表示返回逻辑视图名。真正视图(jsp路径)=前缀+逻辑视图名+后缀
   2). redirect重定向:返回字符串格式为:"redirect:queryItem.action"
   3). forward页面转发:返回字符串格式为:“forward:queryItem.action”
  1. 返回void
    在controller方法形参上可以定义request和response,使用request或response指定响应结果:
   1). 使用request转向页面,如下:request.getRequestDispatcher("页面路径").forward(requestresponse);
   2). 也可以通过response页面重定向:response.sendRedirect("url")
   3). 也可以通过response指定响应结果,例如响应json数据如下:
       response.setCharacterEncoding("utf-8");
       response.setContentType("application/json;charset=utf-8");
       response.getWriter().write("json串");

21. 参数绑定:

  1. 默认支持的类型
    直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。
    1). HttpServletRequest:通过request对象获取请求信息
    2). HttpServletResponse:通过response处理响应信息
    3). HttpSession:通过session对象得到session中存放的对象
    4). Model/ModelMap:model是一个接口,modelMap是一个接口实现 。作用:将model数据填充到request域。
  2. 简单类型
    通过@RequestParam对简单类型的参数进行绑定。
    如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。
    如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。
    通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数,会报错。
  3. pojo绑定
    页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo。(usename,age;不需要user.username,user.age)
  4. 自定义参数绑定实现日期类型绑定
    对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。将请求日期数据串转成 日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。

22. Spring MVC 和 Struts2 对比

  1. Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC 就容易实现restful url
  2. 由上边原因,SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法
    之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。
  3. 由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。
  4. SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。
  5. springmvc面向方法开发的(更接近service接口的开发方式),struts2面向类开发。
  6. springmvc可以单例开发,struts2只能是多例开发。

23. 乱码处理

  1. post乱码
    在web.xml添加post乱码filter:CharacterEncodingFilter
  2. 对于get请求中文参数出现乱码解决方法有两个:
   1). 修改tomcat配置文件添加编码与工程编码一致,如下:
   <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

   2). 对参数进行重新编码:
   String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
   ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码

24. 集合类型绑定

  1. 数组绑定:
    controller方法参数使用:(Integer[] itemId)
    页面统一使用:itemId 作为name
  2. list绑定:
    pojo属性名为:itemsList
    页面:itemsList[index].属性名
  3. map 绑定:
    pojo属性名为:Map itemInfo = new HashMap();
    页面:<input type="text" name="itemInfo['name']"/>

25. spring 校验

  1. 项目中,通常使用较多是前端的校验,比如页面中js校验。对于安全要求较高点建议在服务端进行校验。
  2. springmvc使用hibernate的校验框架validation(和hibernate没有任何关系)。
    校验思路:页面提交请求的参数,请求到controller方法中,使用validation进行校验。如果校验出错,将错误信息展示到页面。

26. 数据回显

  1. @ModelAttribute还可以将方法的返回值传到页面:在方法上加注解@ModelAttribute
  2. 使用最简单方法使用model,可以不用@ModelAttribute:model.addAttribute("id", id);
  3. springmvc默认对pojo数据进行回显。pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写)
  4. public String testParam(PrintWriter out, @RequestParam("username") String username) { //out直接输出

27. 异常处理

springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。

28. 上传图片

  1. 在页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart类型的数据进行解析。
  2. 在springmvc.xml中配置multipart类型解析器。
  3. 方法中使用:MultipartFile attach (单个文件上传) 或者 MultipartFile[] attachs (多个文件上传)

29. Json处理

  1. 加载json转换的jar包:springmvc中使用jackson的包进行json转换(@requestBody和@responseBody使用下边的包进行json转)
  2. 配置json转换器。在注解适配器RequestMappingHandlerAdapter中加入messageConverters。如果使用 则会自动加入。
  3. ajax
  4. Controller (ResponseBody、RequestBody)
  5. 注意ajax中contentType如果不设置为json类型,则传的参数为key/value类型。上面设置后,传的是json类型。

详见:http://www.cnblogs.com/Jtianlin/p/5224885.html

30. 拦截器:

  1. 定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法。
    a. preHandle :进入 Handler方法之前执行,用于身份认证、身份授权,比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
    b. postHandle:进入Handler方法之后,返回modelAndView之前执行,应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
    c. afterCompletion:执行Handler完成执行此方法,应用场景:统一异常处理,统一日志处理
  2. 拦截器配置:
    a. 针对HandlerMapping配置(不推荐):springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler
    最终使用该 拦截器。 (一般不推荐使用)
    b. 类似全局的拦截器:springmvc配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中

我创建了一个用来记录自己学习之路的公众号,感兴趣的小伙伴可以关注一下微信公众号:niceyoo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python3爬虫(十一) 爬虫与反爬虫

Infi-chu: http://www.cnblogs.com/Infi-chu/ 一、重要概念 二、爬虫反爬虫进化论 转载于:https://www.cnblogs.com/Infi-chu/p/8981537.html

配置Maven环境变量-Eclipse/Idea添加Maven

1. 文件下载 官网下载地址&#xff1a;http://maven.apache.org/download.cgi 下方有我提供的下载链接。 由于下载缓慢&#xff0c;提供一份我的下载链接&#xff1a;https://www.lanzous.com/i7v2ryb 2. 解压文件 3. 环境变量 3.1、新建环境变量&#xff0c;如下所示&#xff…

HTML第二课——css

请关注公众号&#xff1a;自动化测试实战 先给大家提个建议&#xff0c;就是用sublime编辑器来编写。用其他的也无所谓&#xff0c;我只是建议&#xff0c;因为这个会帮你自动补全很多代码。 css概念 css叫层叠样式表。意思就是一层一层的叠加。作用就是让页面中的可视化标签变…

工作306:.sync解决子组件改变自身值 父组件也改变自身数值

Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-

修改MyEclipse/Eclipse左侧文字大小(MacOS/Windows)

一、Windows 首先找到 Eclipse/MyEclipse 的安装目录&#xff0c;然后找到如下目录&#xff1a; \plugins\org.eclipse.ui.themes_1.1.200.v20160815-0536\css\e4_basestyle.css 修改此 css 文件&#xff0c;添加如下内容&#xff1a; CTabFolder Tree{ font-size: 12px;} 二…

Kubernetes tutorial - K8S 官方入门教程

tutorials 教程 kubectl 的命令手册 1 Creating a Cluster 1.1 Using Minikube to Create a Cluster Kubernetes Clusters Kubernetes coordinates a highly available cluster of computers that are connected to work as a single unit. The abstractions in Kubernetes all…

uniapp增加百度统计代码(h5)

做了个微信公众号文章互相阅读的h5界面&#xff0c;http://mptask.wintp.top/&#xff08;只能微信浏览器打开&#xff09;&#xff0c;其中用到了统计代码&#xff0c;记录如下。 1、新建 tj.html 界面 可放置在项目的根目录&#xff0c;文件名称根据自己情况命名。 2、粘贴内…

前端学习(2847):css鼠标样式

<html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>css鼠标样式</title></head><body><a href"####" style"cursor:pointer">hello world1<…

前端学习(2848):鼠标点击事件

<< 一起来做秒杀活动 >>一、分类 一般事件 页面相关事件 表单相关事件 滚动字幕事件 编辑事件 外部事件二、常用事件 示例 onclick onmouseover onmouseout onkeydown onerror onloadonsubmit onblur onfocus

2019年终总结-2020展望「持续更新至31号」

粗略的统计了一下&#xff0c;2019 在博客园发布了约 140 篇文章&#xff0c;写文章有一段时间了&#xff0c;最开始的初衷就是记录自己平时开发遇到的 Bug&#xff0c;能更快捷的调取笔记&#xff1b; 写着写着&#xff0c;迎来了第 52 个关注者… 2019 或许是自己最艰难的一年…

前端学习(2849):简单秒杀学习之浮动

1浮动和不浮动 2下移和卡住 3环绕 4清除浮动 5浮动实际应用

前端学习(2850):简单秒杀系统学习之绝对定位

<html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>CSS绝对定位</title><style type"text/css">div{background-color: Red;width: 30px;height: 30px;}#box_relativ…

「声明」本博客自动采集于博客园-niceyoo

开启了 CSDN 的博客搬家功能&#xff0c;自动同步博客园的文章信息。 所以本博客200篇文章有时不予回复、望体谅。 博客园链接&#xff1a;https://www.cnblogs.com/niceyoo

django channels

一直都是用HTTP请求糊里糊涂的实现了一次请求&#xff0c;一次响应。最近尝试用Django这种框架实现websocket&#xff0c;用的是Django channels&#xff0c;结合官网给的例子&#xff0c;实现了日志动态展示到页面。源码地址: 但是对于其原理&#xff0c;却想研究一番。 先看一…

前端学习(2851):简单秒杀系统学习之相对定位

<html><head ><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>CSS相对定位</title><style type"text/css">div {background-color: Red;width: 30px;height: 30px;}#box_relat…

PLSQL执行SQL脚本文件「适用批量」- 工具使用篇

前言 开局一条狗&#xff0c;装备全靠打 这篇文章应该是 2019 年最后一文章了&#xff0c;分享一下 PLSQL 是如何执行 SQL 脚本文件的。 关于执行 SQL 文件&#xff0c;下方是自己经常使用的一种方式&#xff0c;同样适用于批量文件。 好了。废话少说&#xff0c;看正文吧。 正…

Angular路由——子路由

一、子路由语法&#xff1a; 二、实例 在商品详情页面&#xff0c;除了显示商品id信息&#xff0c;还显示了商品描述&#xff0c;和销售员的信息。 通过子路由实现商品描述组件和销售员信息组件展示在商品详情组件内部。 1、新建2个组件修改其内容 ng g component productDesc …

前端学习(2852):简单秒杀系统学习之鼠标点击方法

<html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>css鼠标样式</title></head><body><a href"####" style"cursor:pointer">hello world1<…

我为什么会选择计算机专业之 《我的编程人生前传》

前言 今天是 2020 年的第一天 「1月1号 | 元旦」&#xff0c;新年的第一篇文章&#xff0c;突发奇想「放假闲的」&#xff0c;打算写一篇小学白话文 - 我为什么会选择计算机专业&#xff0c;同时也让大家更加了解我「骗关注」。 本文故事绝对真实&#xff0c;均为博主亲身经历&…