您的位置:首页 > 编程语言 > Java开发

Struts2中 Result类型配置详解一+++++struts.xml配置详解二

2016-05-20 20:51 555 查看


Struts2中 Result类型配置详解一

(2012-12-01 20:34:33)


转载▼

标签:


result类型


struts2配置各种结果


redirect

分类: Struts2
一个result代表了一个可能的输出。当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出。

com.opensymphony.xwork2.Action接口中定义了一组标准的结果代码,可供开发人员使用,当然了只有我们的action继承ActionSupport 这个类才可以使用下面的结果代码,如下所示:

public interface Action

{

public static final String SUCCESS = “success”;

public static final String NONE = “none”;

public static final String ERROR = “error”;

public static final String INPUT = “input”;

public static final String LOGIN = “login”;

}

其中 Struts2应用在运行过程中若发现addFieldError()中有信息或者类型转换失败或着输入校验失败等情况

那么它会自动跳转到name为input<result/>,然后转到INPUT所对应的页面

若JSP页面中表单是用普通<form>编写的,发生错误而返回该页面时,则原数据将消失

若JSP页面中表单是用<s:form/>编写的,发生错误而返回该页面时,则原数据仍存在

若没有提供name值为input的<result/>,那么发生错误时,将直接在浏览器中提示404错误

除了这些预定义的结果码外,开发人员也可以定义其它的结果码来满足自身应用程序的需

要。

Result配置由两部分组成:一部分是result映射,另一部分是result类型。下面我们分别对

这两部分进行介绍。

一、配置 result映射

在result映射的配置中,在指定实际资源的位置时,可以使用绝对路径,也可以使用相对路径。

绝对路径以斜杠(/)开头,相对于当前的Web应用程序的上下文路径;

相对路径不以斜杠(/)开头,相对于当前执行的action的路径,也就是namespace指定的路径。


例如:

<package name="default" extends="struts-default" namespace="/admin">

<action name="login" class="com.ibm.LoginAction">

<result>success.jsp</result>

<result name="error">/error.jsp</result>

</action>

</package>

如果当前Web应用程序的上下文路径是/Shop,那么请求/Shop/admin/login.action,执行成功后,转向的页面路径为:/Shop/admin/success.jsp;执行失败后,转向的页面路径为/Shop/error.jsp.

二、result结果类型详解

type 所有类型 :(在struts2-core.jar/struts-default.xml中可以找到)
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
1、dispatcher结果类型

Struts2在后台使用Servlet API 的RequestDispatcher来转发请求,因此在用户的整个请求/响应过程中,目标Servlet/JSP接收到的request/response对象,与最初的Servlet/JSP相同。

Dispatcher结果类型的实现是org.apache.struts2.dispatcher.ServletDispatcherResult,该类的二个属性(property):location和parse,这两个属性可以通过struts.xml配置文件中的result元素的param子元素来设置。param元素的name属性指定结果类型实现类的属性名,param元素的内容是属性的值。例如:

<result name=“success” type=“dispatcher”>

<param name=“location” >/success.jsp</param>

<param name=“parse” >true</param>

</result>

说明:

A、location参数用于指定action执行完毕后要转向的目标资源,parse属性是一个布尔类型的值,如果为true,则解析location参数中的OGNL表达式;如果为false,则不解析。parse属性的默认值就是true.

location参数是默认的参数,在所有的Result实现类中,都定义了一个字符串类型的DEFAULT_PARAM静态常量,专门用于指定默认的参数名。 DEFAULT_PARAM常量的定义:public static final String DEFAULT_PARAM=“location”;


B、在设置location参数时,可以在参数值中使用OGNL表达式。

<action name=“viewNews” class=“com.ibm.ViewNewsAction”

<result name=“success” type=“dispatcher”>

<!--如果参数是中文:请参看最底部例子-->

<param name=“location” >/viewNews.jsp?id=${id}</param>

<param name=“parse” >true</param>

</result>

</action>

考虑到默认值的使用(dispatcher和location都是默认值),上述可以简化为:

<action name=“viewNews” class=“com.ibm.ViewNewsAction”>

<result name=“success” >viewNews.jsp?id=${id}</result>

</action>

2、redirect结果类型(重定向到一个Url,也可以是Action或一个页面)

Redirect结果类型在后台使用HttpServletResponse的sendRedirect方法将请求重定向到指定的URL,它的实现类是org.apache.struts2.dispatcher.ServletRedirectResult.该类同样有二个属性(property):location和parse,在使用redirect结果类型的场景中,用户要完成一次与服务器之间的交互,浏览器需要完成两次请求,因此第一次请求中的数据在第二次请求中是不可用的,这意味在目标资源中是不能访问action实例、action错误以及错误等。

如果有某些数据需要在目标资源中访问,

i、一种方式是将数据保存到Session中,

ii、另一种方式是通过请求参数来传递数据。


示例(1)、<result name="success" type="redirect">

<param name="location">foo.jsp</param>

<param name="parse">false</param><!--不解析OGNL-->

</result>

示例(2)、

<package name="passingRequestParameters"extends="struts-default"namespace="/passingRequestParameters">

<-- Passparameters (reportType, width and height),重定向到Url并且传参 ,如果参数是中文:请参看最底部例子-->

<!--

The redirect-action url generated will be :

/genReport/generateReport.jsp?reportType=pie&width=100&height=100

-->

<actionname="gatherReportInfo" class="...">

<resultname="showReportResult" type="redirect">

<param name="location">generateReport.jsp</param>

<param name="namespace">/genReport</param>

<param name="reportType">pie</param>

<param name="width">100</param>

<param name="height">100</param>

</result>

</action>

</package>

3、redirectAction结果类型(重定向到一个Action)

他经常用于防止表单重复提交,比方说在增加完用户之后要显示列表

redirectAction结果类型的实现类是org.apache.struts2.dispatcher.ServletActionRedirectResult,该类是ServletRedirectResult的子类,因此我们也就可以判断出redirectAction结果类型和redirect结果类型的后台工作原理是一样的,即都是利用HttpServletResponse的sendRedirect方法将请求重定向到指定的URL。

示例、

<package name="public"extends="struts-default">

<action name="login"class="...">

<!--Redirect to another namespace 重定向到不同命名空间下的 action -->

<result type="redirectAction">

<param name="actionName">dashboard</param>

<param name="namespace">/secure</param>

</result>

</action>

</package>

<package name="secure"extends="struts-default" namespace="/secure">

<-- Redirectto an action in the same namespace,重定向到同一命名空间下的action -->

<action name="dashboard" class="...">

<result>dashboard.jsp</result>

<result name="error"type="redirectAction">error</result>

</action>

<action name="error" class="...">

<result>error.jsp</result>

</action>

</package>

<package name="passingRequestParameters"extends="struts-default"namespace="/passingRequestParameters">

<-- Passparameters (reportType, width and height),重定向到Action并且传参,如果参数是中文:请参看最底部例子 -->

<!--

TheredirectAction url generated will be :

/genReport/generateReport.action?reportType=pie&width=100&height=100

-->

<action name="gatherReportInfo" class="...">

<result name="showReportResult" type="redirectAction">

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

<param name="empty"></param>

<param name="supressEmptyParameters">true</param>

</result>

</action>

</package>

4、链接类型 result:chain(从一个Action转发到另一个Action)

chain结果类型有4个属性,分别是:

actionName (default) - the name of the action that will be chained to

namespace - used to determine which namespace the Action is in that we're chaining. If namespace is null, this defaults to the current namespace

method - used to specify another method on target action to be invoked. If null, this defaults to execute method

skipActions - (optional) the list of comma separated action names for the actions that could be chained to

示例、

<package name="public"extends="struts-default">

<!-- Chain creatAccount to login, using the default parameter ,链接到同一命名空间下的Action,-->

<action name="createAccount" class="...">

<result type="chain">login</result>

</action>

<actionname="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">

<actionname="dashboard" class="...">

<result>dashboard.jsp</result>

</action>

</package>

5、HttpHeader Result:HttpHeader(用来控制特殊的Http行为)

httpheader结果类型很少使用到,它实际上是返回一个HTTP响应的头信息

示例:<result name="success"type="httpheader">

<paramname="status">204</param>

<paramname="headers.a">a custom header value</param> <paramname="headers.b">another custom header value</param>

</result>

<result name="proxyRequired"type="httpheader">

<paramname="error">305</param>

<paramname="errorMessage">this action must be accessed through aprozy</param>

</result>

6、Stream Result(向浏览器发送InputSream对象,通常用来处理文件下载)

<result name="success"type="stream">

<param name="contentType">image/jpeg</param>

<param name="inputName">imageStream</param>

<param name="contentDisposition">attachment;filename="document.pdf"</param>

<param name="bufferSize">1024</param>

</result>

7、PlainText Result(显示原始文件内容,例如文件源代码)

<action name="displayJspRawContent">

<result type="plaintext">/myJspFile.jsp</result>

</action>

<action name="displayJspRawContent">

<result type="plaintext">

<param name="location">/myJspFile.jsp</param>

<param name="charSet">UTF-8</param>

</result>

</action>

若仅设置type="plainText"的话,页面中显示中文时会乱码,这时就可以借助它的charSet属性以解决中文显示时的乱码问题,如果不设置charSet属性,反而去配置struts.i18n.encoding全局属性,是不能解决问题的

设置charSet属性的目的就是让JSP页面的编码与明文显示时的编码一致

8、Velocity Result(处理Velocity模板)

<result name="success"type="velocity">

<paramname="location">foo.vm</param>

</result>

9、XLS Result(处理XML/XLST模板)

<result name="success" type="xslt">

<paramname="location">foo.xslt</param>

<paramname="matchingPattern">^/result/[^/*]$</param>

<paramname="excludingPattern">.*(hugeCollection).*</param>

</result>

10、 FreeMarkerResult (处理FreeMarker模板)

<result name="success"type="freemarker">foo.ftl</result>

附、另外第三方的Result类型还包括JasperReportsPlugin,专门用来处理JasperReport类型的报表输出。

<%@ tagliburi="http://tiles.apache.org/tags-tiles" prefix="tiles"%>

<%@ taglib prefix="s"uri="/struts-tags" %>

<%-- Show usage; Used in Header --%>

<tiles:importAttribute name="title"scope="request"/>

<html>

<head><title><tiles:getAsStringname="title"/></title></head>

<body>

<tiles:insertAttribute name="header"/>

<pid="body">

<tiles:insertAttributename="body"/>

</p>

<p>Noticethat this is a layout made in JSP</p>

</body>

</html>

注意!!!!.传递中文

记住永远不要在浏览器的地址栏中传递中文。在传递中文前先进行编码

A.action中

public class User extends ActionSupport{

private String username;

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

@Override

public String execute() throws Exception {

// TODO Auto-generated method stub

username=URLEncoder.encode("郭蕾","utf-8");//先进行编码

System.out.println(username);

return "redirect";

}

}

B.struts.xml中

<action name="redirect" class="action.User">

<result type="redirect" name="redirect">

/redirect.jsp?username=${username}//如果要传递两个参数,中间用&代替&</result>

</action>

在这里使用了类似于el表达式的方式传值,${username}其中username为action中定义的

C.redirect.jsp中

<body>

重定向

<%String s=request.getParameter("username");

s=new String(s.getBytes("iso8859-1"),"utf-8");

s=URLDecoder.decode(s,"utf-8");

out.println(s);

%>

</body>

重定向中传递中文先进行编码,在jsp页面中先接受参数,然后对其进行字节分解,然后进行解码。

参考博文连接:

http://struts2.group.iteye.com/group/wiki/1462-result-in-struts2http://hi.baidu.com/langmanyuai/item/228e047ad6dc753d714423b0


struts.xml配置详解

博客分类:

Struts2

XMLStruts配置管理ApacheBean

Sturts.xml代码


<?xml version="1.0" encoding="GBK"?>

<!-- 下面指定Struts 2配置文件的DTD信息 -->

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<!-- struts是Struts 2配置文件的根元素 -->

<struts>

<!-- 下面元素可以出现0次,也可以无限多次 -->

<constant name="" value="" />

<!-- 下面元素可以出现0次,也可以无限多次 -->

<bean type="" name="" class="" scope="" static="" optional="" />

<!-- 下面元素可以出现0次,也可以无限多次 -->

<include file="" />

<!-- package元素是Struts配置文件的核心,该元素可以出现0次,或者无限多次 -->

<package name="必填的包名" extends="" namespace="" abstract=""

externalReferenceResolver>

<!-- 该元素可以出现,也可以不出现,最多出现一次 -->

<result-types>

<!-- 该元素必须出现,可以出现无限多次-->

<result-type name="" class="" default="true|false">

<!-- 下面元素可以出现0次,也可以无限多次 -->

<param name="参数名">参数值</param>*

</result-type>

</result-types>

<!-- 该元素可以出现,也可以不出现,最多出现一次 -->

<interceptors>

<!-- 该元素的interceptor元素和interceptor-stack至少出现其中之一,也可以二者都出现 -->

<!-- 下面元素可以出现0次,也可以无限多次 -->

<interceptor name="" class="">

<!-- 下面元素可以出现0次,也可以无限多次 -->

<param name="参数名">参数值</param>*

</interceptor>

<!-- 下面元素可以出现0次,也可以无限多次 -->

<interceptor-stack name="">

<!-- 该元素必须出现,可以出现无限多次-->

<interceptor-ref name="">

<!-- 下面元素可以出现0次,也可以无限多次 -->

<param name="参数名">参数值</param>*

</interceptor-ref>

</interceptor-stack>

</interceptors>

<!-- 下面元素可以出现0次,也可以无限多次 -->

<default-interceptor-ref name="">

<!-- 下面元素可以出现0次,也可以无限多次 -->

<param name="参数名">参数值</param>

</default-interceptor-ref>

<!-- 下面元素可以出现0次,也可以无限多次 -->

<default-action-ref name="">

<!-- 下面元素可以出现0次,也可以无限多次 -->

<param name="参数名">参数值</param>*

</default-action-ref>?

<!-- 下面元素可以出现0次,也可以无限多次 -->

<global-results>

<!-- 该元素必须出现,可以出现无限多次-->

<result name="" type="">

<!-- 下面元素可以出现0次,也可以无限多次 -->

<param name="参数名">参数值</param>*

</result>

</global-results>

<!-- 下面元素可以出现0次,也可以无限多次 -->

<global-exception-mappings>

<!-- 该元素必须出现,可以出现无限多次,异常处理资源-->

exception-mapping name="" exception="" result="">

<!-- 下面元素可以出现0次,也可以无限多次 -->

<param name="参数名">参数值</param>*

</exception-mapping>

</global-exception-mappings>

<action name="" class="" method="" converter="">

<!-- 下面元素可以出现0次,也可以无限多次 -->

<param name="参数名">参数值</param>*

<!-- 下面元素可以出现0次,也可以无限多次 ,映射资源-->

<result name="" type="">

<!-- 下面元素可以出现0次,也可以无限多次 -->

<param name="参数名">参数值</param>*

</result>

<!-- 下面元素可以出现0次,也可以无限多次 -->

<interceptor-ref name="">

<!-- 下面元素可以出现0次,也可以无限多次 -->

<param name="参数名">参数值</param>*

</interceptor-ref>

<!-- 下面元素可以出现0次,也可以无限多次,异常处理资源 -->

<exception-mapping name="" exception="" result="">

<!-- 下面元素可以出现0次,也可以无限多次 -->

<param name="参数名">参数值</param>*

</exception-mapping>

</action>

</package>*

<struts>

上面的struts.xml配置文件是一个非常全面的配置文件,包含了Struts 2的全部配置元素。

另外注意一下package标签

<package … />标签是用来把那些需要共享的通用信息——例如拦截器堆栈或URL命名空间——的配置组织在一起的。它通常由Action的配置组成,但也可以包括任何类型的配置信息。它还可以用来组织管理各自独立的功能——它们也可以被进一步拆分到不同的配置文件中。

这个标签的属性包括有:

—name ——开发人员为这个Package指定的唯一的名字。

—extends —— 当前这个Package所继承的Package的名字,被继承的Package中所有的配置信息(包括Action的配置)都可以在新的命名空间下,新的Package里面被使用。

—namespace ——命名空间提供了从URL到Package的映射。也就是说,如果两个不同的Package,其命名空间分别为“package1”和“package2”,那么URL差不多就是

“/myWebApp/package1/my.action” 和“/myWebApp/package2/my.action”这样的形式

—abstract ——如果这个属性的值为“true”,那么这个Package就只是一个配置信息的组合,也就无法通过Package的名字来访问其中配置的Action。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: