【SpringMVC】请求与响应
source link: https://blog.51cto.com/u_15640313/6854051
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
【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测试
测试结果:
二、请求发送数据
2.1 get请求
get请求就是在请求路径是加相关的参数,上面的设置请求路径中,就是使用的get请求发送数据name=1到后台。
2.2 post请求
测试结果:三、请求乱码问题
3.1 get请求处理中文乱码
在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>
3.2 post请求处理中文乱码
当使用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};
}
}
重启服务器,乱码问题解决!
四、6种请求参数传递
下面通过调用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";
}
}
4.1 普通参数
4.2 实体类参数
首先准备好一个实体类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 +
'}';
}
}
4.3 嵌套实体类的实体类参数
上面的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;
}
}
4.4 数组参数
4.5 集合参数
4.6 日期参数
下面通过调用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,具体看上面的代码。
五、json数据传递
步骤:
(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";
}
}
5.1 json数组
5.2 json对象
5.3 json对象数组
注解类型 | @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>
6.1 响应页面
6.2 响应文本
6.3 响应JSON数据
至此,@ResponseBody注解的作用是设置当前方法返回值作为响应体。- 赞
- 收藏
- 评论
- 分享
- 举报
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK