一、设置请求映射路径
当两个控制器中有相同的请求映射名时,即@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定义请求路径前缀成功。
二、请求发送数据
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数据