十、注解路由

一、注解概述

  • @Router 路由注解 注解点: 类 、 方法 path/value: 路由的锚点 method: http请求的方法类型 singleton: true: 单例模式的路由,每次都会使用路由注册时的实例, false: 每次都会创建新的实例用于路由处理。
  • singleton这个属性只在类的 @Router 注解上生效, 在方法上不会产生任何效果。
  • 单例模式被注解的类只会在注册路由时创建一个实例,这个类下的所有带有注解路由的方法都会使用这个实例来执行。
  • @Param 请求参数注解 注解点: 方法的参数 name: 提取请求参数的名称

  • @Head 请求头注解 注解点: 方法的参数 name: 提取请求头的的名称

  • @Cookie Cookie 注解 注解点: 方法的参数 name: 提取 Cookie 参数的名称

  • @Body 请求报文注解 注解点: 方法的参数

  • @Session 会话注解 注解点: 方法的参数 name: 提取 Session 参数的名称

二、使用说明

  • 参数注解 @Param(String value)

    • 将指定名称 HTTP 请求参数注入到被注解的方法的入参上。
  1. ```public String params(@Param("param1") String aa, @Param("param2") int bb)```
  2. 这样请求参数中的名为`param1`的参数会被注入到aa上,同样参数中的名为`param2`的参数会被注入到bb上。
  • 参数注解 @Cookie(String value)

    • 将指定名称 HTTP 请求Cookie注入到被注解的方法的入参上。
  1. ```public String cookie(@Cookie("_ga") String aa)```
  2. 这样请求Cookie中的名为`_gz`的参数会被注入到aa上。
  • 参数注解 @Head(String value)

    • 将指定名称 HTTP 请求头注入到被注解的方法的入参上。
  1. ```public String head(@Head("User-Agent") String aa)```
  2. 这样请求头中的名为`User-Agent`的参数会被注入到aa上。
  • 参数注解 @Body

    • 将指定名称 HTTP 请求的报文内容注入到被注解的方法的入参上,也就是 Http 请求的 body 段内容, 一般应用在 POST 请求上。
  1. ```public String body(@Body String aa)```
  2. 这样请求中的报文内容会被注入到aa上。
  • 自动参数注入

    • 请求相关对象的自动注入

      • 如果被@page注解的方法的参数有:HttpRequest, HttpResponse, HttpSession 三种类型的参数,则框架会自动注入当前请求对应的对象到方法的入参上。
  1. ```public String cookie(HttpRequest request, HttpResponse response, HttpSession session)```
  2. 这样请求对象HttpRequest会被注入到request上、请求对象HttpResponse会被注入到response上,以及请求对象HttpSession会被注入到session上。
  • 请求参数的自动注入

    • 如果被@page注解的方法中的参数没有指定任何参数注解,则会按照请求参数的顺序,将参数注入到方法的入参上, 但只限于路径参数 或者 以数字方式命名的参数。
  1. ```public String seqparams(String aa, int bb)```
  2. 这样请求参数中的名为`1`的参数会被注入到aa上,同样参数中的名为`2`的参数会被注入到bb上。
  • 路由方法参数注入前的转换路由方法的的参数在注入前会通过一次转换, 转换是以目标参数的类型作为原型, 尝试将请求中的字符串转换成目标类型。

    • 所有 Java 基本类型的转换都是原型转换,例如:字符串:“123”,可以被转换为整形:123。
      • 支持 double, float, integer, boolean, long, short, Character。
    • 支持集合类型的转换 Collection、Map,同时如果指定了范型,请求中对应参数会按照范型约束为原型转换成指定的对象。
    • 支持自定义对象的转换,会将请求中参数的字符串按照 JSON 的形式转换成指定对象。
    • 如果转换失败会抛出异常。
  • 路由响应的使用

    • 使用 HttpResponse 类中的 write 方法,可以向响应中添加内容, 但后一次添加的内容会覆盖前一次添加的内容。
    • 使用 Router 注解的方法的返回值会自动添加到响应中。
      • 返回值如果是 String 类型则直接添加到响应中。
      • 返回值如果是 byte[] 类型则直接添加到响应中。
      • 返回值如果是 自定义的对象 则会转换成 JSON 形式添加到响应中。