Spring Framework 简介
本文档向您介绍如何使用 Spring Framework 构造简单的 Web MVC 应用程序。该应用程序使用户能够在一个文本字段中输入他的姓名,单击“确定”后,返回该姓名并且显示在具有欢迎问候的另一个页面上。
Spring Framework 是一种流行的开源应用程序框架,可简化 J2EE 开发。它包括一个容器、一个用于管理组件的框架和一组针对 Web 用户界面、事务和持久性的咬接(snap-in)服务。Spring Web MVC 是 Spring Framework 的一部分,它是用于创建 Web 应用程序的可扩展 MVC 框架。
IDE 提供对 Spring Framework 2.5 内置支持。框架库与 IDE 打包在一起,并在选择框架后自动添加到项目类路径中。提供配置设置,如 Spring Web MVC DispatcherServlet 的命名和映射。自动注册 JSTL 库。还提供对 Spring XML bean 配置文件的支持,包括以下功能:
- 代码完成。在 Spring XML 配置文件中调用,用于 Java 类和 bean 引用。
- 导航。在 Spring bean 定义中提到的 Java 类和属性的超级链接以及到其他 Spring bean 引用的超级链接。
- 重构。在 Spring XML 配置文件中重命名对 Java 类的引用。
有关 Spring Framework 的更多信息,请访问 http://www.springframework.org。有关 Spring Framework 工件的工作原理以及如何与应用程序中其他对象交互的更多详细信息,请访问官方 Spring Framework 参考文档或参阅 Spring Framework API。
目录

要学习本教程,您需要具备以下软件和资源。
注意:
- 在执行 Web & Java EE 安装时,您可以选择安装 GlassFish(V2 或 V3)应用服务器和 6.0.18 版本的 Apache Tomcat Servlet 容器。必须安装其中一个(或在 IDE 中注册其他的服务器)才能学完本教程。
- 如果需要将项目与工作解决方案进行比较,可以下载样例应用程序。
建立具有 Spring Web MVC 支持的新项目
创建 Spring Web MVC 框架项目
从使用 Spring Framework 为 Web 应用程序创建一个新项目开始:
- 从 IDE 的“文件”菜单中选择“新建项目”(Ctrl-Shift-N)。在“类别”下,选择 "Java Web"。(如果您使用的是 NetBeans 6.1,请选择 "Web"。)在“项目”下,选择“Web 应用程序”。单击“下一步”。
- 在“项目名称”中,键入
HelloSpring。单击“下一步”。
- 在第 3 步“服务器和设置”中,从“服务器”下拉列表中选择您打算使用的服务器。保留所有其他设置为缺省值,然后单击“下一步”。
- 在第 4 步“框架”面板中,选择 "Spring Web MVC 2.5":
当选择 "Spring Web MVC 2.5" 时,请注意,您可以在“配置”标签下配置 Spring 分发程序 Servlet 的名称和映射。如果单击“库”标签,请注意在创建项目过程中缺省情况下 JSTL 库会添加到类路径中。
单击“完成”。IDE 为整个应用程序创建一个项目,包括所有 meta 数据以及可以从“文件”窗口检查 (Ctrl-2) 的项目的 Ant 构建脚本。可以在“项目”窗口中查看模板结构 (Ctrl-1)。还要注意,缺省情况下在 IDE 的源代码编辑器中打开四个文件:dispatcher-servlet.xml、applicationContext.xml、redirect.jsp 和 index.jsp。
运行框架项目
在对项目文件进行任何更改之前,尝试在 IDE 中运行新项目:
- 右键单击“项目”窗口中的项目节点,然后选择“运行项目”。IDE 将自动启动服务器(如果尚未运行)并将应用程序部署到该服务器上。该应用程序使用包含在
dispatcher-servlet.xml 中的配置数据运行。注意 IDE 的“输出”窗口中显示的任何输出(“窗口”>“输出”)。生成的输出将以 BUILD SUCCESSFUL 消息结束:
IDE 的缺省浏览器将启动,并且您会看到欢迎页视图 (/WEB-INF/jsp/index.jsp) 中的内容:

为了了解刚刚发生的情况,我们从检查项目的部署描述符 (Web.xml) 开始。要在源代码编辑器中打开该文件,请在“项目”窗口中右键单击 WEB-INF > Web.xml 节点,然后选择“编辑”。应用程序的缺省入口点为 redirect.jsp:
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
在 redirect.jsp 中,有一个重定向语句,该语句将所有请求指向 index.htm:
<% response.sendRedirect("index.htm"); %>
在部署描述符中,要注意与 *.htm 匹配的 URL 模式的所有请求都被映射到 Spring 的 DispatcherServlet:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
上面显示的 dispatcher Servlet 类为 org.springframework.Web.servlet.DispatcherServlet。该类包含在 Spring 库中,当创建项目时 Spring 库被添加到项目的类路径中。要验证此问题,请从“项目”窗口的“库”节点开始进行探究:

DispatcherServlet 根据 dispatcher-servlet.xml 中的配置设置处理传入请求。通过单击源代码编辑器中对应的标签来打开 dispatcher-servlet.xml。注意以下代码:
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/index.htm">indexController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<bean name="indexController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />
在该文件中定义了三个 Bean:indexController、viewResolver 和 urlMapping。当 DispatcherServlet 收到与 *.htm 匹配的请求(如 index.htm)时,它将在 urlMapping 中查找可以容纳该请求的控制器。从上面可以看出,有一个 mappings 属性将 /index.htm 链接到 indexController。
然后运行时环境将搜索名为 indexController 的 Bean 定义,该定义由框架项目提供。请注意,indexController 是 ParameterizableViewController 的扩展。这是由 Spring 提供的另一个类,该类只返回一个视图。注意 p:viewName="index" 指定逻辑视图名称,使用 viewResolver 通过加前缀 /WEB-INF/jsp/ 以及加后缀 .jsp 来解析该名称。这将允许运行时在应用程序的 WAR 文件中查找该文件并用欢迎页视图 (/WEB-INF/jsp/index.jsp) 进行响应。
应用程序概述
您创建的应用程序由两个 JSP 页组成(在 Spring Web MVC 术语中名为视图)。第一个视图包含一个 HTML 表单,该表单具有一个要求用户输入名字的输入字段。第二个视图是一个页面,该页面只显示包含用户名字的一个 hello 消息。
视图由控制器管理,控制器接收应用程序的请求并确定返回的视图。它还向视图传递所需显示的任何信息(这称为模型)。该应用程序的控制器名为 HelloController。
在复杂的 Web 应用程序中,业务逻辑不直接包含在控制器中。只要需要执行业务逻辑,控制器就会使用另一个名为服务的实体。在我们的应用程序中,业务逻辑是 hello 消息的计算,所以要为此创建一个 HelloService。
实现服务
确定正确设置环境之后,可以开始根据需要扩展框架项目。从创建 HelloService 类开始。
- 在“项目”窗口中,右键单击项目节点并选择“新建”>“Java 类”。
- 在显示的“新建 Java 类”向导中,为“类名”输入
HelloService,为“包名”键入 service 来为该类创建一个新包。单击“完成”。IDE 将创建一个新的类并在源代码编辑器中打开该类。另外请注意,“项目”窗口会自动更新以反映所进行的更改。
HelloService 类执行一个非常简单的服务。它将名称用作参数并准备返回一个包含该名称的 String。在源代码编辑器中,为类创建以下 sayHello() 方法(更改的内容以粗体显示):
public class HelloService {
public String sayHello(String name) {
return "Hello " + name + "!";
}
}
实现控制器和模型
可以使用 SimpleFormController 来处理用户数据并确定返回的视图。
- 按 Ctrl-N 组合键(在 Mac 上按 ⌘-N 组合键)打开“新建文件”向导。在“类别”下,选择 "Spring Framework";在“文件类型”下,选择“简单表单控制器”。单击“下一步”。
- 将该类命名为
HelloController 并通过在“包”文本字段中键入 controller 为其创建一个新的包。单击“完成”。IDE 将创建一个新的类并在源代码编辑器中打开该类。
- 通过取消注释 setter 方法(缺省情况下,在类模板中显示)来指定控制器属性。进行以下更改(更改的内容以粗体显示):
public HelloController() {
setCommandClass(Name.class);
setCommandName("name");
setSuccessView("helloView");
setFormView("nameView");
}
设置 FormView 使您能够设置用于显示表单的视图的名称。这是包含允许用户输入其名称的文本字段的页面。同样,设置 SuccessView 允许您设置在成功提交时应该显示的视图的名称。当设置 CommandName 时,在模型中定义命令的名称。在本例中,命令就是将请求参数绑定到自身的表单对象。设置 CommandClass 允许您设置命令类的名称。填充该类的一个实例并在每个请求上验证它。
注意在 setCommandClass() 方法中为 Name 标记了一个错误:
需要将 Name 类创建为一个包含每个请求的信息的简单 Bean。
- 在“项目”窗口中,右键单击项目节点并选择“新建”>“Java 类”。将显示“新建 Java 类”向导。为“类名”输入
Name,为“包”从下拉列表中选择 controller。单击“完成”。创建 Name 类,并在源代码编辑器中打开该类。
- 为
Name 类创建一个名为 value 的字段,然后为该字段创建存取方法。键入以下内容(更改的内容以粗体显示):
public class Name {
private String value;
IDE 可以为您创建存取方法。在源代码编辑器中,右键单击 value,然后选择“插入代码”(或按 Alt-Insert 组合键;在 Mac 上按 Ctrl-I 组合键)打开“生成代码”弹出式菜单。然后选择“Getter 和 Setter”。

- 在显示的对话框中,选择
value : String 选项,然后单击“确定”。getValue() 和 setValue() 方法会添加到 Name 类中:
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
- 单击返回到源代码编辑器中的
HelloController 并注意由于创建了 Name 类,以前的错误标记已经消失了。删除 doSubmitAction() 方法并取消注释 onSubmit() 方法。使用 onSubmit() 方法,您可以创建自己的 ModelAndView,此处需要这样做。进行以下更改:
@Override
protected ModelAndView onSubmit(Object command) throws Exception {
Name name = (Name)command;
ModelAndView mv = new ModelAndView(getSuccessView());
mv.addObject("helloMessage", helloService.sayHello(name.getValue()));
return mv;
}
如上所述,将 command 重塑为 Name 对象。创建 ModelAndView 的一个实例,并且在 SimpleFormController 中使用 getter 获取成功视图。最后,用数据填充模型。我们模型中的唯一项就是从以前创建的 HelloService 中获取的 hello 消息。使用 addObject 方法将此 hello 消息添加到名称 helloMessage 下的模型中。
- 通过在源代码编辑器中单击鼠标右键并选择“修复导入”(Ctrl-Shift-I;在 Mac 上是 ⌘-Shift-I) 来修复导入错误。向文件顶部添加以下导入语句:
import org.springframework.Web.servlet.ModelAndView;
但并未修复所有错误,因为该类仍然无法识别 HelloService 类,而且也无法利用其 sayHello() 方法。
- 在
HelloController 中,声明一个名为 HelloService 的私有字段。
private HelloService helloService;
然后为该字段创建一个公用的 setter 方法:
public void setHelloService(HelloService helloService) {
this.helloService = helloService;
}
最后,再次在源代码编辑器中单击鼠标右键,然后选择“修复导入”。注意向文件顶部添加以下语句:
import service.HelloService;
现在应该修复了所有错误。
- 在
applicationContext.xml 中注册 HelloService。在源代码编辑器中打开 applicationContext.xml 并输入以下 Bean 声明:
<bean name="helloService" class="service.HelloService" />
IDE 中的 Spring 支持包括 XML 配置文件中 Java 类以及 Bean 引用的代码完成。要调用代码完成,在源代码编辑器中工作时按 Ctrl-空格键:

- 在
dispatcher-servlet.xml 中注册 HelloController。在源代码编辑器中打开 dispatcher-servlet.xml 并输入以下 Bean 声明:
<bean class="controller.HelloController" p:helloService-ref="helloService"/>
实现视图
要实现该项目的视图,您需要创建两个 JSP 类。首先,您将调用 nameView.jsp 作为欢迎页面,并且允许用户输入名称。另一个页面 helloView.jsp 显示包含输入名称的问候消息。首先创建 helloView.jsp。
- 在“项目”窗口中,右键单击 "WEB-INF" >“jsp 节点”,然后选择“新建”> "JSP"。将打开“新建 JSP 文件”向导。将该文件命名为
helloView。单击“完成”。在 jsp 文件夹中创建一个新的 JSP 文件并在源代码编辑器中打开该文件。
- 在源代码编辑器中,将文件的标题更改为
Hello,更改输出消息以检索在 HelloController 中创建的 ModelandView 对象的 helloMessage:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello</title>
</head>
<body>
<h2>${helloMessage}</h2>
</body>
- 采用与上述方式相同的方式创建另一个 JSP 文件,但将其命名为
nameView。
- 在源代码编辑器中,将以下标记库声明添加到
nameView.JSP 中:
<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
这将导入 Spring 标记库,它包含将视图作为 JSP 页实现时有用的标记。
- 更改
<title> 和 <h2> 标记的内容以读取以下内容:Enter Your Name。
- 在
h2 标记下输入以下代码:
<spring:nestedPath path="name">
<form action="" method="post">
Name:
<spring:bind path="value">
<input type="text" name="${status.expression}" value="${status.value}">
</spring:bind>
<input type="submit" value="OK">
</form>
</spring:nestedPath>
spring:bind 允许您绑定一个 bean 属性。绑定标记提供一个绑定状态和值,您可以将它用作输入字段的名称和值。采用这种方法提交表单时,Spring 将知道如何提取提交的值。此处,我们的命令类 (controller.Name) 具有一个 value 属性,因此将 path 设置为 value。
spring:nestedPath 使您能够在 Bean 前面加上指定的路径。因此,当与上面显示的 spring:bind 一起使用时,Bean 的路径变为:name.value。当再次调用时,HelloController 的命令名称为 name。因此,该路径引用该页面范围内名为 name 的 Bean 的 value 属性。
- 更改应用程序的相对入口点。当前,项目入口点仍然为
index.htm,如上面的运行框架项目中所述,它重定向到 WEB-INF/jsp/index.jsp。当部署和运行项目时,可以指定项目的入口点。在“项目”窗口中,右键单击该项目节点并选择“属性”。将显示“项目属性”对话框。在“类别”下,选择“运行”。在“相对 URL”字段中,键入 /hello.htm,然后单击“确定”。
此时,您可能希望了解 hello.htm 到 HelloController 的映射所在的位置。您尚未添加到 urlMapping Bean 的映射,框架项目的欢迎页 index.htm 就是这样。这可能就是 Spring 的特殊魅力所在,它是由 dispatcher-servlet.xml 文件中的下列 bean 定义提供的:
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
此 bean 负责自动为在该文件中注册的所有控制器创建 URL 映射。它获取控制器的全限定类名(本例中为 controller.HelloController)并且去除读写包名称和 Controller 后缀,然后将结果用作 URL 映射。因此,对于 HelloController 而言,它创建了一个 hello.htm 映射。但是,此特点并不适于 Spring Framework 中包含的控制器,如 ParameterizableViewController。它们需要显式映射。
- 在“项目”窗口中,右键单击该项目节点并选择“运行”。这将编译、部署和运行该项目。您的缺省浏览器会打开,并且将
hello.htm 显示为项目的 nameView:
在文本字段中输入您的名字,然后按 Enter 键。将显示带有问候消息的 helloView:

另请参见
对 NetBeans IDE 中 Spring Framework 的介绍到此结束。本文档演示了如何使用 Spring Framework 在 NetBeans IDE 中构造一个简单的 Web MVC 应用程序,并且向您介绍了用于开发 Web 应用程序的 IDE 的界面。
建议您通过 NetBeans IDE 中的其他教程继续学习 Spring Framework,如 Developing a Spring Framework MVC Application Step-by-Step using NetBeans and GlassFish(使用 NetBeans 和 GlassFish 循序渐进开发 Spring Framework MVC 应用程序)。这是 Thomas Risberg 编写的官方 Spring Framework 教程,Arulazi Dhesiaseelan 已针对 NetBeans IDE 对该教程进行了改编。
许多 Spring NetBeans Module 功能还适用不基于 Web 的 Spring Framework 应用程序。
有关其他相关教程,请参见以下资源: