Struts2 配置result

来源:互联网 发布:中国人工智能发展现状 编辑:程序博客网 时间:2024/04/29 15:20


<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> 
</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:;" onclick="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


dispatcher:请求转发,底层调用RequestDispatcher的forward()或include()方 法,dispatcher是type属性的默认值,通常用于转向一个JSP,localtion指定JSP的位置,parse如果为false表示 location的值不会被当作OGNL解析,默认为true;

<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>