Solon

三、请求上下文

Handler + Context 架构,是Solon Web 的基础。在 Context 里可以获取:

  • 请求相关的对象与接口
  • 会话状态相关的对象与接口
  • 响应相关的对象与接口

或者理解所有请求与响应相关的,都在它身上。关于架构方面,可以再看看《想法与架构笔记》

1、三种获取 Context 的方式

a) 通过 Controller 获取

@Controller
public class HelloController{
    @Mapping("/hello")
    public String hello(Context ctx){
        //可以注入 ctx:Context
        return "Hello " + ctx.param("name", "world");
    }
}

b) 通过 Handler 获取

Solon.start(DemoApp.class, args, app->{
   app.get("/hello", ctx-> ctx.output("Hello " + ctx.param("name", "world"))); 
});

//或者,用以组件方式编写
@Mapping("/hello")
@Component
public class HelloHandler implements Handler{
    public void handle(Context ctx) throws Throwable{
        ctx.output("Hello " + ctx.param("name", "world"));
    }
}

c) 直接获取

Context ctx = Context.current();

2、关于 context-path 的类似效果

使用 pathNew 可以调整上下文路径,从而实现类似 context-path 的效果:

public class DemoApp{
    public static  void main(String[] args){
        Solon.start(DemoApp.class, args, app->{
            app.filter((ctx, chain) -> {
                if(ctx.path().startsWith("/xxx/")) {
                    ctx.pathNew(ctx.path().substring(4));
                }

                chain.doFilter(ctx);
            });
        });
    }
}
  • context-path 可以给路由地址增加"/xxx"前缀
  • pathNew 可以允许 "/xxx" 等不存在的请求,而内部转换为真实的路由地址即可。这在服务注册与发现体系里,非常重要(健康检测时,注册的地址不会神奇的变掉)。
注:pathNew 的好处是,你可以随便改地址(给前端一个假的地址,后端再转换成真的)!!!

3、请求相关的接口

请求相关接口说明
-request()->Object原始请求对象
-ip()->String获取源始请求ip(也可能是代理的ip)
-realIp()->String获取客户端真实IP
-isMultipart()-bool是否为分段内容
-isMultipartFormData()->bool是否为分段表单数据
-method()->String获取请求方式
-protocol()->String获取请求协议
-protocolAsUpper()->String获取请求协议并大写
-uri()->URI获取请求的URI
-path()->String获取请求的URI路径
-pathNew(String)设置新路径
-pathNew()->String获取新路径,不存在则返回原路径
-pathMap(String)->NvMap获取请求的URI路径变量,根据路径表达式
-pathAsUpper()->String获取请求的URI路径并大写
-userAgent()>String获取请求的UA
-url()->String获取请求的URL字符串
-contentLength()->long获取内容长度
-contentType()->String获取内容类型
-queryString()->String获取查询字符串
-accept()->String获取 Accept 头信息
-body()->String获取body内容
-body(String)->String获取body内容,并按指定字符串解码
-bodyNew()->String获取新的body
-bodyNew(String)设置新的body
-bodyAsBytes()->byte[]获取body内容为byte[]
-bodyAsStream()->InputStream获取body内容为Stream
-paramValues(String)->String[]获取参数数组
-param(String)->String获取参数
-param(String, String)->String获取参数,并给定默认值
-paramAsInt(String)->int获取参数并转为int
-paramAsInt(String, int)->int获取参数并转为int, 并给定默认值
-paramAsLong(String)->long获取参数并转为long
-paramAsLong(String, long)->long获取参数并转为long,并给定默认值
-paramAsDouble(String)->double获取参数并转为double
-paramAsDouble(String, double)->double获取参数并转为double,并给定默认值
-paramAsDecimal(String)->BigDecimal获取参数并转为BigDecimal
-paramAsDecimal(String, BigDecimal)->BigDecimal获取参数并转为BigDecimal,并给定默认值
-paramAsBean(Class<T>)->T获取参数并转为Bean
-paramMap()->NvMap获取所有参数并转为map
-paramsMap()->Map<String, List<String>>获取所有参数并转为Map
-paramSet(String, String)设置参数
-paramsAdd(String, String)添加参数
-files(String)->List<UploadedFile>获取上传文件,可能有多个
-file(String)->UploadedFile获取上传文件,第一个
-cookie(String)->String获取 cookie
-cookie(String, String)->String获取 cookie, 并给定默认值
-cookieMap()->NvMap获取 cookieMap
-header(String)->String获取 header
-header(String, String)->String获取 header,并给定默认值
-headerMap()->NvMap获取 headerMap

4、响应相关的接口

响应相关接口说明
-response()->Object原始响应对象
-charset(String)设置字符集
-contentType(String)设置内容类型
-contentTypeNew()获取设置的新内容类型
-output(byte[])输出 字节数组
-output(InputStream)输出 流对象
-output(String)输出 字符串
-output(Throwable)输出 异常对象
-outputAsJson(String)输出为json文本
-outputAsHtml(String)输出为html文本
-outputAsFile(DownloadedFile)输出为文件
-outputAsFile(File)输出为文件
-outputStream()->OutputStream获取输出流
-headerSet(String, String)设置 header
-headerAdd(String, String)添加 header
-cookieSet(String, String)设置 cookie
-cookieSet(String, String, int)设置 cookie
-cookieSet(String, String, String, int)设置 cookie
-cookieSet(String, String, String, String, int)设置 cookie
-cookieRemove(String)移徐 cookie
-redirect(String)302跳转地址
-redirect(String, int)跳转地址
-forward(String)转发地址
-status()获取输出状态
-status(int)设置输出状态

5、会话相关的接口

会话相关接口说明
-sessionState()->SessionState获取 sessionState
-sessionId()->String获取 sessionId
-session(String)->Object获取 session 状态
-session(String, T)->T获取 session 状态(类型转换,存在风险)
-sessionAsInt(String)->int获取 session 状态以 int 型输出
-sessionAsInt(String, int)->int获取 session 状态以 int 型输出, 并给定默认值
-sessionAsLong(String)->long获取 session 状态以 long 型输出
-sessionAsLong(String, long)->long获取 session 状态以 long 型输出, 并给定默认值
-sessionAsDouble(String)->double获取 session 状态以 double 型输出
-sessionAsDouble(String, double)->double获取 session 状态以 double 型输出, 并给定默认值
-sessionSet(String, Object)设置 session 状态
-sessionRemove(String)移除 session 状态
-sessionClear()清空 session 状态

6、其它查询

其它相关接口说明
+current()->Context获取当前线程的上下文
-getLocale()->Locale获取地区
-setLocale(Locale)设置地区
-setHandled(bool)设置处理状态
-getHandled()获取处理状态
-setRendered(bool)设置渲染状态
-getRendered()获取渲染状态
-attrMap()->Map获取自定义特性并转为Map
-attr(String)->Object获取上下文特性
-attr(String, T)->T获取上下文特性,并设定默认值
-attrSet(String, Object)设置上下文特性
-attrSet(Map)设置上下文特性
-attrClear()清除上下文特性
-render(Object)渲染数据
-render(String, Map)渲染视图
-renderAndReturn(Object)->String渲染数据并返回
-remoting()->bool是否为远程调用
-remotingSet(bool)设置是否为远程调用
-result:Object用于在处理链中透传处理结果
-errors:Throwable用于在处理链中透传处理错误
-controller()->Object获取当前控制器
-action()->Action获取当前动作