目录

2019年6月17日 - day05 - 上午

day05-1-springmvc核心注解和rest介绍_地址栏

01 - 回顾
  • 前期内容回顾。
02 - @RequestMapping注解参数method和params

卖个关子

web.xml当中配置servlet好麻烦,dispatchservlet后面可以便捷生成。

day05-1-springmvc核心注解和rest介绍_spring_02

配置springMVC的配置文件

day05-1-springmvc核心注解和rest介绍_地址栏_03

  • 从地址栏直接访问/WEB-INF/下面的JSP,是访问不到的。
  • 重定向访问WEB-INF下的JSP,改变了地址栏,也是访问不到的。
    • 转发,地址栏不变。
    • 重定向,地址栏会变。
  • 重定向会改变地址栏,跟你自己手动输入url访问的效果是一致的,都是访问不到WEB-INF下面的jsp文件的。
  • 如果想要,控制你的页面,访问什么地方,在配置视图解析器的时候,prefix就加个斜线,视图名称自己再controller中拼接。

编写控制层

package com.atguigu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {

	/**
	 * 这里的路径,加上/,表示访问的是,项目根目录下的路径。
	 * 如果不加/的时候,表示访问的是,当前目录下的路径。
	 * 因为,我们的index.jsp是在webcontent下面的。
	 * webcontent的访问级别和我们的src的访问级别是一样的。
	 * 这里原则上,加不加斜杠都是可以的。但是加上,就能够保证,是项目路径下的test请求。
	 * 
	 * @RequestMapping:设置请求映射,把请求和控制层中的方法,设置映射关系。
	 * 当请求路径,和requestMapping的value属性一致的时候,则该注解标注的方法,就是处理请求的方法。
	 */
	@RequestMapping("/test")
	public String test() {
		System.out.println("访问成功");
		return "success";
	}
	
}

访问测试

day05-1-springmvc核心注解和rest介绍_地址栏_04

我们在这里,看地址栏的url,也可以看到,return一个视图名称,是使用转发的方式,路径是没有改变的。

  • 转发:地址栏不改变。
  • 重定向:地址栏改变。

我们的页面展示的,是WEB-INF下面的success.jsp页面,但是地址栏当中还是显示的test请求路径。

这是因为WEB-INF下面的jsp文件,是不能够通过地址栏输入地址直接访问的,只能够通过转发访问。

@RequestMapping的第一个属性就是value属性

源码

day05-1-springmvc核心注解和rest介绍_spring_05

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_06

String[] value() default {}; 默认值是一个大括号,value,可以是一个数组,也可以是一个字符串。
RequestMethod[] method() default {}; method属性,值也是一个数组。
String[] params() default {}; params是参数的意思。
String[] headers() default {};请求头的意思。
String[] consumes() default {};不说这个。
String[] produces() default {};不说这个。

method属性

form表单提交的时候有一个method属性,代表请求方式。

注解属性为了约束注解。

属性让注解更准确匹配请求。

@RequestMapping的method属性为了约束请求方式。

method属性的类型是一个枚举数组。

method的值,就是下面的值:

day05-1-springmvc核心注解和rest介绍_ajax_07

上面有8个值,经常用的有8个。

  • GET:查询 query
  • DELETE:删除 delete
  • PUT:更新 update
  • POST:添加 insert

使用测试一下method属性

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_08

day05-1-springmvc核心注解和rest介绍_客户端_09

我们限制了,请求只能够是POST请求,出现了405的错误,因为a标签的跳转,是GET请求。

servlet doget方法处理请求,form表单提交请求。

前台发post,后台get承接,就报错405。

method属性用来设定请求方式,只有客户端发送请求的方式,和method的值一致的时候,才能够处理请求。

请求方式一共有8中,我们经常用的有4种:get 查询,put 修改,delete 删除,post 添加

这个属性有什么用呢?

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_10

一个请求,可以四种请求方式,我们就可以写四个方法,处理增删改查,这就是restful。

day05-1-springmvc核心注解和rest介绍_spring_11

params参数

day05-1-springmvc核心注解和rest介绍_地址栏_12

day05-1-springmvc核心注解和rest介绍_spring_13

发送请求的时候,带上参数。

params属性表示,必须带有哪些参数,或者不能带有哪有参数。

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_14

  • username:请求必须带username参数。
  • !username:请求不能带username参数。
  • username=admin:请求带username参数,且必须等于admin。
  • username!=admin:请求带username参数,且不能等于admin。

演示

day05-1-springmvc核心注解和rest介绍_地址栏_15

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_16

day05-1-springmvc核心注解和rest介绍_spring_17

day05-1-springmvc核心注解和rest介绍_ajax_18

day05-1-springmvc核心注解和rest介绍_ajax_19

day05-1-springmvc核心注解和rest介绍_地址栏_20

03 - @RequestMapping注解属性headers

day05-1-springmvc核心注解和rest介绍_spring_21

day05-1-springmvc核心注解和rest介绍_客户端_22

headers={"Accept-Language=zh-CN, zh; 9=0.8, zh-TW; q=0.7, zh-HK; 9=0.5, en-US; q=0.3, en; 9=0.2"}

我们可以设置请求头来匹配请求。

day05-1-springmvc核心注解和rest介绍_客户端_23

day05-1-springmvc核心注解和rest介绍_地址栏_24

headers总结

day05-1-springmvc核心注解和rest介绍_客户端_25

  • value
  • method
  • params
  • headers
04 - @RequestMapping作用位置
  • requestmapping放在方法上

day05-1-springmvc核心注解和rest介绍_地址栏_26

  • requestmapping放在类上,对类中所有的方法,都有效。

day05-1-springmvc核心注解和rest介绍_spring_27

一般情况下,requestmapping加到类上,只会增加一个value属性。

day05-1-springmvc核心注解和rest介绍_客户端_28

如果是像是上面这样写,我们请求的路径,就应该是下面的样子:

day05-1-springmvc核心注解和rest介绍_地址栏_29

这个东西就相当于是一个命名空间。

05 - springMVC值Ant方式的访问路径

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_30

Ant - 星号

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_31

day05-1-springmvc核心注解和rest介绍_地址栏_32

ant路径 - 问号

day05-1-springmvc核心注解和rest介绍_客户端_33

day05-1-springmvc核心注解和rest介绍_ajax_34

ant路径 - 两个星号

day05-1-springmvc核心注解和rest介绍_客户端_35

day05-1-springmvc核心注解和rest介绍_客户端_36

总结

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_37

06 - springMVC支持占位符方式的路径

刚才提到了restful,是springmvc请求的一种风格。

映射请求占位符,跟restful密切关联。

传参

原来客户端往服务器传值,要么是form表单submit,要么是超链接问号传参。

day05-1-springmvc核心注解和rest介绍_地址栏_38

现在我们直接把参数写在路径当中。

@RequestMapping的value属性中,通过占位符来匹配参数。

@PathVariable()获取占位符的值

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_39

  • 之前的注解,加载类上,方法上,属性上。
  • 现在这个注解,加在形参上。

day05-1-springmvc核心注解和rest介绍_客户端_40

day05-1-springmvc核心注解和rest介绍_ajax_41

07 - REST简介

回顾

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_42

  • 一般情况下,不会传太多的参数。
  • 使用restful的时候,写的值,都是很少的。

正式的restful

day05-1-springmvc核心注解和rest介绍_客户端_43

day05-1-springmvc核心注解和rest介绍_spring_44

  • 目前最流行的互联网软件架构
    • 百度,亚洲最大的搜索引擎。
      • 360
      • 谷歌
    • 百度搜东西,每个信息,有顺序排列,信息排列两种情况,花钱和不花钱,不花钱时候咋排序。restful软件架构往上排,普通架构往下排。
    • 百度查数据,访问某个网站,给用户展示。百度用的restful,网站用的不是restful,请求格式不一样,中间要转换,百度用的restful,网站用的也是restful,不用转换格式,这就是restful排序的原因。
  • 名词
    • 资源:resources
    • 表现层:representation:txt - html - xml - json
    • 状态转化:state transfer:http无状态,所有状态都保存在服务器端,比如session。cookie就是放在客户端。cookie当中放的是无关紧要的东西,cookie是在客户端的,不安全。比较重要的信息,放在session中,session在服务端。客户端想要操作服务器,要让服务器端发生状态转换。
  • 第一个原因:http是一种没有状态的协议。
  • 第二个原因:客户端和服务端交互,必须让服务端发生状态转换。
  • 基于第一个原因和第二个原因,这种状态转换就需要表现在表现层上了,所以,这个就叫做表现层状态转换。
  • REST就是资源表现层状态转换。

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_45

day05-1-springmvc核心注解和rest介绍_客户端_46

演示

day05-1-springmvc核心注解和rest介绍_客户端_47

08 - HiddenHTTPMethodFilter
  • 原来我们的方式:增删改查
    • 添加用户:使用POST方式,insertUser方法
    • 删除用户:使用GET方式,deleteUser方式
    • 修改用户
      • 查询用户:使用GET方式,getUserByID方法
      • 修改用户:使用POST方式,updateUser方法
    • 查询用户:使用GET方式,findAll方法

这种情况下,是需要设计,多种路径的。

  • 现在REST的方式:增删改查
    • 添加用户:使用POST方式,/user
    • 删除用户:使用DELETE方式,/user/1001
    • 修改用户:
      • 查询用户:使用GET方式,/user/1001
      • 修改用户:使用PUT方式,/user
    • 查询用户:使用GET方式,/user/1001

这种情况下,只需要一种路径,就可以搞定了。

day05-1-springmvc核心注解和rest介绍_地址栏_48

rest请求的情况下,服务器只需要接收请求,判断请求方式,

小问题和小想法

Put请求和delete请求,我们的服务器可以处理,但是我们的客户端不能够发送。

我现在有一个想法,就是把增删改查当中的增删改,全部都用post请求。

从客户端发出的请求增删改,我们全部都用post请求。

客户端发出的请求是同时处理增删改这三种情况的。

我们在发送的请求当中,包含一个参数,一个固定的参数叫做a。

在服务器端接收到了请求之后,我们来判断一下,接收到的请求的方式是否是post。

如果我们的服务器看到了这个请求的方式是post,然后第二步我们会看一下,看在请求当中是否携带了一个叫做a的参数。

如果客户端发过来的请求没有传参数的话,那么这就是个非常纯粹的post请求。

如果客户端发过来的请求是携带了参数a的话,我们的服务器要看一看这个a的参数的值是什么。

如果a参数的值是put,那么我们就把客户端发过来的请求的请求方式,从post转换为put。

如果a参数的值是delete,那我们就把客户端发过来的请求的请求方式从post转换为delete。

这样的话,我们的服务器对于post请求就能够处理增删改这三种情况了。

基于上面的小想法,我们是需要在客户端和服务器之间有一个中间的转换层。

监听器和过滤器

这个中间的转换成是服务器的一个组成部分,我们应该使用过滤器,filter来写这个转换层。

我们能不能够使用listener监听器这种东西来写这个转换成呢?也是可以的。

为什么是这样呢?因为根据我们前面的分析,我们的这个中间转换层是需要在请求处理之前,能够对请求做一些操作的。

那么我们在学习servlet的时候,是已经学习过web.xml的加载顺序的。

第一个被加载的叫做监听器,第二个被加载的叫做过滤器,第三个被加载的才是请求处理器servlet。

监听器和过滤器是在项目启动的时候就加载了,请求处理器servlet是在第一次请求过来的时候才会被加载的。

HiddenHTTPMethodFilter

Spring mvc当中已经提供好了一个为我们写好了的过滤器,叫做hidden http method filter。

我们直接来看一下,这个过滤器的源代码是怎么写的。

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_49

day05-1-springmvc核心注解和rest介绍_spring_50

day05-1-springmvc核心注解和rest介绍_客户端_51

我们可以看到这个hidden http method filter是实现了filter的接口,这说明了这个实际上就是一个过滤器。

day05-1-springmvc核心注解和rest介绍_客户端_52

这里的dofilterinternal就相当于过滤器当中的dofilter方法。

day05-1-springmvc核心注解和rest介绍_ajax_53

day05-1-springmvc核心注解和rest介绍_ajax_54

day05-1-springmvc核心注解和rest介绍_ajax_55

day05-1-springmvc核心注解和rest介绍_spring_56

day05-1-springmvc核心注解和rest介绍_地址栏_57

看一下HttpMethodRequestWrapper

day05-1-springmvc核心注解和rest介绍_ajax_58

Wrapper英文是包装的意思。

day05-1-springmvc核心注解和rest介绍_ajax_59

tomcat源码下载地址是在:http://archive.apache.org/dist/tomcat/

HttpMethodRequestWrapper这个东西是在tomcat的源码当中写的。

day05-1-springmvc核心注解和rest介绍_spring_60

day05-1-springmvc核心注解和rest介绍_客户端_61

真正来做,请求方式转换的是,http-method-request-wrapper

将hidden-http-method-filter这个过滤器配置在web.xml当中

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_62

day05-1-springmvc核心注解和rest介绍_地址栏_63

总结

day05-1-springmvc核心注解和rest介绍_ajax_64

09 - REST CRUD

测试rest get请求

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_65

day05-1-springmvc核心注解和rest介绍_ajax_66

测试rest post请求

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_67

day05-1-springmvc核心注解和rest介绍_客户端_68

  • post请求相当于添加的操作,不需要传id。
  • 那么我们需要把表单当中的数据,都拼接到路径的后面吗?
  • 不需要的,因为post的请求的参数,都是在请求体当中的。
  • 我们在springmvc当中,获取请求当中的数据,直接在方法的形参当中写参数,保证形参的名字和客户端传过来的表单元素的name一致,就可以了,也就是参数名字一致。

day05-1-springmvc核心注解和rest介绍_客户端_69

测试rest put请求

day05-1-springmvc核心注解和rest介绍_ajax_70

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_71

day05-1-springmvc核心注解和rest介绍_spring_72

过滤器获得了_method的值,如果是PUT或者DELETE请求,将method参数的值,转换为大写,然后将值给一个包装类,重置了请求的请求方式。

测试rest delete请求

day05-1-springmvc核心注解和rest介绍_spring_73

根据id进行删除

day05-1-springmvc核心注解和rest介绍_地址栏_74

day05-1-springmvc核心注解和rest介绍_客户端_75

day05-1-springmvc核心注解和rest介绍_客户端_76

ajax

大家有没有看过ajax的api,里面有一句话,里面设置请求方式的时候,可以设置8种。

通过form表单设置请求方式的时候,只能够设置两种。需要HiddenHTTPMethodFilter。

通过ajax设置请求方式的时候,可以设置8中。就不需要HiddenHTTPMethodFilter了。

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_77

需要引入jquery.js。

day05-1-springmvc核心注解和rest介绍_杨博超-SSM_78

大家喜欢用\(.ajax还是\).post还是$.get

我喜欢用$.ajax

第一层封装产生的方法,是最接近于原生ajax的方法。

jquery是对javascript进行了封装,javascript当中的ajax就是原生ajax。只不过里面写的东西比较多,会出现浏览器兼容性的问题。

原生ajax依赖于一个对象,叫做xmlHttpRequest对象。这个对象,在不同的浏览器当中,创建方式是不一样的。

比如说,咱们一般情况下就考虑两种情况,处理浏览器的时候,就是ie和非ie。

火狐和谷歌创建xmlHttpRequest对象的方式是一样的。

jquery对ajax进行了三层封装,第一层封装产生的方法,叫做\(.ajax方法,第二层封装就是\).post,\(.get,\).load,已经封装的东西非常多非常深,第三层封装就是\(.getJson,\).getScript,封装的程度越来越深,要写的代码越来越少了。

2019年6月17日 - day05 - 上午结束
乖乖学习,好好做事。