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. 语法

代码示例:

 
  1. <result name=”success” type=”stream”>
  2. <param name=”inputName”>codeStream</param>
  3. </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. 语法

 
  1. <result name=”login” type=”redirectAction”>
  2. <param name=”namespace”>/命名空间</param>
  3. <param name=”actionName”>action名</param>
  4. <param name=”method”>方法名</param>
  5. </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下,那么可以省略命名空间的参数设置,即

 
  1. <result name=”login” type=”redirectAction”>
  2. <param name=”actionName”>action名</param>
  3. <param name=”method”>方法名</param>
  4. </result>

如果调用的是目标Action的execute方法,那么可以省略方法名的参数设置,即

 
  1. <result name=”login” type=”redirectAction”>
  2. <param name=”actionName”>action名</param>
  3. </result>

像上面这样的情况,只需要配置actionName时,其实还可以进一步简化

 
  1. <result name=”login” type=”redirectAction”>
  2. action名
  3. </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,将请求重定向给查询。

最新文章

  1. 解决Linux不能上网ping:unknown host的问题
  2. About_PHP_验证码的生成
  3. 《Programming with Objective-C》
  4. 第四讲 :hibernate中的session
  5. 【转】【SQLServer】SQL Server 2008“阻止保存要求重新创建表的更改”
  6. ural 1136. Parliament
  7. PHP静态成员变量
  8. 初级:使用MD5对字符串进行加密操作
  9. getPropertyValue 获取CSS样式
  10. 去重和分类后缀asp、php等路径 用python3写的
  11. oracle去掉字符串中所有指定字符
  12. HDU - 1160 (FatMouse&#39;s Speed )最长上升子序列
  13. 关于spring事务
  14. 【jQuery源码】select方法
  15. Python中参数多个值的表示法
  16. Ironic , Openstack Baremetal Hypervisor
  17. pixi之动画
  18. 持续集成工具Jenkins安装、部署、使用
  19. Linux防火墙的关闭和开启(转)
  20. ImportError: No module named lmdb

热门文章

  1. vue路由导航守卫及前置后置钩子函数参数详解
  2. ABAP的HTTP_GET和Linux的curl
  3. (译文)IOS block编程指南 3 概念总览
  4. sqlite3:深入理解sqlite3_stmt 机制
  5. scroll offset &amp; client总结
  6. zabbix利用微信报警
  7. Open Cascade创建自己的MFC文档程序
  8. Linux-04 Linux中Tomcat和MySQL的安装
  9. Springboot 图标更换
  10. 内存区--Java