1.查看帮助文档,了解spring中提供了哪些自定义标签以及这些标签的用途与用法。通过实际的例子演示了如何使用<spring:message>来显示国际化的文本信息,如何使用<spring:bind>标签来显示对象及对象的属性信息。
2.<spring:bind>只能绑请求域中的对象信息,<spring:bind>生成status属性变量的类型为org.springframework.web.servlet.support.BindStatus,status属性变量只能在<spring:bind>标签对之间使用。查看org.springframework.web.servlet.tags.BindTag、org.springframework.web.servlet.support.BindStatus、org.springframework.web.servlet.support.RequestContext、org.springframework.validation.BindException的源文件,可以看到程序的处理路线为:BindTag创建BindStatus对象,BindStatus对象在构造方法中调用requestContext.getErrors(beanName, false)方法,getErrors方法调用getModelObject(BindException.ERROR_KEY_PREFIX + name)方法,getModelObject方法调用request.getAttribute(modelName),其中modelName就是BindException.ERROR_KEY_PREFIX + name的值,BindException.ERROR_KEY_PREFIX就是BindException的完整类名。通过分析这些源代码,得到一个结论:<spring:bind>标签实际上是在请求域取errors对象,errors对象的类型为org.springframework.validation.BindException,然后从errors对象中检索与path指定的对象或属性相关的错误,并且从errors对象中还可以检索出某个字段的值,即error对象中也包含了字段的信息。
3.讲解了SimpleFormController的作用:
显示表单
(1).handleRequest(HttpServletRequest request, HttpServletResponse response)
(2).handleRequestInternal(HttpServletRequest request,HttpServletResponse response)
(3).formBackingObject()
(4).initBinder()
可选:onBindOnNewForm(HttpServletRequest, Object, BindException)
(5).showForm()
(6).referenceData()
处理标单
(1).handleRequest(HttpServletRequest request, HttpServletResponse response)
(2).handleRequestInternal(HttpServletRequest request,HttpServletResponse response)
(3).formBackingObject()
(4).onBind(HttpServletRequest, Object, Errors)
(5).绑定数据
(6).onBindAndValidate()
(7).processFormSubmission()
校验无错
(8).onSubmit
(9).doSubmitAction
校验有错
(8).showForm
产生错误的一个小技巧:在Command对象中设计一个int类型的属性,在表单提交时,故意提交一个字符串,这样就会发生类型转换错误,回到FormView视图。
4.通过下面的程序,可以显示出错误信息的属性key与错误信息的对象类型,还可以显示出Command对象的属性key与Command对象的类型。
logon.jsp:
<FORM action="logon.html" method="POST">
<spring:bind path="wangzy.username">
<INPUT type="text" name="username" value="${status.value}">${status.errorMessage}
</spring:bind>
<INPUT type="password" name="password">
<INPUT type="submit" name="logon" value="<spring:message code="hello.title" arguments="wzy"/>">
</FORM>
<% Enumeration e = request.getAttributeNames();
while(e.hasMoreElements())
{
String attributeName = (String)e.nextElement();
out.println(attributeName + ":" +
request.getAttribute(attributeName).getClass().getName() + "<br>");
}
%>
将logon.jsp作为一个SimpleFormController的FormView,logon.html映射到这个SimpleFormController,第一次直接访问logon.html时,显示logon.jsp页面的内容,结果如下:
javax.servlet.forward.request_uri:java.lang.String
javax.servlet.forward.context_path:java.lang.String
javax.servlet.forward.servlet_path:java.lang.String
javax.servlet.forward.query_string:java.lang.String
wangzy:cn.itcast.mvc.UserCommand !!!!!
org.springframework.web.servlet.DispatcherServlet.THEME:org.springframework.web.servlet.theme.FixedThemeResolver
org.springframework.web.servlet.DispatcherServlet.CONTEXT:org.springframework.web.context.support.XmlWebApplicationContext
org.springframework.validation.BindException.wangzy:org.springframework.validation.BindException !!!!!!
org.springframework.web.servlet.DispatcherServlet.LOCALE:org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
从整个程序的执行结果中可以发现,无论失败后的form视图,还是成功视图,其中的request域中都包含有command对象和错误对象,Command对象的默认key为"command",但可以通过setCommandName方法修改。只要用了SimpleFormController,即使是第一次显示form视图,其中的request域中也包含了command对象和错误对象,只是他们的值都是初始值和空,这主要是为了让<spring:bind>能够有对象可绑,而不会出现错误。应该在下次有机会时,让学员们看看相关的源代码,以了解command对象和错误对象是如何绑定到request域中的。提示:在AbstractFormController或SimpleFormController源文件中查找request.setAttribute应该是最快的方式,我找了一下,好象没这么容易,看看是哪个工具类完成的,然后在工具类中找setAttribute。怪:我在spring源目录中搜索BindException这个词,怎么只搜索到包含有这个词文件名,而不在.java文件内容中搜索?
以前的对比实验结论:对于实现AbstractCommandController的Controller,它不会在request域中自动保存command对象和错误对象。
最后问了一个问题:在SimpleFormController的构造方法中编程设置FormView,在配置文件中也设置FormView属性,问哪个属性设置将起作用,结果回答正确的学员很少,他们就没想到setter方法肯定后于构造方法调用这个道理上来。
小知识:在什么情况下要将Command对象保存在Session域中,这可以通过setSessionForm方法来完成。
分享到:
相关推荐
Spring MVC的表单标签库极大地方便了开发者处理用户输入,提高了代码的可读性和可维护性。通过熟练掌握这些标签,我们可以创建出功能丰富的、具有良好用户体验的web应用。在实际项目中,结合使用Spring MVC的注解...
本书共计10章,分别介绍了快速搭建Spring Web应用、精通MVC结构、URL映射、文件上传与错误处理、创建Restful应用、保护应用、单元测试与验收测试、优化请求、将Web应用部署到云等内容,循序渐进地讲解了Spring MVC4...
Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...
spring mvc统一处理异常,通过@ControllerAdvice+@ExceptionHandler
Spring MVC还支持数据绑定,自动将请求参数绑定到Java对象,这极大地简化了表单提交的处理。对于验证,Spring MVC提供了BindingResult和Validator接口,用于校验模型数据的正确性。 另外,Spring MVC与Spring框架的...
三、Spring MVC核心流程图:描述了Spring MVC处理请求的流程,包括前端控制器接收请求,经过分发器分发给具体的控制器,然后由控制器处理业务逻辑,最后将结果返回给用户。 四、Spring MVC DispatcherServlet说明:...
6. **数据绑定与验证**:Spring MVC提供了数据绑定和验证功能,允许将表单数据自动绑定到Java对象,并进行校验,简化了业务逻辑处理。 7. **视图解析**:Spring MVC 4.0支持多种视图技术,如JSP、FreeMarker、...
7. **Form Handling**: Spring MVC 提供了强大的表单处理能力,包括自动数据绑定、数据校验等功能。通过@Valid可以进行数据验证,@RequestParam和@PathVariable用于获取请求参数。 8. **Interceptors**: 拦截器是...
这通常包括安装Java Development Kit (JDK)、配置IDE(如IntelliJ IDEA或Eclipse)、添加Spring MVC的相关依赖到构建工具(如Maven或Gradle)的pom.xml或build.gradle文件中。还需要配置Web应用服务器,比如Tomcat,...
10. **Conversion and Validation**: Spring MVC提供了数据转换和验证功能,如使用`@RequestParam`、`@PathVariable`注解自动转换参数,以及使用`@Valid`和`BindingResult`进行表单验证。 11. **Tiles or Layouts**...
11. **Validation**:Spring提供了数据验证机制,可以通过`@Valid`注解和Validator接口实现对表单数据的校验。 12. **Interceptor**:拦截器,允许在请求处理前后执行自定义逻辑,如日志记录、权限检查等。 13. **...
Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构,使开发者能够有效地分离业务逻辑、数据处理和用户界面。在"Spring MVC 4.2.3"版本中,我们看到了一系列的...
### Spring MVC 教程知识点详解 #### Spring Web MVC 框架简介 Spring Web MVC 是 Spring Framework 的一个重要组成部分,主要用于构建基于 Java 的 Web 应用程序。它提供了一个灵活且强大的 MVC 实现,使得开发者...
1.创建第一个 Spring MVC 程序案例 2.Spring MVC @RequestMapping 注解案例 3.Spring MVC 请求参数的获取案例 4.Spring MVC 域对象共享数据案例 5.Spring MVC @ModelAttribute 注解案例 ...15.Spring MVC 异常处理案例
Spring MVC 是一个强大的Java Web开发框架,它是Spring框架的一部分,专为构建高度可扩展和模块化的Web应用程序而设计。在2015年的版本中,Spring MVC 4已经相当成熟,提供了许多特性来简化开发流程并提高开发效率。...
这是一个基于Spring MVC、Mybatis和Spring框架实现的个人博客系统,涵盖了Web开发中的后端架构设计、数据库管理和前端展示等多个方面。以下将详细介绍这个系统的关键知识点: **1. Spring MVC** Spring MVC是Spring...