多种响应方式
在起初 Cicada
默认只能响应 json
,这一点确实不够灵活。加上后续也打算支持模板解析,所以不如直接在 API 中加入可让用户自行选择不同的响应方式。
因此调整后的 API 如下。
想要输出
text/plain
时。
@CicadaAction("textAction") public class TextAction implements WorkAction { @Override public void execute(CicadaContext context, Param param) throws Exception { String url = context.request().getUrl(); String method = context.request().getMethod(); context.text("hello world url=" + url + " method=" + method); } }
而响应输出
application/json
时只需要把需要响应的对象写入到json()
方法中.
因此原有的业务 action 中也加入了一个上下文的参数:
/** * abstract execute method * @param context current context * @param param request params * @throws Exception throw exception */ void execute(CicadaContext context ,Param param) throws Exception;
下面就来看看这个 Context
是如何完成的。
Cicada Context
先看看有了这个上下文之后可以做什么。
比如有些场景下我们需要拿到本次请求中的头信息,这时就可以通过这个 Context
对象直接获取。
当然不止是头信息:
- 获取请求头。
- 设置响应头。
- 设置
cookie
。
- 获取请求
URL
。
- 获取请求的
method
(get/post)等。
其实通过这些特点可以看出这些信息其实都和一次 请求、响应
密切相关,并且各个请求之间的信息应互不影响。
这样的特性是不是非常熟悉,没错那就是 ThreadLocal
,它可以将每个线程的信息存储起来互不影响。
ThreadLocal 的原理本次不做过多分析,只谈它在 Cicada 中的应用。
CicadaContext.class
先来看看 CicadaContext
这个类的主要成员变量以及方法。
成员变量是两个接口 CicadaRequest、CicadaResponse
,名称就能看出肯定是存放请求和响应数据的。
HttpDispatcher.class
想要存放本次请求的上下文自然是在真正请求分发的地方 HttpDispatcher
。
这里改的较大的就是两个红框处,第一部分是做上下文初始化及赋值。
第二部分自然就是卸载上下文。
先看初始化。