Struts2中获取Session的方式有3种,大家掌握其中任何一种都可以。
通过ActionContext.getContext().getSession()获得Session,注意其返回类型为Map<String,Object>。事实上,Session对象存储数据的方式通Map一致,因此Struts2提供了Map类型的Session,意于简化对Session的操作。
通过ServletActionContext.getRequest().getSession()获得Session,其返回类型为HttpSession。
1、返回类型的对比
2、获取方式的对比
3、推荐使用第3种方式
这种方式采用了注入的思想,更为灵活。并且是面向接口编程,符合主流的规范。
打开登录页面是一类请求,是最简单的请求,这种请求中不包含任何的业务,仅仅是将请求转发给JSP而已。但无论请求简单与否,我们都要遵循MVC的设计原则,即将请求提交给控制器,那么在Struts2框架下,该请求处理过程如下图。
图-1
在这个请求的过程中,Action充当业务控制器,但是由于没有任何的业务,所以实际上Action中无需写任何的业务代码。那么这种情况下,实际上Action类不必创建,在struts.xml中配置action时不指定class属性即可,这样Struts2会自动实例化一个默认的ActionSupport类来充当Action,此类中有默认方法execute,该方法返回了success。
所以,在这次请求当中,我们需要写代码的位置只有struts.xml以及JSP。
点击登录按钮时,需要对用户输入的账号、密码进行校验,目前这种校验主流的实现方式是采取异步的通讯方式,然而由于我们还没有学习如何在Struts2框架下使用异步,所以这里我们还是先采用表单提交及服务端校验来实现。
那么点击登录按钮时,需要把请求提交给Action,在Action中实现具体的校验逻辑,该请求及校验的过程如下图。
图-2
对于这次请求,我们需要编写代码的位置有Entity、DAO、Action、struts.xml、JSP。
1、struts.xml中,配置打开登录页的Action。
2、创建登录页login.jsp。
1、创建管理员实体类Admin.java。
2、创建登录模块DAO,增加根据账号查询管理员的方法。
3、创建登录校验Action。
4、struts.xml中配置action。
5、登录页面上,设置表单项。
在这些步骤中,最重要的是校验账号及密码的逻辑,其过程如下图所示
图-3
Result是用于做输出的组件,用于向页面输出一些内容,转发、重定向可以理解为特殊方式的输出。每一个Result实际上就是一个类,这些类都实现了共同的接口Result,Struts2预置了10种类型的Result,他们被定义在struts-default.xml中 ,如下图所示。
图-4
dispatcher类型是用于转发的Result,可以将请求转发给JSP。这种类型的Result对应的类为ServletDispatcherResult,它是Struts2默认的Result类型,该默认行为是定义该Result时,通过default="true"指定的 。
在此之前,我们使用的Result都是这种默认的dispatcher类型的Result。
stream类型是用于向页面输出二进制数据,这种类型的Result,可以将二进制数据输出到请求发起的位置, 它对应的类为StreamResult 。
redirectAction类型是用于将请求重定向给另外一个Action,这种类型Result对应的类为ServletActionRedirectResult 。
json类型是用于向页面输出json格式的数据,这种类型的Result,可以将json字符串输出到请求发起的位置,它对应的类为JSONResult。
此类Result不是Struts2预置的Result,但是确是十分常用的类型 。
用于向页面输出二进制数据,此种类型的Result,可以将二进制数据输出到请求发起端。它会自动创建输出流,接入Action中定义的输入流并将其输出。
代码示例:
<result name=”success” type=”stream”> <param name=”inputName”>codeStream</param> </result>
代码说明:
关系图示:
图-5
1、在Action中,定义InputStream类型的输出属性 。
2、在struts.xml中,配置该Action。
3、在action下,配置stream类型的result。
打开登录页面时,生成一张随机的验证码图片。当点击验证码图片时,重新生成一张新图片。点击登录按钮时,要先校验验证码是否正确,若正确再校验账号及密码,否则给与错误提示。
1、生成验证码图片
登录页面上,通过img标记加载图片,这是浏览器读取登录页面时单独发送的一次请求。在这次请求中,我们需要生成动态图片并输出给img显示。
这次请求的处理过程如下图所示:
图-6
在这次请求中,我们需要编码的位置有ImageUtil、Action、struts.xml、JSP。其中重点内容是Action调用ImageUtil图片生成组件来生成图片,并利用stream类型的result将图片输出给页面的img。
2、验证码校验
点击登录时,我们在对应Action中校验了账号及密码,那么对验证码的校验,也可以加入到此Action中,代码位置在校验账号及密码之前。
回顾校验账号及密码的处理过程,如下图
图-7
在此过程中,我们需要重构的代码有Action和JSP。
用于将请求重定向给另外一个Action。在MVC设计模式下,我们应该把每次请求都发送给控制器,即Action。因此重定向时是发送一次新的请求,那么也应该把这次请求发送给Action,避免出现直接把请求发送给JSP的情况。
<result name=”login” type=”redirectAction”> <param name=”namespace”>/命名空间</param> <param name=”actionName”>action名</param> <param name=”method”>方法名</param> </result>
如果重定向的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>
点击删除按钮,删除当前行的资费数据。删除之后,需要刷新资费列表页面。
删除的请求中,需要将选中数据的ID传给Action,Action调用DAO将当前ID对应的数据删除。删除结束后,为了刷新列表页面,需要将请求重定向给查询Action。
请求过程如下图:
图-8
删除的请求,我们重点要理解请求结束时的重定向