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的问题。