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。
<package name="public" extends="struts-default"> <!-- Chain creatAccount to login, using the default parameter --> <action name="createAccount" class="..."> <result type="chain">login</result> </action> <action name="login" class="..."> <!-- Chain to another namespace --> <result type="chain"> <param name="actionName">dashboard</param> <param name="namespace">/secure</param> </result> </action> </package> <package name="secure" extends="struts-default" namespace="/secure"> <action name="dashboard" class="..."> <result>dashboard.jsp</result> </action> </package>
dispatcher
用来转向页面,通常处理JSP
httpheader
控制特殊HTTP行为的结果类型
<action name="test" class="com.iss.action.TestAction"> <result name="success" type="httpheader"> <param name="status">400</param> </result> </action> 当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<String,String> 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中
<mime-mapping>
<extension>pdf</extension>
<mime-type>application/pdf</mime-type>
</mime-mapping>
struts.xml中
<action name="test" class="com.iss.action.TestAction">
<result name="success" type="stream">
<param name="contentType">application/pdf</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">filename="a.pdf"</param>
</result>
</action>
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
显示原始文件内容,例如文件源代码
<result name="err" type="plaintext"> <param name="location">具体的位置</param> <param name="charSet">字符规范(如GBK)</param> </result>
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表达式解析.
<result name="success" type="redirect"> <param name="location">foo.jsp</param> <param name="parse">false</param> </result> <result type= "redirect "> list.action?pageBean.pageNumber=${pageBean.pageNumber}</result> <result name="topic" type="redirect">/topicAction!findTopics.do?topicId=${topicId}&elementId=${elementId}</result>
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,则为当前名称空间
<result name="topic" type="redirectAction"> <param name="actionName">findTopics</param> <param name="topicId">${topicId}</param> </result> <result name="err" type="redirecAction"> <param name="actionName">重定向的Action名</param> <param name="namespace">重定向Action所在的名字空间</param> </result> <package name="passingRequestParameters" extends="struts-default" namespace="/passingRequestParameters"> <-- Pass parameters (reportType, width and height) --> <!-- The redirect-action url generated will be : /genReport/generateReport.action?reportType=pie&width=100&height=100 --> <action name="gatherReportInfo" class="..."> <result name="showReportResult" type="redirect-action"> <param name="actionName">generateReport</param> <param name="namespace">/genReport</param> <param name="reportType">pie</param> <param name="width">100</param> <param name="height">100</param> </result> </action> </package>
<action name="enterpreinfo" class="preinfoBusinessAction" method="enterPreinfoSub"> <result name="success" type="redirectAction"> showpreinfo?preinfo.order_number=${preinfo.order_number}&preinfo.company_name=${preinfo.company_name} </result> <result name="error" type="redirect"> <param name="location">/error.jsp</param> </result> </action>
因为使用了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的名称。
如:
<result name="success" type="redirect">viewTask.action</result>
<result name="success" type="redirecAtction">viewTask</result>