Struts自动登陆复选框

 0hi猿团提供了移动跨平台开发视频,包括html5,apicloud appcan,dcloud,具体请看http://www.9y.cm 

用户注册案例的实验视频 ——增加两星期自动登陆复选框

 

步骤:

1.在jsp页面中使用<html:checkbox>标签;

2.在formbean中定义布尔类型的autoLogon成员变量;

3.在第二个jsp页面中输出结果。

4.通过想取消保存在Session中的FormBean中的复选框的勾选操作,引入reset方法的讲解。

问题:

FormBean通常都保存在request作用域中,在什么情况下需要将FormBean保存在Session作用域中呢?

 

 

第2步: autoLogon属性不能放在User实体中,因为它不属于User的属性,而是属于Web层的一个功能而已。

第4步:在这里,先提前确保formbean的存储域设置为了session,然后演示校验出错并回到输入页面后,取消原来的钩选操作,成功提交后,看到第二个jsp页面打印的结果仍然为true,这是为什么?分析原因后,引出reset的讲解。reset主要是对保存在session域中的formbean进行清理。

 

问题答案:分阶段提交表单时就必须将FormBean保存在Session作用域中,参看下页的图,由于时间关系和这个知识相对不是那么重要,我就不写具体的例子了,如果你以后的工作中有这方面的需求,可以找我再交流。

 

 

用户注册案例的实验 ——<html:form>与防止表单重复提交

 

<html:form>标签的三个作用:

1.生成html文档的<form>标签,其focus属性还可以生成相应的javasript代码;

2.获取action属性中路径所对应的scope域中的formbean,存在则获取,不存在则创建新的,再把这个formbean以一个特殊关键字保存在request中,以便其中的<html:xxx>标签获取值时使用。

3.检查Session中是否存在Token,是则生成隐藏字段,以防止表单重复提交。实验步骤:

1.先通过刷新浏览器的方式演示重复提交表单的效果

2.在第一个Action中调用saveToken

3.查看jsp页面的<html:form>生成hidden字段

4. 在第二个action中调用isTokenValid

问题:

如果<html:form>标签提交到的action路径没有关联FormBean,将出现异常,为什么?

一个formbean对象除了在ActionServlet中处理请求的过程中被创建,还可能在什么时候被创建?

 

 

讲第2个作用时:参看下页的图和结合jsp页面的源码讲解:前面分析过<html:text>标签为什么能够回显示数据?回显的数据是从一个FormBean中取出来的,这个FormBean就是外层的<html:form>标签关联的Action路径所绑定的那个FormBean,如果是表单校验出错回到当前这个JSP页面,我们知道这时候是ActionServlet创建并存储了这个FormBean,如果是直接访问这个JSP页面,那么,JSP页面执行之前就没有谁创建这个FormBean对象,这时候<html:text>标签显示的FormBean对象是怎么得到的呢?这就是<html:form>标签自己干的,它会创建一个新的FormBean并保存在相应作用域中。查看FormTag标签类的源码,了解<html:form>标签的第三个作用:<html:form>标签在执行体之前,将formbean以Constants.BEAN_KEY属性名保存,<html:form>执行体之后,取走Constants.BEAN_KEY属性,由于学员无法接受这么多信息,这里的源代码就不作过多分析了。在这里增加一个int类型的height属性,看到其初始值被填充为了0,大家便直观地感受到了<html:formbean>标签会创建新的formbean和<html:text>标签会显示出这个formbean中的相应属性的这种效果。

 

讲第3个作用时:只要将下面代码中applicationScope 改为sessionScope,然后将这段代码加在显示表单的那个页面,立即就可以发现session中存储了一个Token的效果:

<c:forEach items="${applicationScope}" var="oneAttr">

${oneAttr.key }:${oneAttr.value }<br>

</c:forEach>

 

第1个问题的答案:参看下页的图和结合jsp页面的源码讲解:必须先显示表单,然后才有提交表单,由于在提交表单之前可能会使用到<html:text>等标签,而<html:text>等标签要回显的数据是从一个FormBean中取出来的,所以,在提交表单之前就要用到FormBean, 而这个FormBean对象是怎么找出来的呢?就是外层的<html:form>标签关联的Action路径所绑定的那个FormBean,显然,如果Action没有关联FormBean,<html:text>的回显功能就无法实现,所以, <html:form>标签提交到的action路径必须关联一个FormBean。 

 

第2个问题的答案:还可能在jsp页面调用<html:form>标签时被创建。

 

Struts中的类型转换器 ——formbean属性的整数与日期类型

 

步骤:

1. 由注册页面中的int类型的height字段的显示问题想到将height属性改为Integer类型。

2.在formbean中增加java.util.Date类型的birthday属性和在jsp页面中增加对应的<html:text>标签。

3.由无法完成Date类型转换问题,引出了Struts中的类型转换器问题,自己编写Date类型转换器。

4.编写ActionServlet的子类ItcastActionServlet,在init方法中注册Date类型转换器。

5.用jstl的<fmt:formateDate>标签回显日期。

6.由表单校验出错后回到输入jsp页面时的height字段的显示问题引出ActionServlet的convertNull初始化参数的讲解。

 

开场:我们在前面已经看到过,如果FormBean中有一个整数类型的属性,将其类型定义为int时,这个属性的默认值是0;在表单页面中用<html:text>标签生成一个文本框来输入这个属性的值,这个文本框中默认即显示一个0,而不是空白,我们有什么办法来解决这个问题呢?

第1步:

 根据上面的问题,我们将整数类型的属性定义为Integer类型,这样,该属性的默认值为null,借助<html:text>可将null显示为空字符串,但是,当文本框中没有填写任何内容时,发送到WEB服务器的参数值为一空字符串“”;,当ActionForm Bean中的其它属性校验失败,回到表单页面重新显示时,与Integer类型的属性对应的文本框中显示的内容又为0了。这说明struts在将请求参数组装进ActionForm Bean对象中时、它也会将内容为空字符串“”的请求参数(文本框中不填写任何内容时即会出现这种情况)装配到ActionForm Bean中,并且将空字符串“”转变成0值的Integer数据。解决这个问题的方法很简单,但是如果要想明白解决方法的原理,必须理解Struts中的转换器,我们等讲完转换器之后再来讲解和解决这个问题。

刚才的问题正好说清楚了int与Integer的区别,这是一道常见的笔试题,答案一定要技压群芳,脱颖而出,鹤立鸡群。

 

第4步:讲解转换器的时候,先讲解DataConverter,并在super.init方法之前注册转换器,然后才讲int转换器的问题,结果Date转换器又出了问题,挺有意思的,分析ActionServlet的源代码,发现convertNull会导致先取消所有的转换器,所以,应该在super.init方法之后注册转换器。以后讲课时应让这个错误重现,以便引发学员的好奇和增强趣味性。

 

第5步:看到回显示的数据格式不对,将Data转换器改写成双向转换,仍然不行,这是因为html:text标签进行回显时用的是对象的toString方法,而不是调用转换器。所以,要想能够回显数据,必须自己用jstl的<fmt:formateDate>标签。这也是struts框架相比struts2框架的一个不足之处。

 

第6 步:配置ActionServlet的ConvertNull初始化参数后,前面编写的DateConverter除了问题,这时候告诉大家如何关联源代码,查看ActionServlet的源码即可知道ConvertNull的内部工作机制和顺便解决DateConverter的问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhchzh1000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值