`
逆风的香1314
  • 浏览: 1440605 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

11月19日spring mvc的表单处理的相关知识

阅读更多

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表单标签库

    Spring MVC的表单标签库极大地方便了开发者处理用户输入,提高了代码的可读性和可维护性。通过熟练掌握这些标签,我们可以创建出功能丰富的、具有良好用户体验的web应用。在实际项目中,结合使用Spring MVC的注解...

    精通Spring MVC 4

    本书共计10章,分别介绍了快速搭建Spring Web应用、精通MVC结构、URL映射、文件上传与错误处理、创建Restful应用、保护应用、单元测试与验收测试、优化请求、将Web应用部署到云等内容,循序渐进地讲解了Spring MVC4...

    Spring MVC jar包

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...

    spring mvc统一处理异常

    spring mvc统一处理异常,通过@ControllerAdvice+@ExceptionHandler

    最全最经典spring-mvc教程

    Spring MVC还支持数据绑定,自动将请求参数绑定到Java对象,这极大地简化了表单提交的处理。对于验证,Spring MVC提供了BindingResult和Validator接口,用于校验模型数据的正确性。 另外,Spring MVC与Spring框架的...

    Spring MVC 教程快速入门 深入分析

    三、Spring MVC核心流程图:描述了Spring MVC处理请求的流程,包括前端控制器接收请求,经过分发器分发给具体的控制器,然后由控制器处理业务逻辑,最后将结果返回给用户。 四、Spring MVC DispatcherServlet说明:...

    spring mvc 4.0

    6. **数据绑定与验证**:Spring MVC提供了数据绑定和验证功能,允许将表单数据自动绑定到Java对象,并进行校验,简化了业务逻辑处理。 7. **视图解析**:Spring MVC 4.0支持多种视图技术,如JSP、FreeMarker、...

    spring mvc

    7. **Form Handling**: Spring MVC 提供了强大的表单处理能力,包括自动数据绑定、数据校验等功能。通过@Valid可以进行数据验证,@RequestParam和@PathVariable用于获取请求参数。 8. **Interceptors**: 拦截器是...

    Spring MVC使用Demo

    这通常包括安装Java Development Kit (JDK)、配置IDE(如IntelliJ IDEA或Eclipse)、添加Spring MVC的相关依赖到构建工具(如Maven或Gradle)的pom.xml或build.gradle文件中。还需要配置Web应用服务器,比如Tomcat,...

    spring MVC .docx

    10. **Conversion and Validation**: Spring MVC提供了数据转换和验证功能,如使用`@RequestParam`、`@PathVariable`注解自动转换参数,以及使用`@Valid`和`BindingResult`进行表单验证。 11. **Tiles or Layouts**...

    Spring MVC 基础实例源码01

    11. **Validation**:Spring提供了数据验证机制,可以通过`@Valid`注解和Validator接口实现对表单数据的校验。 12. **Interceptor**:拦截器,允许在请求处理前后执行自定义逻辑,如日志记录、权限检查等。 13. **...

    Spring MVC 4.2.3

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构,使开发者能够有效地分离业务逻辑、数据处理和用户界面。在"Spring MVC 4.2.3"版本中,我们看到了一系列的...

    Spring mvc 教程

    ### Spring MVC 教程知识点详解 #### Spring Web MVC 框架简介 Spring Web MVC 是 Spring Framework 的一个重要组成部分,主要用于构建基于 Java 的 Web 应用程序。它提供了一个灵活且强大的 MVC 实现,使得开发者...

    SpringMVCDemo:Spring MVC 框架知识案例

    1.创建第一个 Spring MVC 程序案例 2.Spring MVC @RequestMapping 注解案例 3.Spring MVC 请求参数的获取案例 4.Spring MVC 域对象共享数据案例 5.Spring MVC @ModelAttribute 注解案例 ...15.Spring MVC 异常处理案例

    Mastering Spring MVC 4(2015.09)源码

    Spring MVC 是一个强大的Java Web开发框架,它是Spring框架的一部分,专为构建高度可扩展和模块化的Web应用程序而设计。在2015年的版本中,Spring MVC 4已经相当成熟,提供了许多特性来简化开发流程并提高开发效率。...

    Spring MVC + Mybatis+Spring实现的个人博客系统

    这是一个基于Spring MVC、Mybatis和Spring框架实现的个人博客系统,涵盖了Web开发中的后端架构设计、数据库管理和前端展示等多个方面。以下将详细介绍这个系统的关键知识点: **1. Spring MVC** Spring MVC是Spring...

Global site tag (gtag.js) - Google Analytics