struts-2.1.7
chain:用来处理Action链,被跳转的action中仍能获取上个页面的值,如request信息.
dispatcher:用来转向页面,通常处理JSP.
freemaker:处理FreeMarker模板.
httpheader:控制特殊HTTP行为的结果类型.
redirect:重定向到一个URL,被跳转的页面中丢失传递的信息,如request.
redirectAction:重定向到一个Action,跳转的页面中丢失传递的信息.
stream:向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据.
velocity:处理Velocity模板.
xslt:处理XML/XLST模板.
plainText:显示原始文件内容,例如文件源代码.
chain
action处理完后转发到一个action,请求参数全部丢失,action处理结果不会丢失。
处于chain中的action属于同一个http请求,共享一个ActionContext。
login dashboard /secure dashboard.jsp
dispatcher
用来转向页面,通常处理JSP
httpheader
控制特殊HTTP行为的结果类型
当action返回SUCCESS的时候,会将响应状态修改为400,客户端错误的请求,还有其他的状态可以自行尝试,比如为100时,浏览器会在请求一段时间之后继续当前页面,500则为服务器内部错误等等具体为什么会产生这样的结果,当然得把源码翻出来了下面是HttpHeaderResult的一些成员变量,private的可以作为param的name属性。 /** The default parameter */ public static final String DEFAULT_PARAM = "status"; private boolean parse = true; private Map 400 headers; private int status = -1; private int error = -1; private String errorMessage; 下面是具体执行操作过程,可以看到response.setStatus等操作 public void execute(ActionInvocation invocation) throws Exception { HttpServletResponse response = ServletActionContext.getResponse(); ValueStack stack = ActionContext.getContext().getValueStack(); if (status != -1) { response.setStatus(status); } else if (error != -1) { if (errorMessage != null) { String finalMessage = parse ? TextParseUtil.translateVariables( errorMessage, stack) : errorMessage; response.sendError(error, finalMessage); } else response.sendError(error); } if (headers != null) { for (Iterator iterator = headers.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); String value = (String) entry.getValue(); String finalValue = parse ? TextParseUtil.translateVariables(value, stack) : value; response.addHeader((String) entry.getKey(), finalValue); } } }
stream
向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据
这个返回类型主要用作下载文件或者在浏览器上显示PDF等文档。
此处给一个显示PDF文档示例:
项目web.xml中
struts.xml中
application/pdf
inputStream
filename="a.pdf"
TestAction.java中
public class TestAction extends ActionSupport
{
private InputStream inputStream;
public InputStream getInputStream()
{
return inputStream;
}
@Override
public String execute() throws Exception
{
inputStream = new FileInputStream("xxxxx/a.pdf");//要下载或显示的文件路径
return SUCCESS;
}
}
需要注意的地方是struts.xml中inputName的值要与TestAction中的属性名相同,在此处就是inputStream
plainText
显示原始文件内容,例如文件源代码
具体的位置 字符规范(如GBK)
redirect
action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也 全部丢失。
调用{@link HttpServletResponse#sendRedirect(String) sendRedirect}方法来转到指定的位置. HTTP响应被告知使浏览器直接跳转到指定的位置(产生客户端的一个新请求). 这样做的结果会使刚刚执行的action(包括action实例,action中的错误消息等)丢失, 不再可用. 这是因为action是建立在单线程模型基础上的. 传递数据的唯一方式就是通过Session或者可以为Ognl表达式的web参数(url?name=value)
location (默认) - action执行后跳转的地址.
parse - 默认为true. 如果设置为false, location参数不会被当作Ognl表达式解析.
foo.jsp false list.action?pageBean.pageNumber=${pageBean.pageNumber} /topicAction!findTopics.do?topicId=${topicId}&elementId=${elementId}
redirectAction
action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也全部丢失。这个Result使用ActionMapperFactory提供的ActionMapper来重定位浏览器的URL来调用指定的action和(可选的)namespace.这个Result比ServletRedirectResult要好.因为你不需要把URL编码成xwork.xml中配置的ActionMapper提供的模式.这就是说你可以在任意点上改变URL模式而不会影响你的应用程序. 因此强烈推荐使用这个Result而不是标准的redirect result来解决重定位到某个action的情况.
ActionName (默认) - 重定位到的action名
namespace - action的名称空间. 如果为null,则为当前名称空间
findTopics ${topicId} 重定向的Action名 重定向Action所在的名字空间 <-- Pass parameters (reportType, width and height) --> generateReport /genReport pie 100 100
showpreinfo?preinfo.order_number=${preinfo.order_number}&preinfo.company_name=${preinfo.company_name} /error.jsp
因为使用了redirectAction,所以要注意不能将showpreinf?preinfo.order_number=${preinfo.order_number}写成showpreinf.action?preinfo.order_number=${preinfo.order_number}
在这个配置文件里,多个参数的连接符使用了"&",但XML的语法规范,应该使用"&"代替"&",原理和HTML中的转义相同,开始没有注意,在struts分析配置文件时,总是报出这样的错误:
The reference to entity "preinfo" must end with the ';' delimiter.
?
进行上面说明的替换后,就正常了。
注:redirect与redirectAction区别
一、使用redirect需要后缀名 使用redirectAction不需要后缀名
二、type="redirect" 的值可以转到其它命名空间下的action,而redirectAction只能转到同一命名空下的 action,因此它可以省略.action的后缀直接写action的名称。
如: