创建 Handler
package org.westos.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @author lwj * @date 2020/12/13 22:29 */ @Controller public class HelloHandler { @RequestMapping("/index") public String index() { System.out.println("执行了index..."); return "index"; } }配置Tomcat服务器,启动,运行,成功。
:8080/index
Spring MVC 注解@RequestMapping
Spring MVC 通过 @RequestMapping 注解将 URL 请求与业务方法进行映射,在 Handler 的类定义处和方法定义处都可以添加 @RequestMapping ,在类定义处添加,相当于客户端多了一层访问路径;
@Controller
@Controller 在类定义处添加,将该类交给 IoC 容器来管理(结合 springmvc.xml 的自动扫描配置使用),同时使其成为一个控制器,可以接收客户端请求;
package org.westos.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @author lwj * @date 2020/12/13 22:29 */ @Controller @RequestMapping("/hello") public class HelloHandler { @RequestMapping("/index") public String index() { System.out.println("执行了index..."); return "index"; } }:8080/hello/index
@RequestMapping 相关参数
1、value:指定URL请求的实际地址,是 @RequestMapping 的默认值。
@RequestMapping("/index") public String index() { System.out.println("执行了index..."); return "index"; }等于
@RequestMapping(value = "/index") public String index() { System.out.println("执行了index..."); return "index"; }2、method:指定请求的Method类型,GET、POST、PUT、DELETE。
@RequestMapping(value = "/index", method = RequestMethod.GET) public String index() { System.out.println("执行了index..."); return "index"; }上述代码表示 index 方法只可以接收 GET 请求。
使用Postman工具来模拟一个POST请求访问index方法。
3、params:指定请求中必须包含某些参数,否则无法调用该方法。
@RequestMapping(value = "/index", method = RequestMethod.GET, params = {"name", "id=5"}) public String index() { System.out.println("执行了index..."); return "index"; }上述代码表示请求中必须包含 name 和 id 两个参数,并且 id 的值必须是5。
:8080/hello/index?name=zhangsan&id=5
关于参数绑定,在形参列表中通过添加 @RequestParam 注解完成 HTTP 请求参数与业务方法形参的映射。
(当请求参数名和方法形参名一致时,可以不用添加 @RequestParam 注解)
@RequestMapping(value = "/index", method = RequestMethod.GET, params = {"name", "id=5"}) public String index(@RequestParam("name") String str, @RequestParam("id") int age) { System.out.println("执行了index..."); System.out.println(str); System.out.println(age); return "index"; }上述代码表示将请求的参数 name 和 id 分别赋给形参 str 和 age,同时自动完成了数据类型转换,将字符串"10"转换为 int 类型的10,再赋给 age,这些工作都是由 HandlerAdapter 完成。
Spring MVC 同时支持 RESTful 风格的 URL 。
传统类型::8080/hello/index?name=zhangsan&id=5
RESTful::8080/hello/rest/zhangsan/10
@RequestMapping(value = "/rest/{name}/{id}") public String rest(@PathVariable("name") String name, @PathVariable("id") int id) { System.out.println(name); System.out.println(id); return "index"; }通过 @PathVariable 注解完成请求参数与形参的映射。
映射 Cookie
Spring MVC 通过映射可以直接在业务方法中获取Cookie的值。
@RequestMapping(value = "/cookie") public String cookie(@CookieValue(value = "JSESSIONID") String sessionId) { System.out.println(sessionId); return "index"; }使用 JavaBean 绑定参数
Spring MVC 会根据请求参数名和 JavaBean 属性名进行自动匹配,自动为对象填充属性值,同时支持级联属性。
package org.westos.entity; import lombok.Data; /** * @author lwj * @date 2020/12/19 15:57 */ @Data public class Address { private String value; } package org.westos.entity; import lombok.Data; /** * @author lwj * @date 2020/12/19 15:58 */ @Data public class User { private long id; private String name; private Address address; } <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--页面上的路径与重定向是需要添加Web项目的上下文路径的--%> <form action="/hello/register" method="post"> <label for="id">用户id:</label> <input type="text"> <br> <label for="name">用户名:</label> <input type="text"> <br> <label for="value">用户地址:</label> <input type="text"> <br> <input type="submit" value="注册"> </form> </body> </html> @RequestMapping(value = "/register", method = RequestMethod.POST) public String register(User user) { System.out.println(user); return "index"; }