struts2的结果类型
1、从struts-default.xml入手,得到结果类型列表以及对应的处理类:
<result-types> <!-- 转发到action --> <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> <!-- 转发到jsp --> <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/> <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/> <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/> <!-- 重定向到jsp --> <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/> <!-- 重定向到action --> <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/> <!-- 用于下载 --> <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/> <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/> <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /> <result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" /> </result-types>
然后我们知道一些信息:
1、常用的跳转类型:
转发
chain:转发到action
dispatcher:转发到jsp
重定向:
redirect:重定向到jsp
redirectAction:重定向到action
流:
stream:在文件下载中使用
2、默认的跳转方式是转发到jsp
2、几种跳转方式的使用例子:
<package name="resulttype" namespace="/resulttype" extends="struts-default"> <action name="resultTypeAction" class="cn.itcast.resulttype.ResultTypeAction"> <!-- 方法一 默认为转发 type:指定结果类型,默认为转发“dispatcher” --> <!-- <result name="success" type="dispatcher">/resulttype/success.jsp</result>--> <!-- 方法二:标准写法 --> <!--<result name="success" type="dispatcher"> param:参数 name:参数的名称为“location” 实际上是struts2框架底层StrutsResultSupport类的setLocation()提供的 所谓的参数,应该是set方法或者get方法后面跟的名称才是参数名 <param name="location">/resulttype/success.jsp</param> </result>--> <!-- 重定向到jsp --> <!--<result name="success" type="redirect"> <param name="location">/resulttype/success.jsp</param> </result>--> <!-- 重定向到action param: actionName:指定“目的地”动作的名称。指定action标签name属性的值 namespace:用来指定目的地的命名空间。指定的是struts的配置文件action对应的package的namespace的值 --> <!--<result name="success" type="redirectAction"> <param name="actionName">userAction</param> <param name="namespace">/prima</param> </result> --> <!-- 跳转到action param: 和重定向到action的一样 --> <result name="success" type="chain"> <param name="actionName">userAction</param> <param name="namespace">/prima</param> </result> </action> </package>
注意:
我们以后写结果类型的时候尽量写标准写法。
重定向与转发的最大的区别在域request域信息的是否重置,所以我们使用request中添加属性,判断属性值是否可以显示验证转发与重定向。
如何在Action中获取request等web中常用的对象呢?
使用struts2提供的工具类ServletActionContext的指定方法,原来是struts2将request等web对象封装成了一个map集合,需要我们使用该工具类调用!
public String execute() throws Exception { System.out.println("ResultTypeAction ****** execute() "); //struts2框架将request封装成一个map集合,通过struts2框架提供的工具类ServletActionContext的getRequest()方法来获取request HttpServletRequest request=ServletActionContext.getRequest(); request.setAttribute("username", "username_request"); return "success"; }
测试使用的代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'form.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="${pageContext.request.contextPath }/resulttype/resultTypeAction.do" name="form1" method="post"> <input type="submit" value="提交"> </form> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'success.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> resulttype: ${requestScope.username } </body> </html>
前面的prima/success.jsp部分修改:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'success.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> this is success.jsp! <br> ${requestScope.username } </body> </html>
struts_resulttype.xml主要代码列出来就不写了,导入xml的也不写了
package cn.itcast.resulttype; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class ResultTypeAction extends ActionSupport { @Override public String execute() throws Exception { System.out.println("ResultTypeAction ****** execute() "); //struts2框架将request封装成一个map集合,通过struts2框架提供的工具类ServletActionContext的getRequest()方法来获取request HttpServletRequest request=ServletActionContext.getRequest(); request.setAttribute("username", "username_request"); return "success"; } }