2020最新SpringMVC教程【IDEA版】-springmvc从入门到精通
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> </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> </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从入门到精通相关推荐
- Xmind软件 2020最新安装教程讲解
Xmind 2020最新安装教程 1. 首先需要下载Xmind软件(百度网盘链接附上) 2.安装步骤直接就是双击下载好的软件安装即可 3. 安装成功后找到xmind安装目录下的resource目录替换 ...
- Linux基础(B站视频笔记—— Python教程_600集Python从入门到精通教程)
Python教程_600集Python从入门到精通教程(懂中文就能学会) 07 虚拟机简介 09 Linux内核和发行版 13 为什么要学习Linux终端命令 16 六个常见的终端命令 17 终端命令 ...
- 【Vue学习笔记】尚硅谷Vue2.0+Vue3.0全套教程丨vue.js从入门到精通
尚硅谷Vue2.0+Vue3.0全套教程丨vue.js从入门到精通 1.Vue核心部分 1.1 Vue简介 1.1.1 Vue是什么? Vue是一套用于构建用户界面的渐进式JavaScript框架. ...
- python3简明教程第二版答案_python入门简明教程?求最新的python简明教程,最好是python3的...
本人对于计算机没有任何基础,只是简单的操作.过两天要学习python语言的基础课,需要如何准备.跪谢! 先看python的简明教程,然后可以再看<dive into python>中文版( ...
- pkpm快速入门教程_PKPM结构软件从入门到精通高清版
摘要 本书在众多PKPM结构软件中抓住PMCAD建立模型.SATWE分析计算.JCCAD基础设计这三个关键软件作为主线,从建模操作技巧入手,从规范规定.软件实现.工程应用相结合的角度,详细阐述SATW ...
- java架构师入门教程,java技术架构师入门到精通高薪就业教程百度云下载
java技术架构师入门到精通高薪就业视频教程百度云 课程目录: JAVA架构课开班典礼 JVM性能调优专题 JVM整体结构深度解析 JVM内存分配机制详解(此视频作废) JVM字节码文件结构深度剖析 ...
- python从入门到精通清华_java从入门到精通(第5版)+python从入门到精通+c语言从入门到精通 全3册 清华大学出版社...
<JAVA从入门到精通(第5版)> <Java从入门到精通(第5版)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识 ...
- ubuntu php入门教程,《Ubuntu Linux从入门到精通》PDF 下载_IT教程网
资源名称:<Ubuntu Linux从入门到精通>PDF 下载 内容简介: <Ubuntu Linux从入门到精通>详细介绍Ubuntu Linux操作系统,<Ubunt ...
- oracle数据库实战教程 李兴华ORACLE入门到精通教程
oracle视频教程有很多,但经典教程却非常少, 这里推荐李兴华ORACLE入门到精通教程,可以让大家快速的学习oracle数据库! Mysql数据库和oracle数据库有什么区别 Mysql是中小型 ...
- 尚硅谷2020最新版SpringCloud(H版alibaba)框架开发教程全套完整版从入门到精通
01_前言闲聊和课程说明 02_零基础微服务架构理论入门 03_第二季Boot和Cloud版本选型 04_Cloud组件停更说明 05_父工程Project空间新建 06_父工程pom文件 07_复习 ...
最新文章
- 学习换脸:Switching Eds: Face swapping with Python, dlib, and OpenCV
- deepin系统引导_国产 Linux 发行版 深度操作系统 20 正式版发布
- android 安装sqlite3,Android真机安装sqlite3的方法
- 【Storm篇】--Storm基础概念
- python实现高效率的排列组合算法
- [vue-cli]在使用vue-cli开发vue项目时,自动刷新页面的原理你了解吗?
- 程序员犯的非技术错误(Top 5)
- Fedora/RedHat上使用Docker命令搭建Mysql服务器
- 关于VS.NET RSACryptoServiceProvider的疑惑
- Java并发之线程池ThreadPoolExecutor源码分析学习
- python 修改图片_Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
- tf hub bigGan 猫变狗
- 利用Depends查看win系统下exe程序的依赖项
- 学好mysql数据库能找到什么工作_MySQL数据库学习路线汇总整理全集(附详细的学习路线介绍图)...
- 今日得闲,完善一下之前用python画的滑稽笑脸的代码,附计算过程
- 虚拟服务器+ftp上传错误,虚拟主机FTP无法上传文件解决办法
- 勒索软件即服务与IAB产业浅析
- session制作购物车
- 散转程序c语言,单片机 散转表程序的使用
- 四 状语从句(2021-11-09)