0hi猿团提供了移动跨平台开发视频,包括html5,apicloud appcan,dcloud,具体请看http://www.9y.cm
用户注册案例的实验 ——FormBean基础
步骤:
1.在网页中添加原始的<form>标签、三个输入框(用户名,密码,密码2)和一个提交按钮。
2.由提交路径编写不方便引入<html:rewrite>和在action中用request.getParameter获得参数,在action中直接向response中打印出formbean的信息,然后进行访问测试。
3. 引入formbean,创建和配置formbean,formbean中全部用基本属性的方式。
4.在formbean中引入复杂属性user实体对象,formbean中包含user实体对象和password2字段。对于复杂属性对象一定要初始化,否则,在提交数据时就会出问题。
5.在最后的成功页面中用el表达式从formbean中提取数据显示,引出attribute和scope属性的讲解,顺便分析Session的序列化问题。
总结:
如果某个Action关联了一个FormBean,那么,当浏览器请求这个Action时,Struts框架将创建这个FormBean,把这个FormBean存储在相应的Web域中,并用请求参数来填充这个formbean。
对于请求消息中的每个参数(包括网页表单中的每个字段),其相关的ActionForm 通常都有一个对应的属性来接受相应的参数值。
第2步:使用<html:rewrite>生成url地址和在action中用request.getParameter获得参数,Action的execute的可以不返回ActionForward对象,而是返回null,完全可以把exeucte方法当作一个servlet的service方法来用,例如,用response.getWriter().write()输出内容,不过这时候失去了struts的特性了,没什么意义了。实验首先不返回null,而是直接在原来返回ActionForward对象的基础上,增加response的输出代码,正好可以演示response的输出结果被覆盖掉的效果。
第4步实验:为了便于大家复习代码,最好保留原来的formbean,重新编写一个新formbean。写完formbean,提问复杂属性必须初始化一个实例对象吗?刚开始故意不对 formbean的user成员变量进行初始化,提交数据时,beanutil总是报告说bean not found的错误。然后比喻说你要一杯水,我是先取你的水杯后再向其中加水,然后找一个新水杯加水后给你,对于前者你必须有个空的水杯,后者则不需要。这时候在formbean的setUser和getUser方法中加入监视代码即可知道,复合属性调用的是formbean.getUser().setName()。
第5步:要提问struts框架保存formbean时,以什么key存在什么域中,这是通过attribute属性和scope属性配置的,在第二个JSP页面中,用下面代码分析了formbean是默认存储在Session中的和存储时的key值是什么:
<c:forEach items="${applicationScope}" var="oneAttr">
${oneAttr.key }:${oneAttr.value }<br>
</c:forEach>
另外,引入user实体对象后,应用程序每次重新加载前,也即关闭时都报告Session序列化的错误,这是因为User没有实现Serializable接口造成的,在这里顺便分析和解决User没有实现Serializable接口造成的重启应用程序时报告Session序列化的错误的问题。这里提问前面的User对象为什么会被序列化?因为被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘。在解释时发现,几乎所有的学员对什么时候需要实现Serializable接口的概念很陌生。我的解释是把对象保存到硬盘上,你可以自己写代码保存和还原,你也可以让java提供的OutputStream的writeObject方法帮你做,如果让java 帮你做,你必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作。只要是要将一个对象向外序列化出去,例如,复制到网络上的其他计算机,存储到硬盘等等,就要让其实现Serializable接口。
用户注册案例的实验 ——FormBean表单校验
步骤:
1.讲述表单校验的基本原理,分析FormBean的validate方法和返回校验结果的方式,编码说明当formbean的password2与user的password不相等时,则生成错误提示信息, ActionMessage对象关联的错误提示信息先直接用程序中的字符串来定义。
2.根据运行的错误提示信息,引入input属性的讲解。
3.画一个用于分析校验出错后应回到输入jsp页面和要传递哪些数据给该页面的简单示意图。(见下页)
4.用普通el表达式从formbean中提取数据回显和用el表达式显示错误信息。
第1步: validate方法返回的errors对象是干什么用的呢?它就是要给后面的jsp页面显示用的,errors对象中要存储的就是要显示错误信息。
第2步:先提问校验出错了该怎么办?返回到的通常应该是刚才填写表单信息的页面,并要在该页面中显示出上次填入的内容和错误提示信息。
第3步:校验出错后回到输入jsp页面前,错误信息和表单中原来填写的数据传递该jsp页面,如何传递呢?把数据装在一个对象中,再把对象存储在request作用域中。 Formbean中存储有上次输入的数据,关于formbean的存储,前面已经分析过,而载有错误的信息的errors是怎么存储进request中的呢?是Struts框架,即ActionServlet,应该使用request.setAttribute(“特殊属性名”,erros);存入的属性名是一个固定的特殊名称,这样,你才能够显示这个错误。存储的关键字是什么?Globals.ERROR_KEY。
第4步:显示错误信息使用的el表达式为${requestScope["org.apache.struts.action.ERROR"]} 。
阶段与面试有关的目标
在action中可不可以直接向浏览器输出内容?
struts配置文件中的action元素的attribute属性的作用?
struts配置文件中的action元素的input属性的作用?
答案:第1题的答案:
可以,不过这时候不能返回ActionForward对象,而是必须返回null,否则,会被覆盖掉。
第2题的答案:
action中的attribute属性的作用:action通常与一个formbean关联,formbean用于收集提交给action的参数,而随后的jsp页面往往也需要提取并显示formbean中的数据,所以,struts框架还要将formbean保存在request或者session作用域中,以便jsp页面可以获取,formbean保存在web作用域中的key值就是通过attribute属性指定的。如果没有指定attribute属性,那么,其默认为name属性的值。
第3题的答案:
formbean的validate方法校验出错时,ActionServlet将返回一个显示错误的页面,这个页面就是通过input属性指定的,从input这个名称上来看,struts框架设计者希望这个页面就是用于输入和提交表单数据的那个页面,以便用户可以再次重新输入正确的数据。