搭建框架
引入依赖
添加web模块,创建web.xml,注意创建了webapp目录必须要带蓝色的小圆点
web.xml文件内容
控制器TestController.java
SpringMVC配置文件
index.html
tomcat实例部署新的SpringMVC工程
控制器中有多个方法对应同一个请求的情况
@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系,SpringMVC接收到请求,就会找到映射关系中对应的控制器方法来处理这个请求
如果有两个或以上控制器方法的@RequestMapping注解的value属性值是相同的,表明它们处理的是同一请求路径的请求,此时会报错
@RequestMapping注解
标识的位置,该注解可以标识在类上,也可以标识在方法上
标识类时为设置映射请求路径的初始信息,标识方法时为设置映射请求路径的具体信息。即要先访问到初始信息然后才能访问到具体信息
在类和方法上都加上@RequestMapping注解
package com.atguigu.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
("/hello")
public class RequestMappingController {
("/testRequestMapping")
public String success() {
return "success";
}
}
当有两个控制器中的两个控制器方法的请求路径相同的需求时,即控制器方法的@RequestMapping注解的value值相同,此时是会报错的。就能通过在两个类上加@RequestMapping注解搭配不同的value值解决,即像这样访问:/user/list、/order/list,两个类的注解是/user和/order,两个控制器方法的注解都是/list
value属性
根据请求的地址匹配控制器方法,value属性值必须设置,value属性值可以是包含多个字符串的数组,请求地址满足其一就可以匹配上该控制器方法
method属性
根据请求的方式匹配控制器方法,该属性可以设置多个值,表示能接收多种请求方式的请求,若请求地址匹配value属性值但不匹配method属性,则浏览器端报405错误
get请求和post请求:get请求会将请求参数以name=value的方式用&拼接,然后用?拼接在请求地址的后面;而post还是以name=value的方式表示请求参数,并用&拼接请求参数,放在请求体中。get方式信息不安全,post相对安全。get方式传输速度快,post方式相对慢。get方式能传输的信息有限,post理论上无限制。文件上传时只能使用post方式
当没有设置method属性时,可以匹配任何方式的请求。都能正常访问
当设置method属性只能匹配get请求后,只有匹配请求地址且请求方式为get的请求才能正常访问
当请求的地址匹配value值,但不匹配请求方式时报405错误
结合请求方式的派生注解
对于处理指定请求方式的控制器方法,SpringMVC提供了@RequestMapping的派生注解,处理get、post、put、delete请求的映射分别是@GetMapping、@PostMapping、@PutMapping、@DeleteMapping。即@GetMapping就是只处理get请求的@RequestMapping,不需要设置method属性
测试form表单是否能够发送put和delete请求方式的请求
常用的请求方式有get、post、put、delete,可以对同一请求地址发起不同方式的请求,表示对同一资源执行不同的操作,如获取、修改、删除等
但目前浏览器只支持get和post方式,若在form表单提交时,对method属性设置为put或delete,则会按照默认的请求方式get处理
报405错误,说明浏览器实际发送的是get请求,请求地址正确但请求方式不匹配
@RequestMapping注解
params属性
根据请求参数匹配控制器方法,params属性是一个字符串类型的数组,请求参数要同时满足params属性的所有值才能匹配控制器方法。可以通过四种表达式设置请求参数和映射的匹配关系,"param":要求请求必须携带param参数,"!param":要求请求必须不能携带param参数,"param=value":要求请求必须携带param参数且值为value,"param!=value":要求请求必须携带param参数且值不为value
要求请求必须携带参数username
否则报400的错误
请求中携带了username参数,在浏览器端(username=...)被解析为?username=...&password=...追加到请求地址后面,所以就能正常访问
要求请求中必须携带参数username和password,且password的值必须为123456
headers属性
根据请求头信息匹配控制器方法,headers属性是一个字符串类型的数组,请求头信息要同时满足headers属性的所有值才能匹配控制器方法。可以通过四种表达式设置请求头信息和映射的匹配关系,"header":要求请求必须携带header请求头信息,"!header":要求请求必须不能携带header请求头信息,"header=value":要求请求必须携带header请求头信息且值为value,"header!=value":要求请求必须携带header请求头信息且值不为value。若请求匹配@RequestMapping的value和method属性,但不匹配headers属性,则显示404错误即资源未找到
请求头信息中的Host要为localhost:8081才能匹配,否则报404错误
SpringMVC支持ant风格的路径
?表示匹配任意单个字符,*表示匹配任意的0个或多个字符,**表示匹配任意的一层或多层目录(只能使用/**/xxx的方式)
SpringMVC支持路径中的占位符
通过请求地址传参时,可以使用?拼接name=value的方式:/deleteUser?id=1,也可以使用restful风格的方式:/deleteUser/1
SpringMVC路径中的占位符常用于restful风格中,在请求路径中将某些数据写成路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符表示传输的数据,再通过@PathVariable注解将占位符表示的数据赋值给控制器方法的形参
必须要给路径中的占位符{id}、{username}传值,否则报404错误