SpringMvc注解
SpringMvc注解
1 SpringMcv基础环境搭建
注:如果已经有SpringMvc项目直接跳过这个就可以了
1 新建项目
2.修改文件为packaging 为war包
<packaging>war</packaging>
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.xi</groupId><artifactId>spring-mvc01</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--导入依赖--><!--springMvc依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.1.12</version></dependency><!--logback-classic日志--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.5.7</version></dependency><!--servlet-api--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.1.0</version></dependency></dependencies></project>
4.刷新依赖
5.新建webapp文件目录
6.创建spring的config文件
spring-mvc01===>src ===> main == resources ==>新建config.xml
7.修改config.xml文件
<?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.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd" ><!--开启包扫描--> <context:component-scan base-package="org.xi"/><!--开启springmvc注解--><mvc:annotation-driven/></beans>
8.打开project Structue
下面方法二选一
- File===>Project Structure
- Ctrl+Alt+Shift+S
9.创建web.xml文件
Modules ===> spring-mvc01 ==> Web ===> + ===>修改路径====>添加src\main\webapp\
C:\Users\Administrator\IdeaProjects\demo1\spring-mvc01\src\main\webapp\WEB-INF\web.xml
10.修改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"><!--配置servlet--><servlet><servlet-name>myServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!---配置spring的配置文件位置----><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:config.xml</param-value></init-param><!--初始化提前--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>myServlet</servlet-name><url-pattern>/*</url-pattern></servlet-mapping> </web-app>
11.创建MyController类
- 新建controller包
- 创建MyController类(注:这个名字随意)
- 添加(@Controller注解)
package org.xi.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;@Controller @RequestMapping(produces = {"text/html;charset=UTF-8"}) public class MyController { @RequestMapping( value = "/" ) @ResponseBodypublic String index(){return "你好啊";} }
注:
@Controller ===> 标注控制层
@RequestMapping("/index") ===> 映射请求到指定的处理方法上
@ResponseBody ===> 把数据直接写入响应体中
@RequestMapping{ produces ={"text/html;charset=UTF-8"}} 这个是解决给前端页面乱码问题的
@RequestMapping( value="/") 映射返回给前端的路径
12.为项目配置tomcat
流程如下:
Current File ===> Edit Configation ==>add new ===> Tomcat Server ==>local==>Configure===>Fix ===>选择一个war包
下面是图的详解流程:
修改路径
13.测试
访问http://localhost:8080/
基础环境准备完毕
2.SpringMvc注解
1.@RequestMapping
解释
value属性用于请求映射该地址
method属性 有{GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE}
- GET:请求获取由请求的URI标识的资源。通常用于检索数据。
- HEAD:与GET相同,但是服务器不返回响应体,只返回头部信息。这可以用来检查资源的状态或元数据,而不传输实际的内容。
- POST:用于向指定资源提交数据,通常用于创建新的资源或更新资源。
- PUT:替换由请求的URI标识的资源。通常用于上传文件或更新整个资源。
- PATCH:对资源进行部分修改。与PUT不同的是,PATCH只需要发送需要修改的部分。
- DELETE:删除由请求的URI标识的资源。
- OPTIONS:用于获取有关目标资源支持的通信选项的信息。通常用于跨域请求(CORS)预检。
- TRACE:执行一个消息环回测试,主要用于调试客户端连接到服务器的通信链路。
/*** RequestMapping注解*/ @RequestMapping(//这个是请求路径value = "/hello",//这个是请求方式的设置,有GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACEmethod = {RequestMethod.GET}) @ResponseBody public String hello(){return "RequestMapping注解"; }
浏览器访问:http://localhost:8080/hello
2.请求方法不正确
请求方法如果不匹配,那么请求也会不响应
如果把方法换成POST,在访问浏览器就无法访问了 ,会出现405方法无法访问
@RequestMapping(//这个是请求路径value = "/hello",//这个是请求方式的设置,有GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;method = {RequestMethod.POST})
@ResponseBody
public String hello(){return "RequestMapping注解";
}
22:58:11.063 [http-nio-8080-exec-9] DEBUG org.springframework.web.servlet.DispatcherServlet -- Completed 405 METHOD_NOT_ALLOWED
这时需要我们发送POST请求====》成功访问
3.@RequestMapping默认支持的方法
注:使用工具POSTMAN测试的
4.@RequestMapping衍生注解
@GetMapping:
- 这个注解是
@RequestMapping
的一个特例,专门用来映射 HTTP GET 请求。 - 例子
/*** @GetMapping 获取请求资源*/@GetMapping("/game")@ResponseBodypublic String testGetMapping(){return "获取资源逻辑";}
@PostMapping:
- 用于映射 HTTP POST 请求。
- 例子
/*** @PostMapping 创建资源*/@PostMapping("/game")@ResponseBodypublic String testPostMapping(){return "创建资源逻辑";}
@PutMapping:
- 映射 HTTP PUT 请求,通常用于更新资源。
- 示例:
/*** @PutMapping 更新资源*/@PutMapping("/game")@ResponseBodypublic String testPutMapping(){return "更新资源逻辑";}
@DeleteMapping:
- 映射 HTTP DELETE 请求,用于删除资源。
- 示例:
/**** @DeleteMapping 删除资源**/@DeleteMapping("/game")@ResponseBodypublic String testDeleteMapping(){return "删除资源逻辑";}
总结:
即使是相同的路径,只要是请求方法不同,执行的操作也是不同的。虽然是相同的访问路径,但是请求方法不同,后端服务器接受到之后所执行的操作也是不同的
注: 这个有点类似方法的重构,方法名相同,方法的参数的类型不同,方法的参数个数不同,虽然是相同的方法名,但是方法的不是同一个方法
5.路径占位符的使用(@PathVariable
)
注意事项:
-
命名一致性:路径占位符名称必须与
@PathVariable
注解中的名字相匹配。例如,如果路径是/users/{user_id}
,那么在方法中就应该使用@PathVariable("user_id")
。 -
参数类型:确保
@PathVariable
的参数类型与实际传递的值类型一致,例如 Long、String 等。 -
默认值:
@PathVariable
可以接受默认值,但这是一个可选特性。如果需要设置默认值,可以在注解中指定,例如@PathVariable("id") Long userId = 0L
。 -
路径匹配:如果需要对路径占位符进行更严格的匹配,可以使用正则表达式,例如
@PathVariable(value = "id", required = false) @Pattern(regexp = "\\d+") String id
。 -
必需性:如果路径参数是必需的,可以通过设置
required = true
来强制要求客户端必须提供该参数。
@RequestMapping("/{id}") {占位符名称} 需要与 @PathVariable参数连用标注
/*** 路径参数获取*/ @GetMapping("/path/{id}") @ResponseBody public String getPath(@PathVariable(value="id",required=true) Integer id){return "path参数获取:"+id; }
打开浏览器输入http://127.0.0.1:8080/path/1
打开浏览器输入http://127.0.0.1:8080/path/2
如果不传递参数
6.获取查询参数-Param参数(@RequestParam注解)
@RequestParam
注解有一些有用的属性:
- name:指定参数的名称,默认值是方法参数的名称。
- required:指定是否必须提供此参数,默认值是
true
。如果设置为false
,则允许客户端省略此参数。 - defaultValue:指定参数的默认值。如果客户端未提供此参数,则使用此默认值。
- value:等同于
name
属性。
注:
http://localhost:8080/params?name=张三&age=18
http://localhost:8080/params?name=张三&age=18
代码如下
/*** 查询参数获取*/ @GetMapping("/params") @ResponseBody public String getParams(//这个参数默认要传,required=true@RequestParam(value = "name",required = true) String name,//这个参数可以不传,required=false@RequestParam(value = "age",required = false) Integer age,//这个参数可以不传,但是有默认值@RequestParam(value = "sex",required = false,defaultValue = "男") String sex){return "请求参数获取:"+"name:"+name+"\n"+"age:"+age+"\nsex:"+sex+"\n"; }
参数传递:name=张三 + age=18 ====>结果 ====>name=张三 age=18 sex有默认值为男
参数传递: name=张三 age=18 sex=女 ====>结果===>name=张三 age=18 sex=女
参数传递: name=张三 sex=女 ====>结果 ===> name=张三 age=null sex=女
参数传递:name=张三 ===>结果===>name=张三 age=null sex=男
7.实体类接受路径参数
1.实体准备
注:实体类的属性名,必须和查询参数名一致
package org.xi.controller;public class Student {private String name;private Integer age;private String sex;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;} }
2.方法实现
/*** 通过实体获取查询参数*/
@GetMapping("/params2")
@ResponseBody
public String getParams2(Student student){return "请求参数获取:"+student.toString();
}
3.测试
浏览器输入:http://127.0.0.1:8080/params2?name=xiji&age=20&sex=男http://127.0.0.1:8080/params2?name=xiji&age=20&sex=男
8.@RequestBody
获取请求体中的数据,并且转化为java对象
1.创建一个对象
package org.xi.controller;public class Dog {private String name;private int age;private String color;private String sex;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", age=" + age +", color='" + color + '\'' +", sex='" + sex + '\'' +'}';} }
2.controller实现
/*** 获取请求体中的数据*/ @RequestMapping(value = "/req" ,produces = {"application/json"}) @ResponseBody public String getReqBody(@RequestBody Dog dog){System.out.println("请求体:"+dog.toString());return "请求体:"+dog.toString()+"\n"+"name:"+dog.getName()+"\n"+"age:"+dog.getAge()+"\n"+"sex:"+dog.getSex()+"\n"+"color:"+dog.getColor(); }
3.测试
出现415错误
出现这个错误的是因为springMvc无法处理Post请求中的json数据,缺少处理JSON的依赖包
解决方案:
- 手动处理前端传来的json数据
- 导入相关的依赖包(推荐)
第二种解决方案
<!-- Jackson -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.16.0</version>
</dependency>
可以看到发送Post请求已经可以成功获取了
9. @ResponseBody
响应体数据 加上之后返回的数据就变成响应提数据
10.@RestController
注解的本质就是 @Controller + @RequestBody注解
如下图