1. 前言
今天以整理知识点的角度来梳理下整个SpringMVC的过程。 以及过程中的注意点
2. 合适人群
- 初学Spring MVC的人
- 有基于Spring MVC短期做需求的人
3. 开始
3.1 @RequestMapping
RequestMapping一般指的是请求映射路径,其实就是我们所说的接口地址,其实这个注解可以修饰类 以及方法
- 注意点:
- 如果没有修饰类,只修饰了方法的话,方法名前的
/
可以任意添加 - 但是如果类,方法两者都修饰了的话,方法名前面必须添加
/
- 如果没有修饰类,只修饰了方法的话,方法名前的
3.1.1 种类
public class TestRequestController {
@RequestMapping("/testReq")
public void testReq() {
}
@GetMapping("/testGet")
public void testGet() {
}
@PostMapping("/postMapping")
public void testPost() {
}
@DeleteMapping
public void testDel() {
}
@PutMapping
public void testPut() {
}
}
- 上述的代码中是大致的Mapping分类,只有第一个请求没有指定请求方式,其余的方法都指定了请求方式
3.1.2 其他
- 除了可以修饰请求方式,其实还可以修饰
params
以及headers
- param:表示请求中必须包含名为param的参数
- !param:表示请求中不能包含名为param的参数
- param = value 表示请求中包含名为param的参数,但是值必须是value
- param != value 表示请求中包含名为param的参数,但是值不能是value
- {“param1”,“param2=value”},可以将对于多个参数的要求写入数组
@RequestMapping( value = "/***" ,params = {"username!=root","password"})
@RequestMapping( value = "/***",headers = {"Accept-Encoding=gzip, deflate"})
3.1.2 REST风格
那一般我们遇到restful风格的路径,怎么获取路径中的值呢,下面给大家列举两个实例
@RequestMapping(value = "/test/rest01/{name}")
public void testRest01(@PathVariable String name) {
System.out.println(name);
}
@RequestMapping(value = "/test/rest02/{name}/{id}")
public void testRest02(@PathVariable(value = "name") String pname, @PathVariable String id) {
System.out.println(pname);
System.out.println(id);
}
- 上述中的注解
@PathVariable
目的就是将路径中内容映射到指定的参数中 - 原则上参数名称必须相同,如果不同的话,需要使用
value
来指定
3.2 请求参数
3.2.1 参数注入的两种方式
@RestController
public class TestDataController {
/*紧耦合方式参数注入
* 使用传统的HttpServletRequest对象获取参数 javax.servlet
* */
@RequestMapping("/getParamByRequest.do")
public String getParam1(HttpServletRequest req, HttpServletResponse resp){
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("username:"+username+" password:"+password);
return "getParamSuccess";
}
/*解耦合方式参数注入
* HttpServletRequest对象获取参数 通过SpringMVC框架功能,自动转换参数
* 处理单元参数列表中参数名必须和请求中的参数名一致
* 如不一致,可以通过@RequestParma注解进行转换
* */
@RequestMapping("/getParamByArgName.do")
public String getParam2(String username,@RequestParam("pwd") int password){
System.out.println("username:"+username+" password:"+password);
return "getParamSuccess";
}
}
- 上述代码是两种可以获取参数的方式,第一种是紧耦合的方式,第二种是松耦合的方式。但是我们还是比较推荐第二种
- 第二种的主要实现方式就是通过
处理器适配器
来映射同名字段的值。如果名称不能一致的话,必须用@RequestParam
来设置映射
3.2.2 日期类型转换的注意点
如果请求的字段是一个数字字符串,但是接受值是一个日期类型, 那么适配器就无法进行转换了,会报错。所以需要以下设置
3.3 响应处理
3.3.1 转发和重定向ServletAPI 实现
@RequestMapping("demo1")
public void testDemo1(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 请求转发
request.getRequestDispatcher("/forward.jsp").forward(request,response);
}
@RequestMapping("demo1")
public void testDemo1(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.sendRedirect(request.getContextPath()+"/redirect.jsp");
}
3.3.2 使用forward关键字完成响应
/*
* 返回字符串告诉DispatcherServlet跳转的路径
* 在路径之前放上一个forward: 关键字,就是请求转发
* 如果路径前的关键字是forward,那么可以省略不写
* */
@RequestMapping("demo2")
public String testDemo2() throws Exception {
//return "forward:/forwardPage.jsp";
return "/forwardPage.jsp";
}
3.3.3 使用redirect关键字完成响应
/*
* 返回字符串告诉DispatcherServlet跳转的路径
* 在路径之前放上一个redirect: 关键字,就是重定向
* 如果路径前的关键字是redirect,那么不可以省略
* /表示当前项目下.这里不需要项目的上下文路径
* */
@RequestMapping("demo3")
public String testDemo3() throws Exception {
return "redirect:/redirectPage.jsp";
}
4. 结束
通过上述的描述,需要积累的细节就这么多了。如果大家觉得不够的话,还可以在留言区跟我评论,我会及时添加,同时希望大家可以收藏,关注。 下一个章节会讲讲从0到1 搭建一个mvc项目。