Spring MVC 学习笔记 --- [SpringMVC的几个注解标签说明,获取请求数据,springmvc提供的中文乱码过滤配置]
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC 学习笔记 --- [SpringMVC的几个注解标签说明,获取请求数据,springmvc提供的中文乱码过滤配置]相关的知识,希望对你有一定的参考价值。
文章目录
1.SpringMVC的几个注解说明
首先是在类上写的@Controller
;或者@RestController
;仅能作用类;
标注这个类为spring生成这个类的对象;且为控制层;
注解@RequestMapping
处理请求地址映射;可以写在类上,或者写在方法上,写在类上的话,
这个注解写在类上的话,在整个项目中不能重复;
这个注解写在方法上时,在同一个类中,不能重复;
键入注解,可看到;value
和path
属性可以设置一组映射路径;
value 就是请求的路径;径相对于应用的上下文;和path是一样的;
//这个path或者value中可以配置一组路径
@RequestMapping(path = "test0","test1","test3")
public void test1()
System.out.println("测试1");
在注解@RequestMapping
的method属性;可配置请求的方式,比如GET/POST
//可用method属性标明请求的方式;
@RequestMapping(path = "/test1s",method = RequestMethod.POST)
public void test2()
System.out.println("测试2");
当然,如果不想用method进行标注的话,实际也可
使用注解@GetMapping
;@PostMapping
来匹配相应的请求方式;
@GetMapping(path = "/findU")
public void test3()
@PostMapping(path = "/addU")
public void test4()
2.过滤静态资源设置
为避免踩坑,这里提前说下怎么配置静态资源过滤吧;
<mvc:default-servlet-handler/>
在spring-mvc.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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--开启springmvc注解支持-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--过滤静态资源-->
<mvc:default-servlet-handler/>
</beans>
3.中文乱码过滤处理设置
之前在学习web时,自定义写过中文乱码过滤器,
springmvc提供了这项设置;配置即可使用;
在web.xml
下配置
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其中还有初始化参数encoding
4.获取请求数据
用案例来说明不同的获取方式;
方式(1) 若前端传输的数据参数和后端处理方法中的方法参数一致
参数名一致时,直接在处理的方法处,用对应的方法参数取值即可;
案例测试
先写个简易html页面index.html
;这里就放一个链接
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="person/getPerson?id=12&name=xiaozhire0&age=22">这是一个链接</a>
</body>
</html>
处理的controller层
@RestController
@RequestMapping(path = "/person")
public class PersonController
//接收数据测试;
//方式1:若前端传输的数据参数和后端处理方法中的方法参数一致;
//我这里直接就用了传递的id,name,age同名的;
@GetMapping("/getPerson")
public void getPerson1(Integer id,String name,Integer age)
//收到获取的数据;
System.out.println("获取Id-->"+id);
System.out.println("获取姓名-->"+name);
System.out.println("获取年龄-->"+age);
访问http://localhost:8080/ssmdemobyxiaozhi/index.html
点击链接,已经获取到了数据
方式(2) 若前端传输的数据参数和后端处理方法中的方法参数不一致
这时就要在处理的方法参数前使用注解@RequestParam("前端的传输参数名")
;还可以用注解的方式获取请求头中的参数;例如@RequestHeader("User-Agent") String UG
首先看看,要是参数名不一致,我用方式1还行不;
不一致,已经获取不到了;
案例测试
搭建简易页面,index.html
;就存入链接;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="person/getPerson?id=99&name=xiaozhire0s&age=22">这是一个链接</a>
</body>
</html>
controller控制层处理;
@RestController
@RequestMapping(path = "/person")
public class PersonController
//接收数据测试;
//方式2:
@GetMapping("/getPerson")
public void getPerson1(@RequestParam("id") Integer ids,
@RequestParam("name") String namesdasda,
@RequestParam("age") String agesdaa,
@RequestHeader("User-Agent")String user_agent)
//收到获取的数据;
System.out.println("获取Id-->"+ids);
System.out.println("获取姓名-->"+namesdasda);
System.out.println("获取年龄-->"+agesdaa);
System.out.println("请求头参数->"+user_agent);
访问,点击链接,可直接获取
方式(3)使用httpservletrequest接收数据;
这个方法的话,需要在pom.xml文件下导入servlet的maven包
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
然后,和以前刚开始学web一样,用request
请求的getParameter()
方法获取指定的参数;但是这种方式的话,获取的值会被转为字符串;而且要是数据量大的话,要写多个这样的获取方法getParameter()
;是比较麻烦的;
案例展示
这里的话,就用post方式提交了,
写个简易的index.html
,来面放个简易表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是个简易的表单
<form action="person/getPerson" method="post">
<input type="text" name="id"/><br/>
<input type="text" name="name"/><br/>
<input type="text" name="age"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
大概效果这样
controller层处理的方法
@RestController
@RequestMapping(path = "/person")
public class PersonController
//方式3:
@PostMapping("/getPerson")
public void getPerson3(HttpServletRequest request)
//用request的方法获取参数;
String id = request.getParameter("id");
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println("获取Id-->"+id);
System.out.println("获取姓名-->"+name);
System.out.println("获取年龄-->"+age);
启动测试.提交表单可获取数据
方式(4)将请求数据的参数与实体类的属性进行绑定
注意,提交的数据的参数名要和实体类的属性名一致;不然封装不到数据;
注意,日期类型的属性,在实体类中要用注解@DateTimeFormat(pattern = "YYYY-MM-dd")
,
进行标注(格式);不然有错误;
案例搭建
;
这里写个模拟表单提交,向数据库中添加数据的案例;
实体类的话就用之前的这个案例的实体类;People
;这里日期类型的加了注解;
//将这个类注入到spring;
@Component
public class People
//这边的话,就保持和数据库的字段名一致吧;
private Integer id;
private String name;
private String password;
private Integer age;
@DateTimeFormat(pattern = "YYYY-MM-dd")
private Date birthday;
public Integer getId()
return id;
public void setId(Integer id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getPassword()
return password;
public void setPassword(String password)
this.password = password;
public Integer getAge()
return age;
public void setAge(Integer age)
this.age = age;
public Date getBirthday()
return birthday;
public void setBirthday(Date birthday)
this.birthday = birthday;
@Override
public String toString()
return "People" + "id=" + id +
", name='" + name + '\\'' +
", password='" + password + '\\'' +
", age=" + age +
", birthday=" + birthday +
'';
提交的简易表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是个添加人类信息的表单
<form action="person/addPerson" method="post">
姓名:<input type="text" name="name"/><br/>
密码:<input type="text" name="password"/><br/>
年龄:<input type="text" name="age"/><br/>
生日:<input type="text" name="birthday"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
控制层处理
@RestController
@RequestMapping(path = "/person")
public class PersonController
@Autowired
private PersonService personService;
//方式4:将请求的参数与实体类的属性进行绑定;
@PostMapping("/addPerson")
public void addPerson(People people)
System.out.println("这个添加的用户->"+people);
//调用方法,直接添加;
personService.savePeople(people);
执行测试;
控制台日志信息显示有添加行为
数据完成提交
既然是案例演示,这里就打上断点,看看这边的处理情况;
cglib代理
再看看日期不用注解标注,会出现啥情况;
先把注解去了
出现错误
仔细看这段错误,他说是字符串转换日期格式有问题;也就是我这用text请求发出的是字符串;
以上是关于Spring MVC 学习笔记 --- [SpringMVC的几个注解标签说明,获取请求数据,springmvc提供的中文乱码过滤配置]的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC学习笔记——WebContentGenerator
Spring MVC学习—ViewSolvsolver视图解析器的详细介绍与使用案例