【SpringMVC】请求与响应
一、设置请求映射路径
当两个控制器中有相同的请求映射名时,即@RequestMapping的值相同,会报错,这时可以在类上加这个注解,设置请求访问路径前缀。
(1)下面先看UserController类
@Controller
@RequestMapping("/user") // 设置访问路径前缀为/user
public class UserController {
// 不可以有相同的@RequestMapping值
@RequestMapping("/add")
@ResponseBody
public String add(String name) {
System.out.println("user add ..." + name);
return "name is "+name;
}
@RequestMapping("/select")
@ResponseBody
public String select() {
System.out.println("user select ...");
return "select";
}
}
(2)启动tomcat7服务器,并使用Postman测试
测试结果:
至此,使用@RequestMapping定义请求路径前缀成功。
get请求就是在请求路径是加相关的参数,上面的设置请求路径中,就是使用的get请求发送数据name=1到后台。
测试结果:
在pom.xml文件中配置tomcat服务器插件时,加入uriEncoding标签,就可以解决get请求中文乱码问题。
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<!-- 解决get请求乱码问题-->
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
当使用Post请求发送中文时会乱码
解决Post请求乱码问题,需要在ServletContainerInitConfig类中添加编码过滤器。
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class}; // 告知Spring环境
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class}; // 告知SpringMVC环境
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"}; // 设置请求交由SpringMVC处理
}
// 处理Post请求乱码问题-get请求乱码-响应乱码
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
}
重启服务器,乱码问题解决!
下面通过调用UserController类中的5个方法,方法名叫update()加数字,启动tomcat服务器,然后来演示前面5种参数传递。
@Controller
@RequestMapping("/user")
public class UserController {
// (1)普通类型(参数名不同时,使用@RequestParam注解映射)
@RequestMapping("/update1")
@ResponseBody
public String update1(@RequestParam("username") String name) {
System.out.println("user update1 ..." + name);
return "update1 user ";
}
// (2)引用类型
@RequestMapping("/update2")
@ResponseBody
public String update2(User user) {
System.out.println("user update2 ..." + user);
return "update2 user";
}
// (3)嵌套引用类型
@RequestMapping("/update3")
@ResponseBody
public String update3(User user) {
System.out.println("user update3 ..." + user);
return "update3 user";
}
// (4)数组类型(参数名要和形参名一致,不一致时使用@RequestParam注解)
@RequestMapping("/update4")
@ResponseBody
public String update4(String[] values) {
System.out.println("user update4 ...");
for (String v : values) {
System.out.println(v);
}
return "update4 user";
}
// (5) 集合类型
@RequestMapping("/update5")
@ResponseBody
public String update5(@RequestParam List<String> list) {
System.out.println("user update5 ..." + list);
return "update5 user";
}
}
首先准备好一个实体类User,成员变量Cup类在下一点
public class User {
private String name;
private Integer age;
// 加入引用类型Cup
private Cup cup;
public Cup getCup() {
return cup;
}
public void setCup(Cup cup) {
this.cup = cup;
}
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;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", cup=" + cup +
'}';
}
}
上面的User类中,其实嵌套了Cup类,下面是Cup类的代码
public class Cup {
private String cupName;
private Integer weight;
@Override
public String toString() {
return "Cup{" +
"cupName='" + cupName + '\'' +
", weight=" + weight +
'}';
}
public String getCupName() {
return cupName;
}
public void setCupName(String cupName) {
this.cupName = cupName;
}
public Integer getWeight() {
return weight;
}
public void setWeight(Integer weight) {
this.weight = weight;
}
}
下面通过调用BookController类中的3个date()加数字方法,使用@DateTimeFormat注解定义日期格式从而完成转换。
@Controller
@RequestMapping("/book")
public class BookController {
// (1)yyyy/mm/dd格式
@RequestMapping("/date1")
@ResponseBody
public String date1(Date date1) {
System.out.println("date1 ..." + date1);
return "date1";
}
// (2)yyyy-mm--dd格式
@RequestMapping("/date2")
@ResponseBody
public String date2(@DateTimeFormat(pattern = "yyyy-mm-dd") Date date2) {
System.out.println("date2 ..." + date2);
return "date2";
}
// (3)yyyy-mm-dd hh-mm-ss格式
@RequestMapping("/date3")
@ResponseBody
public String date3(@DateTimeFormat(pattern = "yyyy/mm/dd hh/mm/ss") Date date3) {
System.out.println("date3 ..." + date3);
return "date3";
}
}
(1)yyyy/mm/dd格式
(2)yyyy-mm–dd格式
(3)yyyy-mm-dd hh-mm-ss格式
注意:hh-mm-ss是12小时计算的,小时不能超过12,否则报错;
如果要使用24小时计算的,需要使用yyyy-mm-dd HH-mm-ss格式。
第一种格式是Spring默认转化模式,第二、三种情况要使用@DateTimeFormat注解表名转化的格式pattern,具体看上面的代码。
步骤:
(1)在pom.xml文件中导入json数据转换依赖
<!-- json,如果是其他的json转换器可能不支持,建议使用这个jar包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
(2)在SpringMVC配置类中开启自动转换支持
@Configuration
@ComponentScan("com.itxiaoguo.controller")
@EnableWebMvc // 根据类型匹配相应的转换器(如JSON转换器,日期转换器)
public class SpringMvcConfig {
}
(3)在Postman发送json数据
(4)使用BookController类,这里将测试日期转化的方法删除了,具体看下面代码,Send发送数据测试,分别由下面三种情况。
@Controller
@RequestMapping("/book")
public class BookController {
// (1)json数组
@RequestMapping("/json1")
@ResponseBody
public String json1(@RequestBody List<String> list) {
System.out.println("json1 ..." + list);
return "json 1";
}
// (2)json对象
@RequestMapping("/json2")
@ResponseBody
public String json2(@RequestBody User user) {
System.out.println("json2 ..." + user);
return "json 2";
}
// (3)json对象集合
@RequestMapping("/json3")
@ResponseBody
public String json3(@RequestBody List<User> user) {
System.out.println("json3 ..." + user);
return "json 3";
}
}
注解类型 | @RequestParam注解 | @RequestBody注解 |
---|---|---|
适用情况 | Get/Post/URL请求传参 | JSON传参 |
下面通过CupController类来测试下面三种响应,在webapp下新建了一个page.jsp页面,打印helloworld!
@Controller
@RequestMapping("/cup")
public class CupController {
// (1)响应页面(不用加@ResponseBody注解)
@RequestMapping("/page")
public String page() {
System.out.println("page ...");
return "../page.jsp";
}
// (2)响应字符串
@RequestMapping("/str")
@ResponseBody
public String str() {
System.out.println("str ...");
return "hello";
}
// (3)响应JSON数据
@RequestMapping("/json")
@ResponseBody
public User json() {
System.out.println("json ...");
User user = new User();
user.setName("xiaoguo");
user.setAge(18);
return user;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>响应页面</title>
</head>
<body>
hello world!
</body>
</html>
至此,@ResponseBody注解的作用是设置当前方法返回值作为响应体。
- 点赞
- 收藏
- 关注作者
评论(0)