struts2常用类型的Result
2.2.1. dispatcher
dispatcher类型是用于转发的Result,可以将请求转发给JSP。这种类型的Result对应的类为 ServletDispatcherResult,它是Struts2默认的Result类型,该默认行为是定义该Result时,通过 default="true"指定的 。
在此之前,我们使用的Result都是这种默认的dispatcher类型的Result。
2.2.2. stream
stream类型是用于向页面输出二进制数据,这种类型的Result,可以将二进制数据输出到请求发起的位置, 它对应的类为StreamResult 。
2.2.3. redirectAction
redirectAction类型是用于将请求重定向给另外一个Action,这种类型Result对应的类为ServletActionRedirectResult 。
2.2.4. json
json类型是用于向页面输出json格式的数据,这种类型的Result,可以将json字符串输出到请求发起的位置,它对应的类为JSONResult。
此类Result不是Struts2预置的Result,但是确是十分常用的类型 。
3. stream Result
3.1. 作用
3.1.1. stream Result的作用
用于向页面输出二进制数据,此种类型的Result,可以将二进制数据输出到请求发起端。它会自动创建输出流,接入Action中定义的输入流并将其输出。
3.2. 使用方式
3.2.1. 语法
代码示例:
- <result name=”success” type=”stream”>
- <param name=”inputName”>codeStream</param>
- </result>
代码说明:
- type=”stream”中的stream,引用的是Struts2在struts-default.xml中定义的result的名称,是固定写法。
- name=”inputName”中的inputName,指的是该result对应的类StreamResult中的属性,用意是要为其属性赋值,是固定写法。
- codeStream指的是Action中某属性名,该属性需为InputStream类型,因此这里的写法不固定,看属性名而定。
关系图示:
图-5
3.2.2. 使用步骤
1、在Action中,定义InputStream类型的输出属性 。
2、在struts.xml中,配置该Action。
3、在action下,配置stream类型的result。
3.3. 登录验证码
3.3.1. 需求描述
打开登录页面时,生成一张随机的验证码图片。当点击验证码图片时,重新生成一张新图片。点击登录按钮时,要先校验验证码是否正确,若正确再校验账号及密码,否则给与错误提示。
3.3.2. 开发思路
1、生成验证码图片
登录页面上,通过img标记加载图片,这是浏览器读取登录页面时单独发送的一次请求。在这次请求中,我们需要生成动态图片并输出给img显示。
这次请求的处理过程如下图所示:
图-6
在这次请求中,我们需要编码的位置有ImageUtil、Action、struts.xml、JSP。其中重点内容是Action调用ImageUtil图片生成组件来生成图片,并利用stream类型的result将图片输出给页面的img。
2、验证码校验
点击登录时,我们在对应Action中校验了账号及密码,那么对验证码的校验,也可以加入到此Action中,代码位置在校验账号及密码之前。
回顾校验账号及密码的处理过程,如下图
图-7
在此过程中,我们需要重构的代码有Action和JSP。
3.3.3. 开发步骤-请求1
- 定义输出属性,类型为InputStream。
- 业务方法中,调用ImageUtil生成图片,并将图片流化赋值给输出属性。
- 取得图片中的文字内容,并将其存入session,便于验证码校验时使用。
3.3.4. 开发步骤-请求2
- 追加输入属性,接收传入的验证码。
- 业务方法中,在校验账号、密码前校验验证码是否正确,即将接收到的验证码与session保存的验证码比较。
4. redirectAction Result
4.1. 作用
4.1.1. redirectAction Result的作用
用于将请求重定向给另外一个Action。在MVC设计模式下,我们应该把每次请求都发送给控制器,即Action。因此重定向时是发送一次新的请求,那么也应该把这次请求发送给Action,避免出现直接把请求发送给JSP的情况。
4.2. 使用方式
4.2.1. 语法
- <result name=”login” type=”redirectAction”>
- <param name=”namespace”>/命名空间</param>
- <param name=”actionName”>action名</param>
- <param name=”method”>方法名</param>
- </result>
- type=”redirectAction”中的redirectAction引用的是struts-default.xml中定义的result的名称,是固定写法。
- name=”namespace”中的namespace,指的是该result类中的属性,用意是要给该属性赋值,告诉result要重定向的包的命名空间,是固定写法。
- name=”actionName”中的actionName,指的是该result类中的属性,用意是要给该属性赋值,告诉result要重定向的action名称,是固定写法。
- name=”method”中的method指的是该result类中的属性,用意是要给该属性赋值,告诉result要调用目标Action哪个方法,是固定写法。
- param标记中的内容,都是针对其name所指定的属性要赋值的内容,该内容是动态的,跟具体业务相关。
如果重定向的Action与当前的Action在同一个namespace下,那么可以省略命名空间的参数设置,即
- <result name=”login” type=”redirectAction”>
- <param name=”actionName”>action名</param>
- <param name=”method”>方法名</param>
- </result>
如果调用的是目标Action的execute方法,那么可以省略方法名的参数设置,即
- <result name=”login” type=”redirectAction”>
- <param name=”actionName”>action名</param>
- </result>
像上面这样的情况,只需要配置actionName时,其实还可以进一步简化
- <result name=”login” type=”redirectAction”>
- action名
- </result>
4.2.2. 使用步骤
4.3. 资费删除
4.3.1. 需求描述
点击删除按钮,删除当前行的资费数据。删除之后,需要刷新资费列表页面。
4.3.2. 开发思路
删除的请求中,需要将选中数据的ID传给Action,Action调用DAO将当前ID对应的数据删除。删除结束后,为了刷新列表页面,需要将请求重定向给查询Action。
请求过程如下图:
图-8
删除的请求,我们重点要理解请求结束时的重定向
- 从业务角度来说,删除与查询是2个独立的业务,彼此之间并不相互依赖,因此应该是用2种请求来分别处理。那么这2次请求之间的衔接是业务场景要求的,我们需要使用重定向来实现。
- 从代码角度来说,如果删除后不是重定向,而是直接将请求转发给查询页面的话,那么对于查询页面而言,它所处的这次请求 中,ValueStack栈顶Action是删除Action,该Action中没有它要显示的列表数据以及分页数据,会导致页面显示数据有误,无法实现 真正的刷新。
4.3.3. 开发步骤
- 定义输入属性id。
- 业务方法中调用DAO,根据id删除资费数据。
- 配置删除Action。
- 配置result,将请求重定向给查询。
struts2常用类型的Result的更多相关文章
- struts2学习笔记之七:Result类型
一:关于Struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法 他们体现了策略模式,具体Result类型参见:struts-default ...
- Struts2常用标签
Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的 ...
- MyBatis jdbcType常用类型
MyBatis jdbcType常用类型 jdbcType与javaType对应关系 javaType jdbctype CHAR String VARCHAR String LONGVARCHAR ...
- Struts2常用标签总结
Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的 ...
- 第1节 Scala基础语法:5、6、7、8、基础-申明变量和常用类型,表达式,循环,定义方法和函数
4. Scala基础 4.1. 声明变量 package cn.itcast.scala object VariableDemo { def main(args: Array[Strin ...
- [PowerShell] 快速入门, 基本语法, 常用类型, 函数, .NET 互操作
PowerShell 快速入门 开始之前, 我们认定你已经有一定的编程基础, 熟悉 .NET 中的类型与对象. 此文章对于 .NET 开发者来说更简单哦! 在 PowerShell 中, 几乎一切都是 ...
- ashx中Response.ContentType的常用类型
ashx中Response.ContentType的常用类型: text/plaintext/htmltext/xmlapplication/jsonimage/GIFapplication/x-cd ...
- 【跟着子迟品 underscore】常用类型判断以及一些有用的工具方法
Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...
- struts2学习笔记之十一:struts2的类型转换器
Struts2的类型转换器 如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString 注 ...
随机推荐
- java将一个List赋值给另一个List的4种方法
编辑 删除 声明:ArrayList a, 仅仅只是声明了一个list变量,其未来作用相当于C++中的引用变量,亦或者相当于一个对象块的索引,但并未为其分配具体的完整的对象所需要的内存空间,其所分配的 ...
- qt5.5.1+vs2010发送邮件
最近用到了这个功能,用于验证登陆~为此在网上找了好久,发现这方面的问答并不多!唯独这篇的解答实在.原文传送 1.首先选定自己的发送方的邮箱,无论是163还是qq邮箱等,首先都得开通SMTP服务:以16 ...
- vue下axios和fetch跨域请求
1.在config的index.js下面进行常用跨域配置代码:proxyTable: { '/apis': { //使用"/api"来代替"http://xxxx.cn& ...
- DROP SEQUENCE - 删除一个序列
SYNOPSIS DROP SEQUENCE name [, ...] [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP SEQUENCE 从数据库中删除序列号生成 ...
- core 中使用 nlog
引包 代码 public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory logFac) ...
- Window服务程序(windows service application)如何调试
服务程序不能通过常规的按F5或F11的方式来进行调试和运行,也无法立即运行一个服务或逐步调试它的代码. 因此,你必须安装并启动你的服务,然后附属(attach)一个Debugger到这个服务的进程上.
- 弹跳加载动画特效Bouncing loader
一款非常常用的css 加载动画,这款CSS3 Loading动画主要由几个小球通过规律的上下跳动,渐隐渐显而成,效果十分生动.流畅.兼容IE8以上,尤其适合在移动端中使用,基本代替了图片实现加载的效果 ...
- Web前端技术体系大全搜索
一.前端技术框架 1.Vue.js 官网:https://cn.vuejs.org/ Vue CLI:https://cli.vuejs.org/ 菜鸟教程:http://www.runoob.com ...
- 在已有的mysql表中添加自增字段
现有数据表xiami,建表的时候忘记添加自增字段,现需要添加自增字段 第一步:添加字段 alter table xiami add id int; 第二步:修改字段 alter tabel xiami ...
- Linux vim指令学习
每天查看一遍vim文档 Linux系统下命令:$ vimtutor 1.可视模式([v] 或者 [Ctrl + v])下的[U]把选中的文本变为大写 .[u]把选中的文本变为小写. 2.[数字] + ...