上篇SpringMVC--初入SpringMVC中,我们对SpringMVC有了初步的认识,作为开发者,我们日常使用SpringMVC,只需要关注Controller层的业务代码,其余的都由SpringMVC容器帮助处理。
一、@RequestMapping注解
@RequestMapping注解除了用于指定请求的路径,还有以下功能
指定请求方式
注解中指定method参数的值来表示请求的方式:
代码语言:javascript复制@RequestMapping(value = "hello2.do",method = RequestMethod.POST)
限制请求参数的条件
注解中指定params参数:
代码语言:javascript复制// 请求参数必须有name和pwd,并且name不能为空
@RequestMapping(value = "hello2.do", params = {"name!=", "pwd"})
限制请求消息头的条件
注解中指定headers参数:
代码语言:javascript复制// 请求头的Accept-Encoding必须为gzip, deflate
@RequestMapping(value = "hello2.do", headers = {"Accept-Encoding=gzip, deflate"})
二、接收请求参数
除了支持servlet的方式获取HttpServletRequest,HttpServletResponse,SpringMVC还支持以下方式
1. 直接使用传参接收
controller中定义请求:
代码语言:javascript复制 @RequestMapping("requestParam1")
@ResponseBody
public String requestParam1(String username) {
System.out.println(username);
return "success";
}
@ResponseBody注解表示返回值使用字符串处理,不做视图处理
jsp中定义表单:
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
hello2 jsp
<form action="requestParam1">
<input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>
</html>
结果:
控制台输出:
2. 使用@RequestParam注解指定参数名
上面默认使用传参的变量名作为接收参数名,还可以通过@RequestParam注解指定参数名
controller代码:
代码语言:javascript复制 @RequestMapping("requestParam2")
@ResponseBody
public String requestParam2(String username, @RequestParam("pwd") String password) {
System.out.println("username:" username "password:" password);
return "success";
}
form表单代码:
代码语言:javascript复制<form action="requestParam2">
username:<input type="text" name="username">
pwd:<input type="text" name="pwd">
<input type="submit" value="提交">
</form>
3.实体类接收参数
定义实体类:
代码语言:javascript复制@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private String name;
private Integer gender;
private Integer age;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
}
针对日期格式可以使用@DateTimeFormat注解指定
定义controller中请求:
代码语言:javascript复制 @RequestMapping("requestParam3")
@ResponseBody
public String requestParam3(User user) {
System.out.println(user.toString());
return "success";
}
表单代码:
代码语言:javascript复制<form action="requestParam3">
<p>name:<input type="text" name="name"></p>
<p>gender:<input type="radio" name="gender" value="0">男 <input type="radio" name="gender" value="1">女</p>
<p>age:<input type="text" name="age"></p>
<p>birthday:<input type="text" name="birthday"></p>
<p><input type="submit" value="提交"></p>
</form>
测试结果:
4. REST风格
需要使用@PathVariable注解指定参数名
代码语言:javascript复制 @RequestMapping("requestParam4/{id}/{name}")
@ResponseBody
public String requestParam4(@PathVariable("id") Integer id, @PathVariable("name") String name) {
System.out.println("id:" id.toString() "name:" name);
return "success";
}
直接浏览器请求:
控制台打印:
三、返回响应
通过之前的使用,我们对SpringMVC请求返回有了一个大致了解,默认需要返回一个字符串,是视图的相对路径,可以通过配置视图解析器的前缀和后缀来简化使用。而争对需要直接返回数据的情况,在方法上加上@ResponseBody注解,接下来来详细使用SpringMVC的请求响应
1. 请求转发
除了使用servlet请求对象进行转发外,SpringMVC还提供了以下几种方式
1.1 forward字符串拼接
返回时,在字符串前面加上"forward:/"前缀
代码语言:javascript复制 @RequestMapping(value = "helloForward")
public String forward() {
return "forward:/hello2";
}
SpringMVC默认使用的就是这种方式,所以前缀可以省略不加
1.2 使用View对象
我们还可以指定返回为View视图对象,告诉SpringMVC我们返回的是一个视图
转发对应的View实现类为InternalResourceView
代码语言:javascript复制 @RequestMapping(value = "helloForwardView")
public View forwardView() {
View ret = new InternalResourceView("hello2");
return ret;
}
1.3 使用ModelAndView对象
ModelAndView既包含了数据,又包含了视图
ModelAndView即支持设置View的方法,也支持设置ViewName的方法
代码语言:javascript复制 @RequestMapping(value = "helloForwardModelView")
public ModelAndView forwardModelView() {
ModelAndView ret = new ModelAndView();
// ret.setView(new InternalResourceView("hello2"));
ret.setViewName("hello2");
return ret;
}
2. 请求重定向
和转发对应的,重定向也可以使用上面的几种方式
2.1 redirect字符串拼接
代码语言:javascript复制 @RequestMapping(value = "helloRedirect")
public String redirect() {
return "redirect:/hello2";
}
2.2 使用View对象
重定向使用的实现类为RedirectView
代码语言:javascript复制 @RequestMapping(value = "helloRedirectView")
public View redirectView() {
View ret = new RedirectView("hello2");
return ret;
}
2.3 使用ModelAndView对象
代码语言:javascript复制 @RequestMapping(value = "helloRedirectModelView")
public ModelAndView redirectModelView() {
ModelAndView ret = new ModelAndView();
// ret.setView(new RedirectView("hello2"));
ret.setViewName("redirect:/hello2");
return ret;
}
3. 响应Json
开发中使用最多的方式就是请求返回Json数据,SpringMVC返回Json数据也很简单
3.1 引入jackson依赖
代码语言:javascript复制 <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
3.2 返回Json
会自动的转化成Json数据返回
代码语言:javascript复制 @RequestMapping(value = "respJson")
@ResponseBody
public User respJson() throws JsonProcessingException {
return new User("张三", 0, 18, new Date());
}
浏览器直接访问:
3.3 使用ajax获取
导入jquery:
配置静态资源放行:
代码语言:javascript复制<?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:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
...
<!--静态资源放行-->
<mvc:resources mapping="/js/**" location="/WEB-INF/js/"></mvc:resources>
</beans>
html中增加js方法:
代码语言:javascript复制<html>
<head>
<title>Title</title>
<script src="js/jquery-1.10.2.min.js"></script>
<script>
$(function () {
$("#btn_json").click(
function () {
$.get("respJson",{name:'小明',age:'20'},function (data) {
console.log(data.name)
console.log(data.age)
console.log(data.gender)
console.log(data.birthday)
})
}
)
})
</script>
</head>
<body>
hello2 jsp
<form action="requestParam1">
<input type="text" name="username">
<input type="submit" value="提交">
</form>
<form action="requestParam2">
username:<input type="text" name="username">
pwd:<input type="text" name="pwd">
<input type="submit" value="提交">
</form>
<form action="requestParam3" method="post">
<p>name:<input type="text" name="name"></p>
<p>gender:<input type="radio" name="gender" value="0">男 <input type="radio" name="gender" value="1">女</p>
<p>age:<input type="text" name="age"></p>
<p>birthday:<input type="text" name="birthday"></p>
<p><input type="submit" value="提交"></p>
</form>
<button id="btn_json">ajax获取json</button>
</body>
</html>
项目地址:
https://gitee.com/aruba/spring-mvcstudy.git