(七)spring-boot教程,开发个人博客:spring-mvc(controller)用法介绍

avatar

这一节来说一下Controller用法

spring-boot里的controller用的就是spring-mvc

注解说明

注解 说明
@Controller 标注这是一个controller类,这个注解会被IOC扫描并管理
@RequestMapping 指定请求路径
@GetMapping Get请求映射地址
@PostMapping Post请求映射地址
@RequestParam 注明请求参数的,可以设置默认值,也可以指定字段是否是必填的
@PathVariable 接收路径参数的注解

用法

这里以用户登录为例,用户登录有两个请求类型,一个get请求,用于渲染登录页面的,一个post请求提交用户的用户名和密码作验证的

@Controller
@RequestMapping("/user")
public class UserController {

  @Autowired
  private UserService userService;

  @GetMapping("/login")
  public String login() {
    return "user/login";
  }

  @PostMapping("/login")
  public String login(String username, String password, HttpSession session, RedirectAttributes redirectAttributes) {
    User user = userService.login(username, password);
    if (user != null) {
      session.setAttribute("user", user);
      return "redirect:/";
    } else {
      redirectAttributes.addFlashAttribute("username", username);
      redirectAttributes.addFlashAttribute("error", "用户名或密码错误");
      return "redirect:/user/login";
    }
  }
}

接收参数

springmvc里接收参数有三种方式

方式 例子 说明
query ?id=123 这种最常见,也是最简单的,不多说
params /topic/123 这种一般是用在restful风格的url里的,看起来比较简洁
body 表单 一般是表单post提交的

springmvc接收这三种方式的参数 query 和 body 是一样的,params方式的要特殊一些

如上的例子,登录时用户要传二个参数,username, password 就直接写在controller中的方法参数里就可以接收到

但如果是params方式的参数就要用到上面提到的一个注解了 @PathVariable 用法如下

请求地址为 /detail/123 这种类型的参数都会进到下面这个路由里处理,123就是参数,对应的是路由里定义的 id

@GetMapper("/detail/{id}")
public String detail(@PathVariable Integer id) {
  System.out.println(id);
  return null;
}

验证

如果post提交验证出错了,会返给用户一个错误信息,上面代码里用到了 RedirectAttributes 

RedirectAttributes 里有一个方法 addFlashAttribute() 表示当前请求重写向的话,会将放在 RedirectAttributes 里的数据保存一次请求

flash有一闪而过的意思,所以这里用它来作为重写向过程中错误信息,页面接收到之后通过判断然后显示出来,会显得比较友好

用法:

redirectAttributes.addFlashAttribute("error", "用户名或密码错误");

模板渲染

上面controller里的方法可以看到都会有一个返回值,而且类型都是String的,这个返回值就是模板的路径,spring-boot项目里的模板根路径默认是 src/resources/templates,所以登录返回的 user/login 表示的全路径是 src/resources/templates/user/login.ftl

spring-mvc 通过返回的模板路径找到模板,然后通过模板的解析规则来解析渲染出来html源码,最后再以流的形式返回到浏览器,浏览器拿到html源码,再通过解析html源码,最终呈现出来页面

模板传值

在controller类的方法里注入一个对象 Model,通过model.addAttribute("page", page);方式来将要传到模板上的值添加进去

0 条评论

目前还没有回答,快来帮帮TA吧!

添加一条评论 请尽量发布对他人有帮助的评论

登录后可发布评论

登录 | Github登录