Spring 框架简介
本文档向您介绍如何使用 Spring 框架 构造简单的 Web MVC 应用程序。该应用程序使用户能够在一个文本字段中输入他的姓名,单击“确定”后,返回该姓名并且显示在具有欢迎问候的另一个页面上。
Spring 框架是一种流行的开源应用程序框架,可简化 J2EE 开发。它包括一个容器、一个用于管理组件的框架和一组针对 Web 用户界面、事务和持久性的咬接(snap-in)服务。Spring Web MVC 是 Spring 框架的一部分,它是用于创建 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 框架的更多信息,请访问 http://www.springframework.org。有关 Spring 框架工件的工作原理以及如何与应用程序中其他对象交互的更详细信息,请访问官方 Spring 框架参考文档 或参阅 Spring Framework API。
目录

要学习本教程,您需要使用以下软件和资源。
| NetBeans IDE |
Web 和 Java EE 版本 6.1 |
| Java Development Kit (JDK) |
版本 6 或版本 5 |
GlassFish 应用服务器 或 Tomcat servlet 容器 |
V2 版本 6.x |
注意:
- Web 和 Java EE 安装使您能够有选择地安装 GlassFish V2 应用服务器和 Apache Tomcat servlet 容器 6.0.x。您必须拥有一个在 IDE 中注册的服务器才能完成本教程。
- 如果需要将您的项目与工作解决方案相比较,则可以 下载示例应用程序。
建立具有 Spring Web MVC 支持的新项目
创建 Spring Web MVC 主干项目
从使用 Spring 框架为 Web 应用程序创建一个新项目开始:
- 从 IDE 的“文件”菜单中选择“新建项目”(Ctrl-Shift-N)。在“类别”下,选择“Web”。在“项目”下,选择“Web 应用程序”。单击“下一步”。
- 在“项目名称”中,键入 HelloSpring。从“服务器”下拉列表中,选择计划使用的服务器。保留所有其他设置为默认值不变,然后单击“下一步”。在第 3 步中“服务器和设置”中,对要使用的服务器进行任何更改,否则接受默认值。单击“下一步”。
- 在第 4 步“框架”面板中,选择“Spring Web MVC 2.5”:
当选择“Spring Web MVC 2.5”时,请注意,您可以在“配置”选项卡下配置 Spring dispatcher servlet 的名称和映射。如果单击“库”选项卡,请注意在创建项目过程中默认情况下将 JSTL 库添加到类路径中。
单击“完成”。IDE 为整个应用程序创建一个项目,包括所有元数据以及可以从“文件”窗口检查 (Ctrl-2) 的项目的 Ant 构建脚本。可以在“项目”窗口中查看模板结构 (Ctrl-1)。还要注意,默认情况下在 IDE 的“源编辑器”中打开四个文件:dispatcher-servlet.xml、applicationContext.xml、redirect.jsp 和 index.jsp。
运行主干项目
在对项目文件进行任何更改之前,尝试在 IDE 中运行新项目:
- 在“项目”窗口中,右键单击项目节点并选择“运行项目”(或按 F6)。IDE 将自动启动服务器(如果尚未运行)并将应用程序部署到该服务器上。该应用程序使用包含在 dispatcher-servlet.xml 中的配置数据运行。注意 IDE 的“输出”窗口中显示的任何输出 (Ctrl-4)。生成的输出将以 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 打开“新建文件”向导。在“类别”下,选择“Spring 框架”;在“文件类型”下,选择 Simple Form Controller。单击“下一步”。
- 将该类命名为 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 并选择“重构”>“封装字段”。将显示“封装字段”对话框:
注意将创建 getValue() 和 setValue() 方法并且可见性设置为 public。单击“重构”。这两个方法便添加到 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) 来修复导入错误。向文件顶部添加以下导入语句:
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" />
- 在 dispatcher-servlet.xml 中注册 HelloController。在“源编辑器”中打开 dispatcher-servlet.xml 并输入以下 bean 声明:
<bean class="controller.HelloController" p:helloService-ref="helloService"/>
IDE 中的 Spring 支持包括 XML 配置文件中 Java 类以及 bean 引用的代码完成。要调用代码完成,在“源编辑器”中工作时按 Ctrl-空格键:

实现视图
要实现该项目的视图,您需要创建两个 JSP 类。首先,您将调用 nameView.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 就是这样。这可能就是由 dispatcher-servlet.xml 中的以下 bean 定义提供的 Spring 的几个魔力:
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
此 bean 负责自动为在该文件中注册的所有控制器创建 URL 映射。它获取控制器的全限定类名(本例中为 controller.HelloController)并且分散读写包名称和 Controller 后缀,然后将结果用作 URL 映射。因此,对于 HelloController 而言,它创建了一个 hello.htm 映射。但是,此魔力并不适合于 Spring 框架中包含的控制器,如 ParameterizableViewController。它们需要显式映射。
- 在“项目”窗口中,右键单击该项目节点并选择“运行”(F6)。这将编译、部署和运行该项目。您的默认浏览器应该打开,并且将 hello.htm 显示为项目的 nameView:
在文本字段中输入您的名字,然后单击 Enter。将显示带有问候消息的 helloView:

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