常用配置
<action name="Hello" class="domain.HelloAction">
<result>/hello/Result.jsp</result> //等于<result name="success" type="dispatcher">/hello/Result.jsp</result> <result name="error">/hello/Error.jsp</result> <result name="input">/hello/Input.jsp</result>
<result name="list" type="redirect">
<param name="namespace">/novel</param>
<param name="actionName">listAction</param>
<param name="id">${id}</param>
<param name="userID">${userId}</param>
</result>
</action> 上述代码的含义为,
名字为Hello的Action有三个返回结果,并且都是dispatcher类型(默认类型),
这三个返回值的名字分别为success(默认值),error,input,
对应的页面的路径分别为/hello/Result.jsp,/hello/Error.jsp,/hello/Input.jsp。
注意:result默认的name是"success" 默认的type是"dispatcher"
在使用struts2 web编程的时候,一些文件的execute返回值都是一样的,比如success,error,input等等,如果每一项都要重新配置,就显得配置文件很繁琐,这里可以采用struts2的全局result配置。例如: <package name="pkg" extends="struts-default" abstract="true"> <global-results> ... </global-results> <global-exception-mappings> ... </global-exception-mappings> </package> <package name="test" namespace="/test" extends="pkg"> //只要包继承上面的包 </package> 我项目中的配置: <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="globalResult" extends="struts-default" abstract="true"> <global-results> <result name="error">/jsp/myError.jsp</result> <result name="crash">/jsp/crash.jsp</result> <result name="needsLogin">/jsp/needsLogin.jsp</result> <result name="input">/jsp/needsInit.jsp</result> <result name="needsInit">/jsp/needsInit.jsp</result> </global-results> </package> <package name="com.wapi.action" namespace="/" extends="globalResult"> <action name="login" class="loginAction"> <result name="success">/jsp/index.jsp</result> <result name="error">/jsp/login.jsp</result> </action> <action name="manageLeft" class="manageLeftAction"> <result name="success">/jsp/left.jsp</result> </action> 这样以后只需要配置success或者不同的error就可以了,如果action name="login"里面有result name="input"就会使用</global-results>里面的!
动态返回结果 有些时候,只有当Action执行完璧的时候我们才知道要返回哪个结果,这个时候我们可以在Action内部定义一个属性,这个属性用来存储Action执行完璧之后的Result值,例如: private String nextAction; public String getNextAction() { return "next"; } 在strutx.xml配置文件中,我们可以使用${nextAction}来引用到Action中的属性,通过${nextAction}表示的内容来动态的返回结果,例如: <action name="fragment" class="FragmentAction"> <result name="next" type="redirect">${nextAction}</result> </action> 上述Action的execute方法返回next的时候,还需要根据nextAction的属性来判断具体定位到哪个Action。应用到的例子:当你访问一个网页 而此时需要用户登录的时候!这时候页面中需要保存之前的url传到Action中 然后登录完毕之后在重定向到这个URL
又有一个问题 如何保存之前的页面呢??<a href="javascript:;" οnclick="location='../authorize/loginform.action?uri='+encodeURIComponent(location)">登录</a>
Type属性:
Type 类型值 | 作用说明 | 对应类 |
chain | 用来处理Action 链 | com.opensymphony.xwork2.ActionChainResult |
dispatcher | 用来转向页面,通常处理 JSP | org.apache.struts2.dispatcher.ServletDispatcherResult |
redirect | 重定向到一个URL | org.apache.struts2.dispatcher.ServletRedirectResult |
redirectAction | 重定向到一个 Action | org.apache.struts2.dispatcher.ServletActionRedirectResult |
plainText | 显示源文件内容,如文件源码 | org.apache.struts2.dispatcher.PlainTextResult |
freemarker | 处理 FreeMarker 模板 | org.apache.struts2.views.freemarker.FreemarkerResult |
httpheader | 控制特殊 http 行为的结果类型 | org.apache.struts2.dispatcher.HttpHeaderResult |
stream
| 向浏览器发送 InputSream 对象,通常用来处理文件下载,还可用于返回 AJAX 数据。
| org.apache.struts2.dispatcher.StreamResult
|
velocity | 处理 Velocity 模板 | org.apache.struts2.dispatcher.VelocityResult |
xslt | 处理 XML/XLST 模板 | org.apache.struts2.views.xslt.XSLTResult |
<result> <param name="location">/ThankYou.jsp</param> </result> 另外location参数也可以直接卸载result标签内部,所以上述代码的最简单的写法为: <result>/ThankYou.jsp</result>
redirect:重定向,新页面无法显示Action中的数据,因为底层调用 response.sendRedirect("")方法,无法共享请求范围内的数据,参数与dispatcher用法相同;
redirect- action:重定向到另一个Action,参数与chain用法相同,允许将原Action中的属性指定新名称带入新Action中,可以在 Result标签中添加<param name=”b”>${a}</param>,这表示原Action中的变量a的值被转给b,下一个Action可以在值栈中使用b来 操作,注意如果值是中文,需要做一些编码处理,因为Tomcat默认是不支持URL直接传递中文的! eg:<result name="suc" type="redirectAction"> <param name="namespace">/Tree</param> <param name="actionName">treeLoadAction</param> </result>
<action name="verify" class="org.gwap.action.authorize.RegisterAction" method="verify"> <result name="success" type="redirectAction"> loginform//另一个Action的名字 </result> <result name="input" type="dispatcher"> /WEB-INF/jsp/authorize/verify_form.jsp </result> </action>
velocity:使用velocity模板 输出结果,location指定模板的位置(*.vm),parse如果为false,location不被OGNL解析,默认为true;
xslt: 使用XSLT将结果转换为xml输出,location指定*.xslt文件的位置,parse如果为false,location不被OGNL解析,默 认为true,matchingPattern指定想要的元素模式,excludePattern指定拒绝的元素模式,支持正则表达式,默认为接受所有元 素;
httpheader:根据值栈返回自定义的HttpHeader,status指定响应状态(就是指 response.sendError(int i)重定向到500等服务器的状态页),parse如果为false,header的值不会被OGNL解析,headers,加入到header中的值, 例如:<param name=”headers.a”>HelloWorld</param>,可以加多个,这些键-值组成HashMap;
freemaker: 用freemaker模板引擎呈现视图,location指定模板(*.ftl)的位置,parse如果为false,location的值不会被 OGNL解析,contentType指定以何中类型解析,默认为text/html;
chain:将action的带着原来的状态请求转发到新 的action,两个action共享一个ActionContext,actionName指定转向的新的Action的名字,method指定转向哪 个方法,namespace指定新的Action的名称空间,不写表示与原Action在相同的名称空间;skipActions指定一个使用 , 连接的Action的name组成的集合,一般不建议使用这种类型的结果;
stream:直接向响应中发送原始数据,通常在用户下载时使 用,contentType指定流的类型,默认为text/plain,contentLength以byte计算流的长 度,contentDisposition指定文件的位置,通常为filename=”文件的位置”,input指定InputStream的名字,例 如:imageStream,bufferSize指定缓冲区大小,默认为1024字节;
plaintext:以原始文本显示JSP或者 HTML,location指定文件的位置,charSet指定字符集
json:在Struts2中,如果这样写,会将你Action中的变量转成JSON 返回到页面 用来做AJAX是非常方便的。具体请参考Struts2的手册<action name="checknumber" class="org.gwap.action.authorize.NumberAction" method="check"> <result name="success" type="json"> <param name="root">ok</param> </result> </action>