Spring的BaseCommandController继承自AbstractController。在看BaseCommandController之前先看他的继承类AbstractCommandController是如何实现
AbstractController的handleInternalRequest方法的:
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
Object command = getCommand(request);
ServletRequestDataBinder binder = bindAndValidate(request, command);
BindException errors = new BindException(binder.getBindingResult());
return handle(request, response, command, errors);
}
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
getCommand就是BaseCommandController中的方法。
protected Object getCommand(HttpServletRequest request) throws Exception {
return createCommand();
}
protected final Object createCommand() throws Exception {
if (this.commandClass == null) {
throw new IllegalStateException("Cannot create command without commandClass being set - " +
"either set commandClass or (in a form controller) override formBackingObject");
}
if (logger.isDebugEnabled()) {
logger.debug("Creating new command of class [" + this.commandClass.getName() + "]");
}
return BeanUtils.instantiateClass(this.commandClass);
}
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
createCommand创建了一个CommandClass的对象。
然后再看bindAndValidate方法:
protected final ServletRequestDataBinder bindAndValidate(HttpServletRequest request, Object command)
throws Exception {
ServletRequestDataBinder binder = createBinder(request, command);
BindException errors = new BindException(binder.getBindingResult());
if (!suppressBinding(request)) {
binder.bind(request);
onBind(request, command, errors);
if (this.validators != null && isValidateOnBinding() && !suppressValidation(request, command, errors)) {
for (int i = 0; i < this.validators.length; i++) {
ValidationUtils.invokeValidator(this.validators[i], command, errors);
}
}
onBindAndValidate(request, command, errors);
}
return binder;
}
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
这个方法首先创建了
DataBinder对象,然后,获取创建绑定对象时发生的错误。报错在errors。接下来绑定对象,调用onBind处理绑定事件;接下来应用Validator。然后调用onBindAndValidate来处理绑定和验证事件。最后返回binder。
处理完之后调用handle方法进行处理。
综上所述,AbstractCommandController具有两个功能:
1、将请求参数转换为Command对象。在该Controller中,我们设置一个object对象。然后BaseCommandController将请求的参数进行转换。如果请求参数有value值,就会调用object的的setValue对象来设置对象里的值。如果请求参数中有address.city.就会调用object中getAddress().setCity()方法来赋值。这个object可以是任意的object,唯一的要求就是这个object类没有参数。
2、对数据进行验证。在转换和验证时发生错误时,需要在handle(request, response, command,
errors)中进行处理。
分享到:
相关推荐
总的来说,Spring MVC Demo展示了如何设置和使用Spring MVC框架来处理Web请求,包括配置DispatcherServlet、创建控制器类以及与视图的交互。通过这个简单的实例,我们可以更好地理解Spring MVC的各个组件以及它们在...
Spring框架的Web MVC架构模式以其灵活性、可扩展性和强大的功能特性而著称。相较于Struts和WebWork等早期框架,Spring提供了更多样的选择和更简洁的开发方式,极大地提高了开发效率和代码质量。无论是对于初学者还是...
Spring 的 Web MVC 构架模式与 Struts 和 WebWork 有许多不同之处,例如: * Spring 的 Web MVC 构架模式提供了一个更加灵活的和可扩展的架构。 * Spring 的 Web MVC 构架模式可以使得开发者可以更容易地重用代码和...
本文档的翻译内容详细介绍了Spring MVC的核心概念、设计思想以及与其他框架如Struts和WebWork的区别。 1. **Spring MVC概述** Spring MVC框架是Spring应用架构的一部分,它不仅关注Web层,还提供了诸如bean配置、...
### Spring Web MVC框架知识点概述 #### 一、Spring Web MVC框架简介 ...综上所述,Spring Web MVC框架以其简洁的设计、强大的功能以及良好的可扩展性而受到广泛欢迎,是构建现代Java Web应用程序的首选工具之一。
Spring的Web MVC框架与其他轻量级应用框架如Struts和Webwork相比,具有更广泛的功能和更高的灵活性。 1. **组件概述** - **DispatcherServlet**:作为入口点,接收并分发HTTP请求,通过配置的映射来决定调用哪个...
`BaseCommandController`是Spring MVC中用于处理表单提交的控制器,它继承自`AbstractCommandController`,并提供了处理命令对象(Command Object)的基础功能。然而,Spring 3.0之后,推荐使用`@ModelAttribute`...
【Spring的Web MVC构架模式】是Spring框架中的核心组件,用于构建Web应用程序。Spring MVC设计的核心是一个称为DispatcherServlet的前端控制器,它负责接收HTTP请求并分发到相应的处理器。这种架构模式允许开发者将...
【Spring的Web MVC构架模式】是Spring框架中的核心组件之一,主要负责处理Web应用程序的模型、视图和控制器的交互。Spring MVC以其高度模块化和可配置性,为开发者提供了一种优雅的方式来构建Web应用。 1. **构架...
Spring的Web MVC架构模式是一种在Java开发中广泛使用的轻量级框架,用于构建高效、可测试和可维护的Web应用程序。该框架的核心是DispatcherServlet,它作为中央调度器,负责接收HTTP请求并将其转发给合适的处理器。...
本文将深入探讨Spring Web MVC框架的设计理念、特点以及与Struts和WebWork等其他框架的区别。 1. Spring构架模式概述: Spring作为一个全面的application framework,不仅提供Web支持,还涵盖了诸如bean配置、面向...
与传统的Struts和WebWork等框架相比,Spring的Web MVC更注重组件的解耦和重用,强调业务逻辑与表现层的分离。 1. **组件解耦和模块化** Spring Web MVC的核心组件是DispatcherServlet,它作为请求分发器,负责接收...
综上所述,Spring的Web MVC构架模式以其灵活性、模块化和对标准技术的友好支持,成为了构建现代企业级Web应用程序的首选框架之一。开发者可以根据具体项目需求,选择Spring MVC的各个部分,构建出高效、可维护的Web...
【Spring的Web MVC构架模式】是Spring框架的重要组成部分,主要负责处理Web应用程序中的用户请求。Spring MVC的设计理念是提供一种灵活且可扩展的架构,让开发者能够更好地分离业务逻辑和表示层,从而提高代码的可...
【Spring的Web MVC构架模式】是Spring框架的重要组成部分,主要设计用于构建高效、可测试且易于维护的Web应用程序。Spring MVC提供了一种基于模型-视图-控制器(MVC)架构模式的解决方案,旨在清晰地分离应用程序的...
【Spring的Web-MVC构架模式】是Spring框架的核心组件之一,主要负责处理Web应用程序的请求和响应。本文档对外文原文进行了翻译,探讨了Spring如何与其他轻量级应用框架如Struts和Webwork区分开,并阐述了Spring的...
总的来说,Spring的Web MVC模式以其灵活性、可扩展性和解耦特性,成为了Java Web开发中广泛采用的框架之一。它简化了Web应用的开发,提升了代码的可读性和可维护性,同时提供了与各种技术和工具的优秀集成。
为了适应复杂的应用场景,Spring提供了多种抽象控制器,如AbstractController、AbstractCommandController、MultiActionController、SimpleFormController和AbstractWizardFormController,允许开发者按需选择。...