在其他框架中,都是使用filter来改变request/response对象(通过HttpServletRequestWrapper和HttpServletResponseWrapper)和改变应用执行的流程。
但是filter会有一些局限性,所以在webx框架中,使用request context和pipeline来完成filter的工作。
Request Context,顾名思义,就是一个请求的上下文。事实上,你可以把Request Context看作是HttpServletRequest和HttpServletResponse这两个对象的总和。除此之外,多个Request Context可以被串接起来,被称为Request Context Chain,类似于filter chain。
该图为request context chain
的执行过程。
在一个请求开始的时候,每个Request Context的“预处理”过程被依次调用。最内层的(即最先的)Request Context最先被调用,最外层的(即最后的)Request Context最后被调用;
在一个请求结束的时候,每个Request Context的“提交”过程被依次调用。和“预处理”的顺序相反,最外层的(即最后的)Request Context最先被调用,最内层的(即最先的)Request Context最后被调用。
Request Contexts的功能
request context的使用,只需要在webx.xml文件中加入如下配置
<services:request-contexts xmlns="http://www.alibaba.com/schema/services/request-contexts">
<basic />
<buffered />
<lazy-commit />
<parser />
<set-locale defaultLocale="zh_CN" defaultCharset="UTF-8" />
<!-- Optional -
<session />
<rewrite />
-->
</services:request-contexts>
访问特定的Request Context:
访问任意类型的请求中的参数
String value = request.getParameter("myparam");
访问session
HttpSession session = request.getSession();
String value = (String) session.getAttribute("myattr");
session.setAttribute("myattr", newValue);
访问特定的RequestContext接口
ParserRequestContext parserRequestContext =
RequestContextUtil.findRequestContext(request, ParserRequestContext.class);
ParameterParser params = parserRequestContext.getParameters();
FileItem myfile = params.getFileItem("myfile");
String filename = myfile.getName();
InputStream istream = myfile.getInputStream();
通过ParserRequestContext接口访问参数比HttpServletRequest更方便
ParameterParser params = parserRequestContext.getParameters();
String stringValue = params.getString("myparam"); // 取得字符串值,默认为null
int intValue = params.getInt("myparam"); // 取得整数值,默认为0
boolean booleanValue = params.getBoolean("myparam", true); // 取得boolean值,指定默认值为true