Spring的Controller使用

在spring中许多声明都是通过注解来实现的。

一、声明Controller

这时说Controller,而不说控制器,因为它与传统的控制器有所不同,它只有传统的控制器的部分功能。
在Spring MVC中,使用@Controller就可以声明一个类为Controller类,实例如下:

  1. //声明包表
  2. package com.shixinke.easyspring.controller;
  3. //引入相关的包(如果使用IDE会自动导入这些包)
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.ui.ModelMap;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RequestMethod;
  8. //声明这是一个Controller类
  9. @Controller
  10. //声明请求的路由映射,表示请求为/的会映射到这个控制器
  11. @RequestMapping("/")
  12. public class HelloController {
  13. //声明请求映射,当前请求方式为GET
  14. @RequestMapping(method= RequestMethod.GET)
  15. //定义一个方法say
  16. public String Say(ModelMap model) {
  17. //添加数据属性(可以认为它是模板变量)
  18. model.addAttribute("title", "hello world!");
  19. model.addAttribute("content", "welcome to spring world!");
  20. //调用相应的模板
  21. return "hello/say";
  22. }
  23. }

注:通过model添加的属性,可以在模板视图中使用${title}和${content}这样调用

二、路由处理注解

在Spring MVC中路由的声明方式和传统的一样,常见的有以下几种:

1、准确匹配

类似于Nginx中的/这种,如下例访问/user/index这样的访问地址

  1. //由注解声明请求的URL匹配路径(由路径值和请求方式)
  2. @RequestMapping(value = "/user/index", method = RequestMethod.GET)
  3. public String index() {
  4. //指定模板
  5. return "user/index";
  6. }
2、PATH模式(也有叫PATHINFO的)

如用户详情页,它的模式类似于/user/profile/123这样的(123表示用户的ID)

  1. //path模式
  2. @RequestMapping(value = "/user/profile/{userId}", method = RequestMethod.GET)
  3. public String profile(@PathVariable int userId, ModelMap model) {
  4. model.addAttribute("userId", userId);
  5. model.addAttribute("userName", "诗心客");
  6. model.addAttribute("title", "诗心客的主页");
  7. return "user/detail";
  8. }

注:

  • 在URL匹配模式中使用{variableName}这样的形式作为匹配的变量
  • 在方法参数中通过@PathVariable 来接收参数
3、正则表达式匹配

如用户的标签页:它的地址类似于/usr/tag/java这样的(java为标签的名称)

  1. //通过正则表达式
  2. @RequestMapping(value = "/user/tag/{tag:[a-zA-Z0-9_-]+}", method = RequestMethod.GET)
  3. public String tag(@PathVariable String tag, ModelMap model) {
  4. model.addAttribute("tag", tag);
  5. return "user/tag";
  6. }

注:

  • 通过URL匹配模式中定义{variableName:regexp}来定义匹配的变量和匹配模式,可以定义多个(variableName表示变量名,regexp表示正则表达式,如上面的tag:[a-zA-Z0-9_-]+)
  • 在方法参数中通过@PathVariable 来接收参数
4、占位符

使用占位符*来匹配某个位置

  1. //类似于/user/123.html(查后缀不能是.jsp)
  2. //占位符*
  3. @RequestMapping(value = "/user/{userId}.*", method = RequestMethod.GET)
  4. public String credit(@PathVariable int userId, ModelMap model) {
  5. model.addAttribute("userId", userId);
  6. model.addAttribute("credit", 5600);
  7. return "user/credit";
  8. }
5、类请求映射注解与方法请求映射注解
(1)类请求映射注解
(2)方法请求映射注解
  1. @RequestMapping("/index")
  2. public String index(ModelMap model) {
  3. model.addAttribute("title", "分类首页");
  4. return "category/index";
  5. }

表示应对某个具体的请求

一般方法请求的映射注解,是将类请求注解中的匹配URL和方法中的匹配URL结合起来,形成完整的匹配,如

  1. package com.shixinke.easyspring.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.ui.ModelMap;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. @Controller
  8. @RequestMapping("/category")
  9. public class Category {
  10. //它实际匹配的是/category/index
  11. @RequestMapping("/index")
  12. public String index(ModelMap model) {
  13. model.addAttribute("title", "分类首页");
  14. return "category/index";
  15. }
  16. //它实际匹配的是/category/detail/122这样的地址
  17. @RequestMapping(value = "/detail/{categoryId}", method = RequestMethod.GET)
  18. public String detail(@PathVariable int categoryId, ModelMap model) {
  19. model.addAttribute("categoryId", categoryId);
  20. return "category/detail";
  21. }
  22. }

三、请求处理

1、获取请求的GET参数
(1)通过@RequestParam注解来获取GET参数

如:/usr/detail?userId=215,通过以下形式来获取userId的值

  1. //获取get请求参数
  2. @RequestMapping(value = "/user/detail", method = RequestMethod.GET)
  3. public String detail(@RequestParam int userId, ModelMap model) {
  4. model.addAttribute("userId", userId);
  5. model.addAttribute("userName", "诗心客");
  6. model.addAttribute("title", "诗心客的主页");
  7. return "user/detail";
  8. }
  • (2)通过HttpServletRequest对象来获取,这个在下面讲解
2、获取请求的POST参数

如果您了解过JSP中request对象,那么对这一部分就比较容易理解了,因为JSP的request也是继承自HttpServletRequest对象
下面通过一个简单的登录的例子来说明:

(1)登录页:

控制器部分:

  1. package com.shixinke.easyspring.controller;
  2. import org.springframework.http.HttpRequest;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.ModelMap;
  5. import org.springframework.web.bind.annotation.RequestBody;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RequestMethod;
  8. import javax.servlet.http.HttpServletRequest;
  9. @Controller
  10. public class Passport {
  11. @RequestMapping(value = "/login", method = RequestMethod.GET)
  12. public String login() {
  13. return "passport/login";
  14. }
  15. }

视图部分:

  1. <%@page language="java" contentType="text/html;charset=utf-8" pageEncoding="UTF-8" %>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>用户登录</title>
  6. <meta charset="UTF-8">
  7. </head>
  8. <body>
  9. <form action="/checklogin" method="post">
  10. 用户名:<input type="text" name="name"><br>
  11. 密码:<input type="password" name="password"><br>
  12. <input type="submit" name="submit" value="登录">
  13. </form>
  14. </body>
  15. </html>
(2)登录处理页:
  • 第一种通过@RequestBody可以获取原始的请求体内容,如:name=ss&password=dddddd&submit=%E7%99%BB%E5%BD%95
  1. package com.shixinke.easyspring.controller;
  2. import org.springframework.http.HttpRequest;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.ModelMap;
  5. import org.springframework.web.bind.annotation.RequestBody;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RequestMethod;
  8. import javax.servlet.http.HttpServletRequest;
  9. @Controller
  10. public class Passport {
  11. /**
  12. * 获取原始请求体,类似于:name=ss&password=dddddd&submit=%E7%99%BB%E5%BD%95
  13. * @param body
  14. * @param model
  15. * @return
  16. */
  17. @RequestMapping(value = "/checklogin", method = RequestMethod.POST)
  18. public String checkLogin(@RequestBody String body, ModelMap model) {
  19. model.addAttribute("title", "验证登录");
  20. model.addAttribute("body", body);
  21. return "passport/success";
  22. }
  23. }
  • 第二种通过HttpServletRequest对象来获取,获取解析后的请求体内容:
  1. @RequestMapping(value = "/request", method = RequestMethod.POST)
  2. public String requestUser(HttpServletRequest request, ModelMap model) {
  3. model.addAttribute("title", "验证登录");
  4. model.addAttribute("username", request.getParameter("name"));
  5. model.addAttribute("password", request.getParameter("password"));
  6. return "passport/checkuser";
  7. }

参考文档:
http://spring.cndocs.tk/index.html