先看struts2的源代码

public class PlainTextResult extends StrutsResultSupport ...{
..........
protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception ...{
..........
HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(HTTP_RESPONSE);
ServletContext servletContext = (ServletContext) invocation.getInvocationContext().get(SERVLET_CONTEXT);


if (charset != null) ...{
response.setContentType("text/plain; charset="+charSet);
}
else ...{
response.setContentType("text/plain");
}
response.setHeader("Content-Disposition", "inline");

PrintWriter writer = response.getWriter();
InputStreamReader reader = null;
try ...{
if (charset != null) ...{
reader = new InputStreamReader(servletContext.getResourceAsStream(finalLocation), charset);
}
else ...{
reader = new InputStreamReader(servletContext.getResourceAsStream(finalLocation));
}
if (reader == null) ...{
_log.warn("resource at location ["+finalLocation+"] cannot be obtained (return null) from ServletContext !!! ");
}
else ...{
char[] buffer = new char[BUFFER_SIZE];
int charRead = 0;
while((charRead = reader.read(buffer)) != -1) ...{
writer.write(buffer, 0, charRead);
}
}
}
finally ...{
if (reader != null)
reader.close();
if (writer != null) ...{
writer.flush();
writer.close();
}
}
}
}PlainTextResult继承了StrutsResultSupport,实现了doExecute()方法,这个方法传入的两个参数,一个是location,这是一个默认参数,即result中配置的URL,另一个是ActionInvocation,执行上下文。学习PlainTextResult这个例子,我们可以很容易的编写自己的Result。
只需继承StrutsResultSupport类,实现doExecute方法即可。通过ActionInvocation可以得到response,输出你想要的结果就可以。
如果自定义的Result需要传入多个参数,可以参考ServletActionRedirectDispater,也是很容易就可以实现。
本文分析了Struts2框架中PlainTextResult类的工作原理,该类继承自StrutsResultSupport并实现了doExecute方法。文章详细介绍了如何通过ActionInvocation获取HTTP响应对象,并设置响应类型及内容。
5272

被折叠的 条评论
为什么被折叠?



