<!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)。选择 "Java Web" 类别,然后在“项目”下选择“Web 应用程序”。单击“下一步”。</li> | |
<li>在“项目名称”中,键入 <strong>HelloSpring</strong>。单击“下一步”。</li> | |
<li>在步骤 3“服务器和设置”中,取消选择“启用上下文和依赖关系注入”选项,因为在本教程中将不使用 <a href="http://jcp.org/en/jsr/detail?id=299">JSR-299</a> 规范。 | |
<br><br> | |
同时,确保在“服务器”下拉列表中选定 "GlassFish Server 3.0.1",并请注意,"Java EE 6 Web" 是此服务器的缺省 EE 版本。单击“下一步”。</li> | |
<li>在步骤 4“框架”面板中,选择 "Spring Web MVC"。 | |
<br> | |
<img src="../../../images_www/articles/71/web/spring/frameworks-window.png" | |
class="margin-around b-all" | |
title="“框架”面板中显示的 "Spring Web MC"" | |
alt="“框架”面板中显示的 "Spring Web MVC""> | |
<br> | |
选择 "Spring Web MVC" 时,请注意,缺省情况下 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 上为 &#8984-2 组合键)中查看的项目的 Ant 生成脚本。可以从“项目”窗口(Ctrl-1 组合键;在 Mac 上为 &#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 上为 &#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> > <code>Web.xml</code> 节点,然后选择“编辑”。应用程序的缺省入口点为 <code>redirect.jsp</code>:</p> | |
<div class="indent"> | |
<pre class="examplecode"> | |
<welcome-file-list> | |
<welcome-file>redirect.jsp</welcome-file> | |
</welcome-file-list></pre> | |
</div> | |
<p>在 <code>redirect.jsp</code> 中,有一个重定向语句,该语句将所有请求指向 <code>index.htm</code>:</p> | |
<div class="indent"> | |
<pre class="examplecode"><% response.sendRedirect("index.htm"); %></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"> | |
<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></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> > <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"> | |
<bean id="urlMapping" class="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>"> <property name="mappings"> <props> <prop key="/index.htm">indexController</prop> </props> </property> </bean> <bean id="viewResolver" class="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>" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> <bean name="indexController" class="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>" p:viewName="index" /></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="index"</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>选择 "Java"<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 "Hello " + name + "!"; | |
}</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 组合键)打开“新建文件”向导。在“类别”下,选择 "Spring Framework"<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="“新建文件”向导 - "Spring Framework" 类别" | |
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 上为 &#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 上为 &#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>("<strong>name</strong>"); | |
<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>("<strong>hello</strong>View"); | |
<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>("<strong>name</strong>View"); | |
}</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>在“项目”窗口中,右键单击项目节点并选择“新建”>“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">要快速键入 "<code>private</code>",您可以键入 "<code>pr</code>",然后按 Tab 键。"<code>private</code>" 访问修饰符会自动添加到该行。这是使用编辑器代码模板的一个示例。要获得代码模板的完整列表,请选择“帮助”>“快捷键列表”。</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("helloMessage", 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"> | |
<bean name="helloService" class="service.HelloService" /></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"> | |
<bean class="controller.HelloController" p:helloService-ref="helloService"/></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">在“项目”窗口中,右键单击 "WEB-INF" > "jsp<code></code>" 节点,然后选择“新建”> "JSP"。“新建 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"> | |
<head> | |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | |
<title><strong>Hello</strong></title> | |
</head> | |
<body> | |
<h1><strong>${helloMessage}</strong></h1> | |
</body> | |
</pre></li> | |
<li>采用与<a href="#create-jsp">以上所述</a>相同的方式创建另一个 JSP 页,但将其命名为 <code>nameView</code>。</li> | |
<li>在编辑器中,将以下 Spring 标记库声明添加到 <code>nameView.jsp</code> 中。 | |
<pre class="examplecode"><%@taglib uri="http://www.springframework.org/tags" prefix="spring" %></pre> | |
这将导入 <a href="http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html">Spring 标记库</a>,它包含将视图作为 JSP 页实现时有用的标记。 | |
<li>将 <code><title></code> 和 <code><h1></code> 标记的内容更改为:<code>Enter Your Name</code>。</li> | |
<li>在 <code><h1></code> 标记下面输入以下代码: | |
<pre class="examplecode"> | |
<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> | |
</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"><bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/></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&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> |