菜鸟学Struts2——Results
在对Struts2的Action学习之后,对Struts2的Result进行学习。主要对Struts2文档Guides中的Results分支进行学习,如下图:
1、Result Types(Result类型)
Struts2的Action处理用户请求后返回一个字符串,在struts.xml配置文件中进行字符串与实际视图的映射,在配置文件中是通过action的子元素result来完成此功能的,result的格式如下:
<result name="字符串" type="视图类型">实际视图</result>
Struts2的result类型主要有以下几种:
对以上Result Type几种常见的进行学习,其中Freemarker、Velocity、XSL、JSON等几个暂不学习。
(1)Chain Result
这个在对Action进行学习的时候已经使用过,Chain Result有4个参数,actionName (default) 、namespace 、method 、skipActions ,关于Chain Result的学习已经在 菜鸟学习Struts2——Actions 记录。配置列子如下:
<result type="chain">
<param name="actionName">chain</param>
<param name="namespace">/chain</param>
</result>
(2)Dispatcher Result
Dispatcher Result 负责转发到指定的JSP页面,效果跟<jsp:forword page=".."/>是一样的,这是Result默认的类型,所以可以在result中指定<result name="success">a.jsp</result>而不用指定其类型。Dispatcher Result有两个参数配置location (default) 、parse ,其中location执行jsp所在的位置,parse默认是true,如果将parse设置成false,则localtion的Url中挂着的参数将不会被解析到OGNL值栈中,配置列子如下:
<result name="input">/index.jsp</result>
(3)HttpHeader Result
HttpHeader Result允许开发自定义返回http header的参数或者返回一个错误信息,HttpHeader Result有5个参数status、parse(跟dispatcher的parse一样)、headers 、error、errorMessage ,配置列子如下:
<result name="success" type="httpheader">
<param name="status">204</param>
<param name="headers.a">a custom header value</param>
<param name="headers.b">another custom header value</param>
</result> <result name="proxyRequired" type="httpheader">
<param name="error">305</param>
<param name="errorMessage">this action must be accessed through a proxy</param>
</result>
(4)Redirect Result
Redirect Result跟response.sendRedirect("")的效果是一致的,也就是重定向,页面重定向是一个新的请求,上一个request中的值都将消息,如果需要在重定向之后保持上一次请求的值,那个可以将上一次request的值放到session中,或者在result中配置param。 Redirect Result有3个参数location (default) 、parse (跟dispatcher的parse一样)、anchor(指定该值则会出现在url中,如http://www.xx.com#anchor),配置例子如下:
<result name="success" type="redirect">
<param name="location">foo.jsp</param>
<param name="parse">false</param>
<param name="anchor">FRAGMENT</param>
</result>
上面的列子最后的url将会是:foo.jsp#FRAGMENT
<result name="showReportResult" type="redirect">
<param name="location">generateReport.jsp</param>
<param name="reportType">pie</param>
<param name="width">100</param>
<param name="height">100</param>
<param name="parse">false</param>
<param name="anchor">summary</param>
</result>
上面的列子最后的url将会是:generateReport.jsp?reportType=pie&width=
100
&height=
100
#summary
(5)Redirect Action Result
Redirect Action Result与Redirect Result有点一样,Redirect通过location指定重定向的url,而Redirect Action Result通过actionName和namespace指定重定向的Url,Redirect Result不会将空值的param挂在Url上,但Redirect Action Result可以通过配置suppressEmptyParameters决定是否将空值的param挂在Url上(但是测试过程中,不管是将suppressEmptyParameters设置成为false,还是设置成为true,都不会将控制的param挂着在Url上,chrome浏览器环境!!! 后续在研究研究,还是自己理解错了??),Redirect Action Result 有5个参数配置actionName (default) 、namespace 、suppressEmptyParameters、parse 、anchor,配置列子如下:
<result name="redirect" type="redirectAction">
<param name="actionName">result-target</param>
<param name="width"></param>
<param name="height">100</param>
<param name="suppressEmptyParameters">false</param>
</result>
(6)Stream Result
Stream Result用于返回一个InputStream,原始数据直接传递给HttpServletResponse,可以用于文件下载等,Stream Result有7个参数contentType 、contentLength、contentDisposition、inputName 、bufferSize 、allowCaching 、contentCharSet 。完整的列子如下:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="result" extends="struts-default" namespace="/result">
<action name="result-*" class="yaolin.core.action.ResultAction" method="{1}">
<result name="stream" type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">stream</param>
<param name="contentDisposition">attachment;filename="yaolin.jpg"</param>
<param name="bufferSize">1024</param>
</result>
</action>
</package>
</struts>
package yaolin.core.action; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream; public class ResultAction { // 文件流
private InputStream stream;
// Stream Result
public String stream() throws Exception {
File img = new File("E:/yaolin.jpg");
stream = new FileInputStream(img);
return "stream";
} // getter and setter
public InputStream getStream() {
return stream;
}
}
(7)PlainText Result
PlainText Result是直接将JSP/HTML中的源代码内容输入到页面中,PlaintText Result有两个参数location、charset。配置例子如下:
<result name="text" type="plainText">
<param name="location">/index.jsp</param>
<param name="charset">utf-8</param>
</result>
2、DispatcherListener
以下是官网DOC给的例子,暂时没搞明白怎么用?? 后续研究一下。
//Use a DispatcherListener object to execute code when a Dispatcher is initalized or destroyed. A DispatcherListener is an easy way to associate customizable components like a ConfigurationManager with a Dispatcher.
static {
Dispatcher.addDispatcherListener(new DispatcherListener() {
public void dispatcherInitialized(Dispatcher du) {
// do something to Dispatcher after it is initialized eg.
du.setConfigurationManager(....);
} public void dispatcherDestroyed(Dispatcher du) {
// do some cleanup after Dispatcher is destroyed.
}
});
}
3、PreResultListener
PreResultListener暂时没有想到实际的用法,后续研究一下,以下是DOC中的说明&列子:
描述:A PreResultListener can affect an action invocation between the interceptor/action phase and the result phase. Typical uses include switching to a different Result or somehow modifying the Result or Action objects before the Result executes.
例子:
// 在Action中使用
public class MyAction extends ActionSupport {
...
public String execute() throws Exception {
ActionInvocation invocation = ActionContext.getContext().getActionInvocation();
invocation.addPreResultListener(new PreResultListener() {
public void beforeResult(ActionInvocation invocation,
String resultCode) {
// perform operation necessary before Result execution
}
});
}
...
}
// 在拦截器中使用
public class MyInterceptor extends AbstractInterceptor {
...
public String intercept(ActionInvocation invocation) throws Exception {
invocation.addPreResultListener(new PreResultListener() {
public void beforeResult(ActionInvocation invocation,
String resultCode) {
// perform operation necessary before Result execution
}
});
}
...
}
对于Result这一块仍有DispatcherListener、PreResultListener需要进行研究。
未完,待续。
菜鸟学Struts2——Results的更多相关文章
- 菜鸟学Struts2——零配置(Convention )
又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...
- 菜鸟学Struts2——Interceptors
昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...
- 菜鸟学Struts2——Actions
在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- 菜鸟学Struts2——HelloWorld
写在前面 自从工作后就过上了只有一个月记忆的生活,太健忘,很多学过的东西因为用得少便忘记了,第二次学习struts,为了以后便于查阅,开始自己的博客之旅.Struts的学习还是从Hello World ...
- 菜鸟学自动化测试(八)----selenium 2.0环境搭建(基于maven)
菜鸟学自动化测试(八)----selenium 2.0环境搭建(基于maven) 2012-02-04 13:11 by 虫师, 11419 阅读, 5 评论, 收藏, 编辑 之前我就讲过一种方试来搭 ...
- 菜鸟学IT之四则运算升级版
菜鸟学IT之四则运算升级版 本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213 团队代码github远程仓库的 ...
- 菜鸟学Java(十五)——Java反射机制(二)
上一篇博文<菜鸟学编程(九)——Java反射机制(一)>里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用.上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈, ...
- 菜鸟学Java(十四)——Java反射机制(一)
说到反射,相信有过编程经验的人都不会陌生.反射机制让Java变得更加的灵活.反射机制在Java的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...
随机推荐
- Elasticsearch之java的基本操作一
摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...
- document.documentElement.clientHeight 与 document.body.clientHeight(杜绝千篇一律的抄袭!!)
document.documentElement.clientHeight 与 document.body.clientHeight用来获取页面可视高度我觉得有点问题.这两个应该不是一个东西. 页面中 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)
系列目录 前言 听标题的名字似乎是一个非常牛X复杂的功能,但是实际上它确实是非常复杂的,我们本节将演示如何实现对数据,进行组合查询(数据筛选) 我们都知道Excel中是如何筛选数据的.就像下面一样 他 ...
- Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现
前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Scheme的使用(Android业务组件化之URL Scheme使用),今天重点来聊 ...
- C#多线程之基础篇3
在上一篇C#多线程之基础篇2中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线 ...
- Win.ini和注册表的读取写入
最近在做打包的工作,应用程序的配置信息可以放在注册表文件中,但是在以前的16位操作系统下,配置信息放在Win.ini文件中.下面介绍一下Win.ini文件的读写方法和注册表的编程. 先介绍下Win.i ...
- SDWebImage源码解读_之SDWebImageDecoder
第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...
- Linux之搭建自己的根文件系统
Hi!大家好,我是CrazyCatJack.又和大家见面了.今天给大家带来的是构建Linux下的根文件系统.希望大家看过之后都能构建出符合自己需求的根文件系统^_^ 1.内容概述 1.构造过程 今天给 ...
- CSS 3学习——transform 2D转换
首先声明一点,transform属性不为none的元素是它的定位子元素(绝对定位和固定定位)的包含块,而且对内创建一个新的层叠上下文. 注意:可以通过 transform-box 属性指定元素的那个盒 ...
- 由js apply与call方法想到的js数据类型(原始类型和引用类型)
原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...