在其他框架中,都是使用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的功能
提供基础安全特性,例如:过滤response headers、cookies,限制cookie的大小等。
缓存response中的内容。
延迟提交response。 解析参数,支持multipart/form-data(即上传文件请求)。
重写请求的URL和参数。
一套可扩展的session框架,重新实现了HttpSession接口。
设置locale区域和charset字符集编码。
request context的使用,只需要在webx.xml文件中加入如下配置
访问特定的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