11月23日spring mvc复习培训日记
2006-11-26 13:46 java ee spring 阅读(173) 评论(0) 编辑 收藏 举报今天复习前些天讲解的spring mvc,要求每个学员都能独立使用SimpleFormController完成表单处理流程,主要由学生自己动手实践。
写spring mvc的例子程序时,想想spring mvc程序的工作流程,然后根据这个流程一步步进行实施。
在配置InternalResourceViewResolver时,注意其prefix属性值的最后一定要有“/”。
AbstractController里面的handleRequest方法为什么被定义成final呢?模板方法模式:一个类自己一个方法调用自己的其他方法,而其他方法由子类来实现。不管内部调用的方法是怎样的流程,外部始终只与那个总的调用方法交互。
SimpleFormController处理两种请求:显示表单、处理表单提交。显示表单又可以分为两种情况:注册与编辑,对于注册的情况,表单内容应该为空,对于修改信息的情况,表单内容应该有数据。
formBackingObject总是会返回一个对象的,这个对象就是用于填充表单的,父类返回的对象中的值是空(即成员变量都为默认值),如果子类要返回一个带有信息的对象去填充表单(如编辑信息),那就应该覆盖这个方法。将对象的信息填充到表单中时会有一个问题,例如,int类型的成员变量的初始值为0,那么填充到表单中的信息是0,而不是空白字符串。所以,为了解决这个问题,有人将int改为Integer类型,这样,它的初始值就是null。
用下面的例子分析显示表单时,为什么也要绑定请求参数到formBackingObject方法返回的对象上。这需要设置bindOnNewForm属性
1.
<input type="text" name="email" />
服务器接受到第1个页的的访问请求后,将返回第2个页面供用户继续填写信息,
2.
String email = request.getParameter("email");
<input type="hidden" name="email" value="<%=email%>"
<input type="text" name="name" value=""/>
<input type="password" name="password" value=""/>
第2个页面中的隐藏字段的值是从第一个页面中获取的的请求参数。
采用formBackingObject,这个过程可以自动完成。
其实,可以直接在配置文件中使用SimpleFormController,而不用编写它的子类,也可以演示显示表单和校验的效果。
思考题:
AbstractController->AbstractFormController-->SimpleFormController,为什么总是父类干一半后,就留出一个方法让子类继续去干?这就体现了面向对象编程的多态性,这样可以出现完成各种功能的子类。
一个问题:如果存储到请求域中的属性名中有点(.),那就EL表达式中怎样访问这个属性对象?
request.setAttribute("error.email",new Errors());
${error.email}
没有找到答案,这可能是根本就不允许出现的规则。
问题:
1.对于SimpleFormController显示的表单,如果其提交方式是GET,将继续显示原来的表单,那能否显示出原来的表单数据呢?怎么做?用bindOnNewForm属性。
2.对于网上和书上介绍的spring的文件上传的例子,在上传大文件时,应该有问题,spring mvc中有没有不用字节数组的解决方案呢?