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. 学习换脸:Switching Eds: Face swapping with Python, dlib, and OpenCV
  2. deepin系统引导_国产 Linux 发行版 深度操作系统 20 正式版发布
  3. android 安装sqlite3,Android真机安装sqlite3的方法
  4. 【Storm篇】--Storm基础概念
  5. python实现高效率的排列组合算法
  6. [vue-cli]在使用vue-cli开发vue项目时,自动刷新页面的原理你了解吗?
  7. 程序员犯的非技术错误(Top 5)
  8. Fedora/RedHat上使用Docker命令搭建Mysql服务器
  9. 关于VS.NET RSACryptoServiceProvider的疑惑
  10. Java并发之线程池ThreadPoolExecutor源码分析学习
  11. python 修改图片_Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
  12. tf hub bigGan 猫变狗
  13. 利用Depends查看win系统下exe程序的依赖项
  14. 学好mysql数据库能找到什么工作_MySQL数据库学习路线汇总整理全集(附详细的学习路线介绍图)...
  15. 今日得闲,完善一下之前用python画的滑稽笑脸的代码,附计算过程
  16. 虚拟服务器+ftp上传错误,虚拟主机FTP无法上传文件解决办法
  17. 勒索软件即服务与IAB产业浅析
  18. session制作购物车
  19. 散转程序c语言,单片机 散转表程序的使用
  20. 四 状语从句(2021-11-09)

热门文章

  1. 查看Eclipse版本号及各个版本区别
  2. 前端笔试题汇总 2018/12/04 (2)
  3. Conda channels配置
  4. dnsmasq windows版_烂泥:dnsmasq搭建简易DNS服务器
  5. 1207. 独一无二的出现次数
  6. linux内核补丁安装和编译安装
  7. msm8909的摄像头调试记录
  8. 每周一道算法题005:切木棒
  9. 我的微语录周记2014-12-01---2014-12-04_轩逸云_新浪博客
  10. 如何做一个网页送给女朋友做生日礼物!这应该是最好的礼物了!