2021-06-28

思维导图

1/74p SpringMVC Web开发底层是servlet

2/74p SpringMVC Web开发步骤




3/74p SpringMVC 中央调度器创建springmvc容器对象

4/74p SpringMVC 自定义容器配置文件

5/74p SpringMVC 设置web.xml的mapping部分【url-pattern】

mapping就是起了一个别名

6/74p SpringMVC 创建控制类




7/74p SpringMVC 创建控制器方法

8/74p SpringMVC 测试请求


测试成功

9/74p SpringMVC 请求处理过程

上面的第4步,DispatcherServlet是根据MyController中的RequestMapping和web.xml中的映射关系(url-partern)找到doSome方法的。
简化过程

10/74p DispatcherServlet的init源代码

11/74p DispatcherServlet的doDispatch源代码

12/74p 配置视图解析器





在springmvc.xml中配置视图解析器。


13/74p SpringMVC注解式开发


14/74p 指定请求方式method属性

如果上面定义的访问方式和后面的不一致,就会报错。如下

15/74p 处理器方法形参request



16/74p 接受参数,逐个接收



在上面的文本框中输入参数,然后就会传给springmvc的中央调度器DisPatcherServlet,DisPatcherServlet通过@RequestMapping中的参数找到对应的controller类,执行对应的controller方法,接收参数,并展示在show.jsp页面中。




存在的一些问题,在上面的文本框中,如果年龄为空的话,在代码内部其实有一个字符串转为int类型的过程,就会发生错误。”400“错误,就是表示客户端错误,表示提交请求参数的过程中出现了错误。




第二个问题:

17/74p 使用过滤器解决post方式访问中文乱码问题


18/74p 复习第一天内容




19/74p 复习接收参数

20/74p RequestParam注解

解决办法:使用@RequestParam绑定



21/74p 对象接受参数

只要对象的属性名和请求参数名是一致的,框架就可以接收参数,并给属性赋值。

22/74p 返回值ModelAndView

返回结果有以下四大类,如果返回值需要数据和视图,那就使用ModelAndView,视图就表示需要跳转的页面。

23/74p 返回值String表示视图



24/74p 返回值void响应ajax【了解】

回忆ajax,ajax是用来做局部刷新的技术


25/74p 返回值void响应json格式

使用框架做ajax

26/74p 返回值Object-注解驱动作用



27/74p 返回值Object-HttpMessageConverter


28/74p 返回值Object-注解驱动的对比

面试题:springmvc的返回值是一个对象,怎么转为json输出呢?
只需要三步:
1、加入json的工具库依赖,springmvc默认的工具库是jackson
2、在springmvc配置文件中加mvc:annotation-driven注解驱动
3、在处理器方法的上面加入@ResponseBody注解

在加入注解驱动之前,messageConverter里面有4个类。
[org.springframework.http.converter.ByteArrayHttpMessageConverter@45127ec4, org.springframework.http.converter.StringHttpMessageConverter@4bd58816, org.springframework.http.converter.xml.SourceHttpMessageConverter@4fea15b4, org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@ae8822d]

加入注解驱动之后
[org.springframework.http.converter.ByteArrayHttpMessageConverter@64de5955, org.springframework.http.converter.StringHttpMessageConverter@12cf056, org.springframework.http.converter.ResourceHttpMessageConverter@1ddc309b, org.springframework.http.converter.ResourceRegionHttpMessageConverter@339ea471, org.springframework.http.converter.xml.SourceHttpMessageConverter@251c57a6, org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@43d4bd13, org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter@3ff0051a, org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@790b93b9]

29/74p 返回值Student-Json

30/74p 返回值Student的处理流程

31/74p 返回值List是jsonArray

[{"name":"李斯","age":30},{"name":"高俅","age":20}]


32/74p 返回值String是文本数据


ajax请求中数据格式没有改过来,导致最终出现语法错误,需要将上面的dataType:“json”删掉。

删除之后,成功弹出以下结果,但是有中文乱码问题

我们加入的charsetfilter继承了OncePerRequestFilter,目的是为了保证每次request,只触发一次filter,当我们的返回值是String类型,输出时并不会走这个过滤器,所以会有乱码问题。过滤器是用来过滤request请求的,响应是服务器给浏览器的,直接通过响应对象返回数据不经过请求对象。
解决方案:在@RequestMapping中设置编码格式。


33-34/74p 访问静态资源有问题



35/74p 第一种静态资源的处理方式



那么如何能够访问到静态资源文件呢?
有两种解决方案:
1、在springmvc配置文件中加入mvc:default-servlet-handler
2、 <mvc:resources mapping="/images/" location="/images/"/>
<mvc:resources mapping="/html/
" location="/html/"/>
<mvc:resources mapping="/js/**" location="/js/"/>

36/74p 解决冲突的问题

37/74p 复习接收参数


38/74p 第二种静态资源处理方式

39/74p 一条配置处理所有的静态资源

第二种方式下,需要写的代码有多行,容易漏写,如何避免呢?


只有在url-pattern中设置斜杠,匹配所有的资源时,才需要配置静态资源文件的访问。因为“/”把静态资源也拦截了,但是没有处理静态资源的能力,所以需要单独配置。

40-41/74p 相对路径和绝对路径

这几节听蒙了,好像作用也不大,等以后遇到再去学习吧,先不管了。

44/74p SSM整合开发思路



45/74p web.xml配置文件

在web.xml中配置三个内容,分别是
1、配置监听器,用来读取spring配置文件,管理spring中的对象
2、注册字符集过滤器,用于解决请求参数中携带中文字符乱码的问题。
3、配置中央调度器,使用DispatcherServlet代理servlet请求转发。
web.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--    注册spring监听器,读取spring的配置文件注册 ServletContext 监听器的实现类 ContextLoaderListener,用于创建 Spring 容器及将创建好的 Spring 容器对象放入到 ServletContext 的作用域中。
--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:conf/applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!--注册字符集过滤器注册字符集过滤器,用于解决请求参数中携带中文时产生乱码问题
--><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>enconding</param-name><param-value>utf-8</param-value></init-param><init-param><param-name>forceRequestEncoding</param-name><param-value>true</param-value></init-param><init-param><param-name>forceResponseEnconding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--配置springmvc的中央调度器代理servlet的请求转发
--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:conf/dispatcherServlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>

46p/74p springmvc配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--    springmvc的配置文件,用来声明controller和其他web相关的对象--><!--组件扫描器,指定@Controller所在的包名--><context:component-scan base-package="com.bjpowernode.controller"/><!--视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean><!--注解驱动:用到ajax需要用到,访问静态资源也要用到--><mvc:annotation-driven/></beans>

47p/74p spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd"><!--    spring的配置文件,用来声明service、dao、工具类等对象--><!--    声明数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"init-method="init" destroy-method="close"><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><context:property-placeholder location="classpath:conf/jdbc.properties"/>
</beans>

声明数据源后将项目跑起来试一下。成功运行再往后写。

48p/74p mybatis配置文件

49p/74p 编写dao和service



50p/74p 编写controller和jsp页面

controller

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%String basePath = request.getScheme() + "://" +request.getServerName() + ":" + request.getServerPort() +request.getContextPath() + "/";
%>
<html>
<head>
<%--    添加base标签,为了补全下面action的路径--%><base href="<%=basePath%>"><title>注册学生</title>
</head>
<body>
<div align="center"><form action="student/addStudent.do" method="post"><table><tr><td>姓名:</td><td><input type="text" name="name"></td></tr><tr><td>年龄:</td><td><input type="text" name="age"></td></tr><tr><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td><input type="submit" value="注册"></td></tr></table></form>
</div>
</body>
</html>

jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%String basePath = request.getScheme() + "://" +request.getServerName() + ":" + request.getServerPort() +request.getContextPath() + "/";
%>
<html>
<head>
<%--    添加base标签,为了补全下面action的路径--%><base href="<%=basePath%>"><title>注册学生</title>
</head>
<body>
<div align="center"><form action="student/addStudent.do" method="post"><table><tr><td>姓名:</td><td><input type="text" name="name"></td></tr><tr><td>年龄:</td><td><input type="text" name="age"></td></tr><tr><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td><input type="submit" value="注册"></td></tr></table></form>
</div>
</body>
</html>

51-52p/74p 编写查询功能【用ajax请求,首先要将jQuery导入,即js文件】

    //处理查询,相应ajax,要转为json,需要三个步骤@RequestMapping("queryStudent.do")@ResponseBodypublic List<Student> findStudent(){//参数检查,简单的数据处理List<Student> students = service.findStudents();return students;}

直接在网址去访问queryStudent.do,查看是否正确返回json数据。没有问题继续往下写

53p/74p 完成ajax请求,返回json。

至此,ssm整合开发结束。

54p/74p 重定向和转发操作


请求转发


请求转发的时候可以携带参数,正确读取参数信息
重定向读取参数时需要另外处理。

55p/74p 重定向不能访问WEB-INF下的资源

记住forward的使用规则,特点即可。

57p/74p 复习静态资源和整合开发



58p/74p 集中统一处理异常

以往的写法,很繁琐

现在使用aop思想,将异常处理与业务方法解耦合。叫做:统一异常全局处理

@ExceptionHandler
@ControllerAdvice

59p/74p 创建全局异常处理类





springmvc.xml中

60p/74p 验证异常注解的使用









62p/74p 拦截器基本功能介绍

所有实现了HandlerIntercepter接口的都是拦截器
拦截器和过滤器有点像,但是侧重点不同。过滤器是用来过滤请求参数的,拦截器是用来拦截请求的。

63p/74p 实现一个拦截器【创建拦截器类】


64p/74p 拦截器接口中三个方法的功能

主要记住第一个方法就行,后面的了解就行。


65p/74p 拦截器的第一个方法preHandle【掌握】

在配置文件中声明拦截器


preHandler返回结果设置为假时。MyController方法被拦截,不执行




66p/74p 拦截器的其他两个方法postHandle、afterCompletion【了解】

postHandle()可以修改数据


afterCompletion()可以统计时间

67p/74p 多个拦截器的执行顺序




68p/74p 拦截器执行链



不管有几个拦截器,只要有一个拦截器为false,那么Controller方法就不会被执行。
设置不同的拦截器的作用,就是把不同的验证任务区分开,比如说第一个拦截器验证登录信息,第二个拦截器验证访问权限等等。

69p/74p 拦截器和过滤器的区别【记住3-4条就行】

70p/74p 登陆验证拦截器项目准备

71p/74p 登陆验证拦截器实现【ch09_interceptor】

public class MyInterceptor implements HandlerInterceptor {//验证用户的登录信息,正确返回true,反之false@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throws Exception {String loginName = "";System.out.println("拦截器的MyInterceptor的preHandler()");//从session中获取数据Object attr = request.getSession().getAttribute("name");//判断是否为空if (attr != null){loginName = (String) attr;}//不合法if (!"zs".equals(loginName)){request.getRequestDispatcher("/tips.jsp").forward(request,response);return false;}//合法return true;}


72p/74p springmvc映射器【第一章节内容补充-理解就行】

映射器是用来找controller对象的
框架内部请求的处理过程

浏览器发起请求。比如说some.do,然后中央调度器收到请求,把请求转交给处理器映射器,处理器映射器的作用就是根据请求的地址找到能够处理some.do请求的Controller,框架把找到的处理器对象controller放到一个叫做处理器执行链的类中保存,中央调度器把处理器执行链中保存的处理器对象交给处理器适配器,然后由处理器适配器去执行controller方法【MyController.doSome()】,得到返回值ModelAndView。

73p/74p springmvc适配器【第一章节内容补充-理解就行】

适配器是用来执行处理器方法的

74p/74p springmvc视图解析器

处理视图,拼接路径和后缀。

2021.7.16晚上21.00完结。

2020最新SpringMVC教程【IDEA版】-springmvc从入门到精通相关推荐

  1. Xmind软件 2020最新安装教程讲解

    Xmind 2020最新安装教程 1. 首先需要下载Xmind软件(百度网盘链接附上) 2.安装步骤直接就是双击下载好的软件安装即可 3. 安装成功后找到xmind安装目录下的resource目录替换 ...

  2. Linux基础(B站视频笔记—— Python教程_600集Python从入门到精通教程)

    Python教程_600集Python从入门到精通教程(懂中文就能学会) 07 虚拟机简介 09 Linux内核和发行版 13 为什么要学习Linux终端命令 16 六个常见的终端命令 17 终端命令 ...

  3. 【Vue学习笔记】尚硅谷Vue2.0+Vue3.0全套教程丨vue.js从入门到精通

    尚硅谷Vue2.0+Vue3.0全套教程丨vue.js从入门到精通 1.Vue核心部分 1.1 Vue简介 1.1.1 Vue是什么? Vue是一套用于构建用户界面的渐进式JavaScript框架. ...

  4. python3简明教程第二版答案_python入门简明教程?求最新的python简明教程,最好是python3的...

    本人对于计算机没有任何基础,只是简单的操作.过两天要学习python语言的基础课,需要如何准备.跪谢! 先看python的简明教程,然后可以再看<dive into python>中文版( ...

  5. pkpm快速入门教程_PKPM结构软件从入门到精通高清版

    摘要 本书在众多PKPM结构软件中抓住PMCAD建立模型.SATWE分析计算.JCCAD基础设计这三个关键软件作为主线,从建模操作技巧入手,从规范规定.软件实现.工程应用相结合的角度,详细阐述SATW ...

  6. java架构师入门教程,java技术架构师入门到精通高薪就业教程百度云下载

    java技术架构师入门到精通高薪就业视频教程百度云 课程目录: JAVA架构课开班典礼 JVM性能调优专题 JVM整体结构深度解析 JVM内存分配机制详解(此视频作废) JVM字节码文件结构深度剖析 ...

  7. python从入门到精通清华_java从入门到精通(第5版)+python从入门到精通+c语言从入门到精通 全3册 清华大学出版社...

    <JAVA从入门到精通(第5版)> <Java从入门到精通(第5版)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识 ...

  8. ubuntu php入门教程,《Ubuntu Linux从入门到精通》PDF 下载_IT教程网

    资源名称:<Ubuntu Linux从入门到精通>PDF 下载 内容简介: <Ubuntu Linux从入门到精通>详细介绍Ubuntu Linux操作系统,<Ubunt ...

  9. oracle数据库实战教程 李兴华ORACLE入门到精通教程

    oracle视频教程有很多,但经典教程却非常少, 这里推荐李兴华ORACLE入门到精通教程,可以让大家快速的学习oracle数据库! Mysql数据库和oracle数据库有什么区别 Mysql是中小型 ...

  10. 尚硅谷2020最新版SpringCloud(H版alibaba)框架开发教程全套完整版从入门到精通

    01_前言闲聊和课程说明 02_零基础微服务架构理论入门 03_第二季Boot和Cloud版本选型 04_Cloud组件停更说明 05_父工程Project空间新建 06_父工程pom文件 07_复习 ...

最新文章

  1. vmware虚拟化(二)安装vsphere5.1
  2. js实现双向链表互联网机顶盒实战应用
  3. java方法区超详细汇总,方法区到底是干什么用的?不懂方法区不能说了解jvm!
  4. ESP8266 如何修改默认上电校准方式?另外为什么 ESP8266 进⼊启动模式(2,7)并触发看⻔狗复位?
  5. Cloud Connect: 使用现有的云基础设施来降低使用云编码的操作成本
  6. JavaTPoint 数据科学和人工智能中文教程【翻译完成】
  7. elastic集群单节点停机维护
  8. ATAC-seq原理及现有技术的比较
  9. javascript 定时跳转页面
  10. LaTeX函数、符号及特殊字符
  11. 计算机电气工程论文,计算机在电气工程自动化控制的作用
  12. excel合并两列内容_你真的会用Excel“数据合并”吗?学会这4招准点下班
  13. 三个数比较大小函数调用c语言,C语言程序系列第四弹–max函数判断三个数的大小...
  14. 【数据挖掘】从“文本”到“知识”:信息抽取(Information Extraction)
  15. m451dn linux驱动下载,惠普M451dn驱动下载
  16. 重磅!IEEE Fellow周礼栋担任微软全球资深副总裁
  17. 行业缩减他却增加!海尔智家研发投入创新高
  18. 如何把视频或者音频转成文字
  19. python-爬虫:获取163邮箱的收件箱信息列表
  20. spring cloud灰度发布快速上下线问题解决

热门文章

  1. Derby数据库学习,derby、derby。derby入门。
  2. Tomcat服务器部署详细图解
  3. 交换机工作原理(以太网VLAN华为交换机实例配置)
  4. python测验3基本数据类型_Python 3 基本数据类型
  5. 年仅38岁!985高校一特聘研究员因病去世,令人痛惜
  6. 安卓 魅族PRO5 安装 Xposed框架
  7. Webpack Chunks 优化剖析
  8. SwiftUI iOS 15 将如何改进可访问性accessibility WWDC2021
  9. 如何在团队开展codeReview
  10. C++ Primer记录_第十三章