blob: f9af4852e0afab683ffe6b3893b6fae50401b5ba [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="author" content="troy.giunipero@sun.com">
<meta name="description" content="An introduction to using the Spring Framework
in NetBeans IDE 6.9">
<meta name="keywords" content="NetBeans, IDE, integrated development environment,
Spring framework, frameworks, MVC, Model View Controller, web application">
<link rel="stylesheet" type="text/css" href="../../../netbeans.css">
<title>Spring Web MVC 简介 - NetBeans IDE 6.9 教程</title>
</head>
<body>
<!--
Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
-->
<h1>Spring Web MVC 简介</h1>
<p>本文档向您介绍如何使用 <a href="http://www.springframework.org/">Spring Framework</a> 构造简单的 Web <a href="http://java.sun.com/developer/technicalArticles/javase/mvc/index.html">MVC</a> 应用程序。该应用程序使用户能够在一个文本字段中输入他的姓名,单击“确定”后,返回该姓名并且显示在具有欢迎问候的另一个页面上。</p>
<p>Spring Framework 是一种流行的开源应用程序框架,可简化 Java EE 开发。它包括一个容器、一个用于管理组件的框架和一组针对 Web 用户界面、事务和持久性的咬接(snap-in)服务。Spring Web MVC 是 Spring Framework 的一部分,它是用于创建 Web 应用程序的可扩展 MVC 框架。</p>
<p>IDE 提供了内置的 Spring Framework 3.0 和 2.5 支持。框架库与 IDE 打包在一起,并且在选择框架时,会自动添加到项目类路径中。提供配置设置,如 Spring Web MVC <code>DispatcherServlet</code> 的命名和映射。也可以选择在项目创建时注册 JSTL 库。此外,还提供了对 Spring XML Bean 配置文件的支持,包括以下功能:</p>
<ul>
<li><strong>代码完成</strong>。在 Spring XML 配置文件中调用,用于 Java 类和 bean 引用。</li>
<li><strong>导航</strong>。在 Spring bean 定义中提到的 Java 类和属性的超级链接以及到其他 Spring bean 引用的超级链接。</li>
<li><strong>重构</strong>。在 Spring XML 配置文件中重命名对 Java 类的引用。</li>
</ul>
<p>有关 Spring Framework 的详细信息,请访问 <a href="http://www.springsource.org/">http://www.springsource.org/</a>。有关 Spring Framework 工件的工作原理以及如何与应用程序中其他对象交互的更详细信息,请参见正式的 <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/">Spring Framework 参考文档</a>或参阅 <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/">Spring Framework API 文档</a></p>
<p><strong>目录</strong></p>
<p><img src="../../../images_www/articles/69/netbeans-stamp.gif" class="stamp"
title="本页上的内容适用于 NetBeans IDE 6.9" width="114" height="114"
alt="本页上的内容适用于 NetBeans IDE 6.9" /></p>
<ul class="toc">
<li><a href="#setting">建立具有 Spring Web MVC 支持的新项目</a>
<ul>
<li><a href="#creating">创建 Spring Web MVC 框架项目</a></li>
<li><a href="#running">运行框架项目</a></li>
</ul></li>
<li><a href="#overview">应用程序概述</a></li>
<li><a href="#service">实现服务</a></li>
<li><a href="#controller">实现控制器和模型</a></li>
<li><a href="#view">实现视图</a></li>
<li><a href="#seeAlso">另请参见</a></li>
</ul>
<p><strong>要学完本教程,您需要具备以下软件和资源。</strong></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">软件或资源</th>
<th class="tblheader" scope="col">要求的版本</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">版本 6.9 Java</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Development Kit (JDK)</a></td>
<td class="tbltd1">版本 6</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://glassfish.dev.java.net/public/downloadsindex.html">GlassFish Server Open Source Edition</a></td>
<td class="tbltd1">3.0.1</td>
</tr>
</tbody>
</table>
<p><strong class="notes">注意:</strong></p>
<ul>
<li>Web 和 Java EE 安装允许您选择下载 GlassFish Server 3.0.1 并在 IDE 中对其进行注册。</li>
<li>如果需要将项目与工作解决方案进行比较,可以<a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%2520Web%252FHelloSpring69.zip">下载样例应用程序</a></li>
</ul>
<h2 id="setting">建立具有 Spring Web MVC 支持的新项目</h2>
<ul>
<li><a href="#creating">创建 Spring Web MVC 框架项目</a></li>
<li><a href="#running">运行框架项目</a></li>
</ul>
<div class="indent">
<h3 id="creating">创建 Spring Web MVC 框架项目</h3>
<p>首先,使用 Spring Framework 为 Web 应用程序创建一个新项目。</p>
<ol>
<li>从 IDE 的“文件”菜单中选择“新建项目”(Ctrl-Shift-N)。选择 &quot;Java Web&quot; 类别,然后在“项目”下选择“Web 应用程序”。单击“下一步”。</li>
<li>在“项目名称”中,键入 <strong>HelloSpring</strong>。单击“下一步”。</li>
<li>在步骤 3“服务器和设置”中,取消选择“启用上下文和依赖关系注入”选项,因为在本教程中将不使用 <a href="http://jcp.org/en/jsr/detail?id=299">JSR-299</a> 规范。
<br><br>
同时,确保在“服务器”下拉列表中选定 &quot;GlassFish Server 3.0.1&quot;,并请注意,&quot;Java EE 6 Web&quot; 是此服务器的缺省 EE 版本。单击“下一步”。</li>
<li>在步骤 4“框架”面板中,选择 &quot;Spring Web MVC&quot;。
<br>
<img src="../../../images_www/articles/71/web/spring/frameworks-window.png"
class="margin-around b-all"
title="“框架”面板中显示的 &quot;Spring Web MC&quot;"
alt="“框架”面板中显示的 &quot;Spring Web MVC&quot;">
<br>
选择 &quot;Spring Web MVC&quot; 时,请注意,缺省情况下 JSTL(JavaServer Pages Standard Tag Library,JavaServer Pages 标准标记库)库会在项目创建过程中添加到类路径。取消选择此选项(如以上屏幕快照中所示),因为本教程中不需要 JSTL。另请注意,您可以在 IDE 中将 Spring 2.5 库添加到项目中(如果需要)。</li>
<li>单击“配置”标签,并请注意,您可以在向导中指定 Spring 分发程序 Servlet 的名称和映射。
<br>
<img src="../../../images_www/articles/71/web/spring/spring-configuration.png"
title="在“配置”标签下指定 Spring 分发程序 Servlet 的名称和映射"
class="margin-around b-all" alt="Spring 配置选项"></li>
<li>单击“完成”。IDE 将为整个应用程序创建一个项目,包括所有 meta 数据以及可以从“文件”窗口(Ctrl-2 组合键;在 Mac 上为 &amp;#8984-2 组合键)中查看的项目的 Ant 生成脚本。可以从“项目”窗口(Ctrl-1 组合键;在 Mac 上为 &amp;#8984-1 组合键)中查看模板结构。另请注意,缺省情况下在 IDE 的编辑器中打开四个文件:<code>dispatcher-servlet.xml</code><code>applicationContext.xml</code><code>redirect.jsp</code><code>index.jsp</code></li>
<li>在“项目”窗口中,展开新项目的“库”节点,并请注意 Spring JAR 包含在项目的类路径中。
<br>
<img src="../../../images_www/articles/71/web/spring/spring-libraries.png"
title="Spring JAR 列在项目的“库”节点下"
class="margin-around b-all" alt="Spring JAR 列在项目的“库”节点下">
</li>
</ol>
<h3 id="running">运行框架项目</h3>
<p>在对项目文件进行任何更改之前,尝试在 IDE 中运行新项目:</p>
<ol>
<li>单击 IDE 主工具栏中的“运行项目”(<img src="../../../images_www/articles/71/web/spring/run-project-btn.png"
alt="“运行项目”按钮">)。IDE 将自动启动 GlassFish 服务器(如果尚未运行),编译项目,然后将其部署到该服务器。请注意 IDE“输出”窗口(Ctrl-4 组合键;在 Mac 上为 &amp;#8984-4 组合键)中显示的任何输出。生成的输出以“成功生成”<code></code>消息结尾。
<br>
<img src="../../../images_www/articles/71/web/spring/output.png"
alt="运行项目时“输出”窗口显示信息"
title="运行项目时“输出”窗口显示信息"
class="margin-around b-all">
<br>
IDE 的缺省浏览器将启动,并且您会看到欢迎页视图 (<code>/WEB-INF/jsp/index.jsp</code>) 的内容。
<br>
<img src="../../../images_www/articles/71/web/spring/browser-output.png"
class="margin-around b-all" width="668px"
title="欢迎页输出显示在浏览器中"
alt="浏览器中显示的欢迎页输出"></li>
</ol>
<p class="tips">在 IDE 中运行项目时,将编译项目并将其部署到服务器,然后在缺省浏览器中将其打开。此外,IDE 还提供“在保存时部署”功能,缺省情况下将为 Web 项目激活该功能。在编辑器中保存文件时,会自动重新编译项目并将其部署到服务器。要查看更改,只需在浏览器中刷新页面即可。</p>
<p>为了了解刚刚发生的情况,我们从检查项目的部署描述符 (<code>Web.xml</code>) 开始。要在源代码编辑器中打开该文件,请在“项目”窗口中右键单击 <code>WEB-INF</code> &gt; <code>Web.xml</code> 节点,然后选择“编辑”。应用程序的缺省入口点为 <code>redirect.jsp</code></p>
<div class="indent">
<pre class="examplecode">
&lt;welcome-file-list&gt;
&lt;welcome-file&gt;redirect.jsp&lt;/welcome-file&gt;
&lt;/welcome-file-list&gt;</pre>
</div>
<p><code>redirect.jsp</code> 中,有一个重定向语句,该语句将所有请求指向 <code>index.htm</code></p>
<div class="indent">
<pre class="examplecode">&lt;% response.sendRedirect(&quot;index.htm&quot;); %&gt;</pre>
</div>
<p>在部署描述符中,请注意,与 <code>*.htm</code> 匹配的 URL 模式的所有请求都被映射到 Spring 的 <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html"><code>DispatcherServlet</code></a></p>
<div class="indent">
<pre class="examplecode">
&lt;servlet&gt;
&lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt;
&lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;
&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt;
&lt;url-pattern&gt;*.htm&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;</pre>
</div>
<p class="tips">上面显示的分发程序 Servlet 的全限定名称为 <code>org.springframework.web.servlet.DispatcherServlet</code>。此类包含在创建项目时添加到项目类路径的 Spring 库中。您可以在“项目”窗口的“库”节点中向下浏览,以便对此进行验证。找到 <code>spring-webmvc-3.0.0.RELEASE.jar</code>,然后将其展开以查找 <code>org.springframework.web.servlet</code> &gt; <code>DispatcherServlet</code></p>
<p><code>DispatcherServlet</code> 根据 <code>dispatcher-servlet.xml</code> 中的配置设置处理传入请求。单击编辑器中的 <code>dispatcher-servlet.xml</code> 标签以将其打开。请注意以下代码。</p>
<div class="indent"
<pre class="examplecode">
&lt;bean id=&quot;urlMapping&quot; class=&quot;org.springframework.web.servlet.handler.<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/handler/SimpleUrlHandlerMapping.html">SimpleUrlHandlerMapping</a>&quot;&gt; &lt;property name=&quot;mappings&quot;&gt; &lt;props&gt; &lt;prop key=&quot;/index.htm&quot;&gt;indexController&lt;/prop&gt; &lt;/props&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id=&quot;viewResolver&quot; class=&quot;org.springframework.web.servlet.view.<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/view/InternalResourceViewResolver.html">InternalResourceViewResolver</a>&quot; p:prefix=&quot;/WEB-INF/jsp/&quot; p:suffix=&quot;.jsp&quot; /&gt; &lt;bean name=&quot;indexController&quot; class=&quot;org.springframework.web.servlet.mvc.<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/ParameterizableViewController.html">ParameterizableViewController</a>&quot; p:viewName=&quot;index&quot; /&gt;</pre>
</div>
<p>在该文件中定义了三个 Bean:<code>indexController</code><code>viewResolver</code><code>urlMapping</code>。当 <code>DispatcherServlet</code> 收到与 <code>*.htm</code> 匹配的请求(如 <code>index.htm</code>)时,它将在 <code>urlMapping</code> 中查找可以容纳该请求的控制器。从上面可以看出,有一个 <code>mappings</code> 属性将 <code>/index.htm</code> 链接到 <code>indexController</code></p>
<p>然后运行时环境将搜索名为 <code>indexController</code> 的 Bean 定义,该定义由框架项目提供。请注意,<code>indexController</code> 扩展了 <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/ParameterizableViewController.html"><code>ParameterizableViewController</code></a>。这是由 Spring 提供的另一个类,该类只返回一个视图。注意 <code>p:viewName=&quot;index&quot;</code> 指定逻辑视图名称,使用 <code>viewResolver</code> 通过加前缀 <code>/WEB-INF/jsp/</code> 以及加后缀 <code>.jsp</code> 来解析该名称。这将允许运行时环境在应用程序目录中查找该文件,并用欢迎页视图 (<code>/WEB-INF/jsp/index.jsp</code>) 进行响应。</p>
</div>
<h2 id="overview">应用程序概述</h2>
<p>您创建的应用程序由两个 JSP 页(在 <a href="http://java.sun.com/developer/technicalArticles/javase/mvc/index.html">MVC</a> 术语中称为“视图”<em></em>)组成。第一个视图包含一个 HTML 表单,该表单具有一个要求用户输入名字的输入字段。第二个视图是一个页面,该页面只显示包含用户名字的一个 hello 消息。</p>
<p>视图由控制器<em></em>管理,控制器接收应用程序的请求并确定返回的视图。它还向视图传递所需显示的任何信息(这称为模型<em></em>)。该应用程序的控制器名为 <code>HelloController</code></p>
<p>在复杂的 Web 应用程序中,业务逻辑不直接包含在控制器中。在控制器需要执行某些业务逻辑时,它会使用另一个名为“服务”<em></em>的实体。在我们的应用程序中,业务逻辑限制为处理 hello 消息的操作,出于此目的,您将创建 <code>HelloService</code><a name="service"></a>
<h2>实现服务</h2>
<p>确定正确设置环境之后,可以开始根据需要扩展框架项目。从创建 <code>HelloService</code> 类开始。</p>
<ol>
<li>单击 IDE 工具栏中的“新建文件”(<img src="../../../images_www/articles/71/web/spring/new-file-btn.png"
alt="“新建文件”按钮">) 按钮。(也可以按 Ctrl-N 组合键;在 Mac 上为 ⌘-N 组合键。)</li>
<li>选择 &quot;Java&quot;<strong></strong> 类别,然后选择“Java 类”<strong></strong>并单击“下一步”。</li>
<li>在显示的“新建 Java 类”向导中,为“类名”键入 <strong>HelloService</strong>,为“包”名输入 <strong>service</strong> 来为该类创建一个新包。</li>
<li>单击“完成”。IDE 将创建新类,并在编辑器中打开该类。</li>
</ol>
<p><code>HelloService</code> 类执行一个非常简单的服务。它将名称用作参数并准备返回一个包含该名称的 <code>String</code>。在编辑器中,为该类创建以下 <code>sayHello()</code> 方法(更改以<strong>粗体</strong>显示)。</p>
<div class="indent">
<pre class="examplecode">
public class HelloService {
<strong>public String sayHello(String name) {
return &quot;Hello &quot; + name + &quot;!&quot;;
}</strong>
}</pre></div>
<h2 id="controller">实现控制器和模型</h2>
<p>可以使用 <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html"><code>SimpleFormController</code></a> 来处理用户数据并确定返回的视图。</p>
<ol>
<li>按 Ctrl-N 组合键(在 Mac 上按 ⌘-N 组合键)打开“新建文件”向导。在“类别”下,选择 &quot;Spring Framework&quot;<strong></strong>;在“文件类型”下,选择“简单表单控制器”<strong></strong>
<br>
<img src="../../../images_www/articles/71/web/spring/simple-form-controller.png"
class="b-all margin-around" style="width:668px"
alt="“新建文件”向导 - &quot;Spring Framework&quot; 类别"
title="NetBeans IDE 为各种 Spring 工件提供了模板">
<br>
<span class="tips">NetBeans IDE 为各种 Spring 工件(包括 Spring XML 配置文件、<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/AbstractController.html"><code>AbstractController</code></a><a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html"><code>SimpleFormController</code></a>)提供了模板。</span>
</li>
<li>单击“下一步”。</li>
<li>将该类命名为 <strong>HelloController</strong> 并通过在“包”文本字段中键入 <strong>controller</strong> 为其创建一个新的包。单击“完成”。IDE 将创建新类,并在编辑器中打开该类。</li>
<li>通过取消注释 setter 方法(缺省情况下,在类模板中显示)来指定控制器属性。要取消注释代码片段,请突出显示该代码(如下图所示),然后按 Ctrl-/ 组合键(在 Mac 上为 &amp;#8984-/ 组合键)。
<br>
<img src="../../../images_www/articles/71/web/spring/comment-out.png"
class="b-all margin-around"
alt="编辑器中突出显示的代码片段"
title="突出显示代码片段,然后按 Ctrl-/ 组合键以开启/关闭注释">
<br>
<span class="tips">按 Ctrl-/ 组合键(在 Mac 上为 &amp;#8984-/ 组合键)可在编辑器中开启/关闭注释。</span>
</li>
<li>进行以下更改(以<strong>粗体</strong>显示)。
<pre class="examplecode">
public HelloController() {
<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/BaseCommandController.html#setCommandClass(java.lang.Class)">setCommandClass</a>(<strong>Name</strong>.class);
<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/BaseCommandController.html#setCommandName(java.lang.String)">setCommandName</a>(&quot;<strong>name</strong>&quot;);
<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setSuccessView(java.lang.String)">setSuccessView</a>(&quot;<strong>hello</strong>View&quot;);
<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setFormView(java.lang.String)">setFormView</a>(&quot;<strong>name</strong>View&quot;);
}</pre>
设置 <code>FormView</code> 使您能够设置用于显示表单的视图的名称。这是包含允许用户输入其名称的文本字段的页面。同样,设置 <code>SuccessView</code> 允许您设置在成功提交时应该显示的视图的名称。当设置 <code>CommandName</code> 时,在模型中定义命令的名称。在本例中,命令就是将请求参数绑定到自身的表单对象。设置 <code>CommandClass</code> 允许您设置命令类的名称。填充该类的一个实例并在每个请求上验证它。
<br><br>
注意在 <code>setCommandClass()</code> 方法中为 <code>Name</code> 标记了一个错误:
<br>
<img src="../../../images_www/articles/71/web/spring/set-command-class.png" class="b-all margin-around"
alt="显示 setCommandClass() 错误的编辑器"
title="为 setCommandClass() 显示的错误标记">
<br>
现在,您需要创建 <code>Name</code> 类作为简单 Bean 以包含每个请求的信息。</li>
<li>在“项目”窗口中,右键单击项目节点并选择“新建”&gt;“Java 类”。将显示“新建 Java 类”向导。</li>
<li>在“类名”中输入 <strong>Name</strong>,从“包”的下拉列表中选择 <strong>controller</strong></li>
<li>单击“完成”。<code>Name</code> 类随即创建,并在编辑器中打开。</li>
<li>对于 <code>Name</code> 类,创建一个名为 <code>value</code> 的字段,然后为该字段创建存取方法(即,getter 和 setter 方法)。首先声明 <code>value</code> 字段:
<pre class="examplecode">
public class Name {
<strong>private String value;</strong>
}</pre>
<p class="tips">要快速键入 &quot;<code>private</code>&quot;,您可以键入 &quot;<code>pr</code>&quot;,然后按 Tab 键。&quot;<code>private</code>&quot; 访问修饰符会自动添加到该行。这是使用编辑器代码模板的一个示例。要获得代码模板的完整列表,请选择“帮助”&gt;“快捷键列表”。</p>
<br><a name="createAccessors"></a>IDE 可以为您创建存取方法。在编辑器中,右键单击 <code>value</code>,然后选择“插入代码”(或按 Alt-Insert 组合键;在 Mac 上为 Ctrl-I 组合键)。在弹出式菜单中,选择“getter 和 setter”。
<br>
<img src="../../../images_www/articles/71/web/spring/generate-code.png"
class="margin-around b-all"
alt="编辑器中显示的生成代码弹出式菜单"
title="生成代码弹出式菜单允许您设置存取方法"></li>
<li>在显示的对话框中,选择 <code>value : String</code> 选项,然后单击“确定”。<code>getValue()</code><code>setValue()</code> 方法会添加到 <code>Name</code> 类中:
<pre class="examplecode">
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}</pre></li>
<li>按 Ctrl-Tab 组合键并选择 <code>HelloController</code> 以切换回 <code>HelloController</code> 类。请注意,以前的错误标记已经消失,因为现在存在 <code>Name</code> 类。删除 <code>doSubmitAction()</code> 方法并取消注释 <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setFormView(java.lang.String)"><code>onSubmit()</code></a> 方法。使用 <code>onSubmit()</code> 方法,您可以创建自己的 <code>ModelAndView</code>,此处需要这样做。进行以下更改:
<pre class="examplecode">@Override
protected ModelAndView onSubmit(Object command) throws Exception {
Name name = (Name)command;
ModelAndView mv = new ModelAndView(getSuccessView());
mv.addObject(&quot;helloMessage&quot;, helloService.sayHello(name.getValue()));
return mv;
}</pre>
如上所述,将 <code>command</code> 重塑为 <code>Name</code> 对象。创建 <code>ModelAndView</code> 的一个实例,并且在 <code>SimpleFormController</code> 中使用 getter 获取成功视图。最后,用数据填充模型。我们模型中的唯一项就是从以前创建的 <code>HelloService</code> 中获取的 hello 消息。使用 <code>addObject</code> 方法将此 hello 消息添加到名称 <code>helloMessage</code> 下的模型中。</li>
<li>在编辑器中单击鼠标右键并选择“修复导入”(Ctrl-Shift-I 组合键;在 Mac 上为 ⌘-Shift-I 组合键)以修复导入错误。
<br>
<img src="../../../images_www/articles/71/web/spring/fix-imports.png"
class="margin-around b-all" alt="“修复所有导入”对话框"
title="按 Ctrl-Shift-I 组合键以修复文件中的导入"></li>
<li>单击“确定”。向文件顶部添加以下导入语句:
<pre class="examplecode">import <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/ModelAndView.html">org.springframework.web.servlet.ModelAndView</a>;</pre>
如 API 文档中所述,此类“表示处理程序返回的要由 <code>DispatcherServlet</code> 解析的模型和视图。视图可以采用需要由 <code>ViewResolver</code> 对象解析的 <code>String</code> 视图名称格式;或者,也可以直接指定 <code>View</code> 对象。模型是一个 <code>Map</code>,允许使用按照名称键入的多个对象。”
<br><br>
请注意,此时并未修复所有错误,因为该类仍然无法识别 <code>HelloService</code> 类,也不能使用其 <code>sayHello()</code> 方法。</li>
<li><code>HelloController</code> 中,声明一个名为 <code>HelloService</code> 的私有字段。
<pre class="examplecode">private HelloService helloService;</pre>
然后为该字段创建一个公用的 setter 方法:
<pre class="examplecode">public void setHelloService(HelloService helloService) {
this.helloService = helloService;
}</pre>
最后,在编辑器中单击鼠标右键,然后选择“修复导入”(Ctrl-Shift-I 组合键;在 Mac 上为 ⌘-Shift-I 组合键)。以下语句将被添加到文件顶部:
<pre class="examplecode">import service.HelloService;</pre>
现在应该修复了所有错误。</li>
<li><code>applicationContext.xml</code> 中注册 <code>HelloService</code>。在编辑器中打开 <code>applicationContext.xml</code>,然后输入以下 Bean 声明:
<pre class="examplecode">
&lt;bean name=&quot;helloService&quot; class=&quot;service.HelloService&quot; /&gt;</pre>
<div class="tips">IDE 中的 Spring 支持包括 XML 配置文件中 Java 类以及 Bean 引用的代码完成。要调用代码完成,请在使用编辑器时按 Ctrl-空格键:
<br>
<img src="../../../images_www/articles/71/web/spring/code-completion.png"
alt="按 Ctrl-空格键时调用的代码完成"
title="按 Ctrl-空格键时调用的代码完成"
class="b-all margin-around"></div></li>
<li><code>dispatcher-servlet.xml</code> 中注册 <code>HelloController</code>。在编辑器中打开 <code>dispatcher-servlet.xml</code>,然后输入以下 Bean 声明:
<pre class="examplecode">
&lt;bean class=&quot;controller.HelloController&quot; p:helloService-ref=&quot;helloService&quot;/&gt;</pre></li>
</ol>
<h2 id="view">实现视图</h2>
<p>要实现此项目的视图,您需要创建两个 JSP 页。首先,您将调用 <code>nameView.jsp</code> 作为欢迎页,并且允许用户输入名称。另一个页面 <code>helloView.jsp</code> 显示包含输入名称的问候消息。首先创建 <code>helloView.jsp</code></p>
<ol>
<li id="create-jsp">在“项目”窗口中,右键单击 &quot;WEB-INF&quot; &gt; &quot;jsp<code></code>&quot; 节点,然后选择“新建”&gt; &quot;JSP&quot;。“新建 JSP 文件”向导打开。将该文件命名为 <strong>helloView</strong></li>
<li>单击“完成”。新的 JSP 页随即在 <code>jsp</code> 文件夹中创建,并在编辑器中打开。</li>
<li>在编辑器中,将文件标题更改为 <code>Hello</code>,并且更改输出消息以检索在 <code>HelloController</code> 中创建的 <code>ModelandView</code> 对象的 <code>helloMessage</code>
<pre class="examplecode">
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
&lt;title&gt;<strong>Hello</strong>&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;<strong>${helloMessage}</strong>&lt;/h1&gt;
&lt;/body&gt;
</pre></li>
<li>采用与<a href="#create-jsp">以上所述</a>相同的方式创建另一个 JSP 页,但将其命名为 <code>nameView</code></li>
<li>在编辑器中,将以下 Spring 标记库声明添加到 <code>nameView.jsp</code> 中。
<pre class="examplecode">&lt;%@taglib uri=&quot;http://www.springframework.org/tags&quot; prefix=&quot;spring&quot; %&gt;</pre>
这将导入 <a href="http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html">Spring 标记库</a>,它包含将视图作为 JSP 页实现时有用的标记。
<li><code>&lt;title&gt;</code><code>&lt;h1&gt;</code> 标记的内容更改为:<code>Enter Your Name</code></li>
<li><code>&lt;h1&gt;</code> 标记下面输入以下代码:
<pre class="examplecode">
&lt;spring:nestedPath path=&quot;name&quot;&gt;
&lt;form action=&quot;&quot; method=&quot;post&quot;&gt;
Name:
&lt;spring:bind path=&quot;value&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;${status.expression}&quot; value=&quot;${status.value}&quot;&gt;
&lt;/spring:bind&gt;
&lt;input type=&quot;submit&quot; value=&quot;OK&quot;&gt;
&lt;/form&gt;
&lt;/spring:nestedPath&gt;
</pre>
<a href="http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html#spring.tld.bind">spring:bind</a> 允许您绑定一个 bean 属性。绑定标记提供一个绑定状态和值,您可以将它用作输入字段的名称和值。采用这种方法提交表单时,Spring 将知道如何提取提交的值。此处,我们的命令类 (<code>controller.Name</code>) 具有一个 <code>value</code> 属性,因此将 <code>path</code> 设置为 <code>value</code>
<br><br>
<a href="http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html#spring.tld.nestedPath">spring:nestedPath</a> 使您能够在 Bean 前面加上指定的路径。因此,当与上面显示的 <code>spring:bind</code> 一起使用时,Bean 的路径变为:<code>name.value</code>。当再次调用时,<code>HelloController</code> 的命令名称为 <code>name</code>。因此,该路径引用该页面范围内名为 <code>name</code> 的 Bean 的 <code>value</code> 属性。
<li>更改应用程序的相对入口点。当前,项目入口点仍然为 <code>index.htm</code>,如上面的<a href="#running">运行框架项目</a>中所述,它重定向到 <code>WEB-INF/jsp/index.jsp</code>。当部署和运行项目时,可以指定项目的入口点。在“项目”窗口中,右键单击该项目节点并选择“属性”。将显示“项目属性”对话框。在“类别”下,选择“运行”。在“相对 URL”字段中,键入 <code>/hello.htm</code>,然后单击“确定”。
<br><br>
此时,您可能希望了解 <code>hello.htm</code><code>HelloController</code> 的映射所在的位置。您尚未添加到 <code>urlMapping</code> Bean 的映射,框架项目的欢迎页 <code>index.htm</code> 就是这样。这可能就是 Spring 的特殊魅力所在,它是由 <code>dispatcher-servlet.xml</code> 文件中的下列 bean 定义提供的:
<pre class="examplecode">&lt;bean class=&quot;org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping&quot;/&gt;</pre>
此 Bean 负责为文件中注册的所有控制器自动创建 URL 映射。它获取控制器的全限定类名(本例中为 <code>controller.HelloController</code>)并且去除读写包名称和 <code>Controller</code> 后缀,然后将结果用作 URL 映射。因此,对于 <code>HelloController</code> 而言,它创建了一个 <code>hello.htm</code> 映射。但是,此特点并不适于 Spring Framework 中包含的控制器,如 <code>ParameterizableViewController</code>。它们需要显式映射。</li>
<li>在“项目”窗口中,右键单击该项目节点并选择“运行”。这将编译、部署和运行该项目。您的缺省浏览器会打开,并且将 <code>hello.htm</code> 显示为项目的 <code>nameView</code>
<br>
<img src="../../../images_www/articles/71/web/spring/name-view.png"
alt="nameView 显示在浏览器中"
title="nameView 显示在浏览器中"
class="b-all margin-around">
<br>
在文本字段中输入您的名字,然后按 Enter 键。将显示带有问候消息的 <code>helloView</code>
<br>
<img src="../../../images_www/articles/71/web/spring/hello-view.png"
alt="helloView 显示在浏览器中"
title="helloView 显示在浏览器中"
class="b-all margin-around"></li>
</ol>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback: Introduction to Spring">请将您的意见和建议发送给我们</a></div>
<br style="clear:both;">
<h2 id="seeAlso">另请参见</h2>
<p>对 NetBeans IDE 中 Spring Framework 的简介到此结束。本文档演示了如何使用 Spring Framework 在 NetBeans IDE 中构建简单的 Web MVC 应用程序,并且向您介绍了用于开发 Web 应用程序的 IDE 界面。</p>
<p>建议您通过 NetBeans IDE 中的其他教程继续学习 Spring Framework,例如<a href="http://sites.google.com/site/springmvcnetbeans/step-by-step/">使用 NetBeans 和 GlassFish 服务器循序渐进开发 Spring Framework MVC 应用程序</a>。这是 Thomas Risberg 编写的官方 <a href="http://static.springframework.org/docs/Spring-MVC-step-by-step/">Spring Framework 教程</a>,Arulazi Dhesiaseelan 已针对 NetBeans IDE 对该教程进行了改编。</p>
<p>许多 Spring NetBeans Module 功能还适用不基于 Web 的 Spring Framework 应用程序。
<p>有关其他相关教程,请参见以下资源:</p>
<ul>
<li><a href="../../docs/web/framework-adding-support.html">添加对 Web 框架的支持</a>。此基本指南介绍如何通过使用 NetBeans Update Center 安装 Web 框架插件来添加支持。</li>
<li><a href="../../docs/web/jsf20-intro_zh_CN.html">JavaServer Faces 2.0 简介</a>。演示如何将 JSF 2.0 支持添加到现有项目中,连接受管 Bean,以及利用 Facelets 模板。</li>
</ul>
</body>
</html>