blob: 6be634c70c276c7878691660cd7ca2c335d63f14 [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="description" content="An introduction to using the Spring Framework
in NetBeans IDE">
<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>Introduction to Spring Web MVC - NetBeans IDE Tutorial</title>
</head>
<body>
<!--
Copyright (c) 2009, 2010, 2011, Oracle and/or its affiliates. All rights reserved.
-->
<h1>Introduction to Spring Web MVC</h1>
<p>This document shows you how to construct a simple web
<a href="http://www.oracle.com/technetwork/articles/javase/index-142890.html">MVC</a>
application using the <a href="http://www.springframework.org/">Spring Framework</a>. The
application enables a user to enter her name in a text field, and upon clicking OK, the
name is returned and displayed on a second page with a welcome greeting.</p>
<p>The Spring Framework is a popular open source application framework that can make
Java EE development easier. It consists of a container, a framework for managing
components, and a set of snap-in services for web user interfaces, transactions,
and persistence. A part of the Spring Framework is Spring Web MVC, an extensible MVC
framework for creating web applications.</p>
<p>The IDE provides built-in support for Spring Framework 3.0 and 2.5. Framework libraries
are packaged with the IDE and are automatically added to the project classpath
when the framework is selected. Configuration settings are provided, such as
naming and mapping of the Spring Web MVC <code>DispatcherServlet</code>. The JSTL
library can optionally be registered upon project creation. Support for Spring XML
bean configuration files is also provided, including the following functionality:</p>
<ul>
<li><strong>Code completion</strong>. Invoked in Spring XML configuration files
for Java classes as well as bean references.</li>
<li><strong>Navigation</strong>. Hyperlinking of Java classes and properties
mentioned in Spring bean definitions, as well as hyperlinking to other
Spring bean references.</li>
<li><strong>Refactoring</strong>. Renaming of references to Java classes in
Spring XML configuration files.</li>
</ul>
<p>For more information on the Spring Framework, visit
<a href="http://www.springsource.org/">http://www.springsource.org/</a>.
For a more fine-grained explanation of how Spring Framework artifacts behave
and interact with other objects in an application, see the official
<a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/">Spring
Framework Reference Documentation</a>, or consult the
<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/">Spring
Framework API documentation</a>.</p>
<p><strong>Contents</strong></p>
<img src="../../../images_www/articles/69/netbeans-stamp-69-70-71.png" class="stamp" width="114" alt="Content on this page applies to NetBeans IDE 6.9, 7.0 and 7.1" title="Content on this page applies to the NetBeans IDE 6.9, 7.0 and 7.1" />
<ul class="toc">
<li><a href="#setting">Setting up a New Project with Spring Web MVC Support</a>
<ul>
<li><a href="#creating">Creating a Spring Web MVC Skeleton Project</a></li>
<li><a href="#running">Running the Skeleton Project</a></li>
</ul></li>
<li><a href="#overview">Overview of the Application</a></li>
<li><a href="#service">Implementing a Service</a></li>
<li><a href="#controller">Implementing the Controller and Model</a></li>
<li><a href="#view">Implementing the Views</a></li>
<li><a href="#seeAlso">See Also</a></li>
</ul>
<p><strong>To complete this tutorial, you need the following software and resources.</strong></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software or Resource</th>
<th class="tblheader" scope="col">Version Required</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans
IDE</a></td>
<td class="tbltd1">6.8, 6.9, 7.0, 7.1, Java</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Development Kit (JDK)</a></td>
<td class="tbltd1">version 6</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://glassfish.dev.java.net/public/downloadsindex.html">GlassFish server</a></td>
<td class="tbltd1">Open Source Edition 3.x</td>
</tr>
</tbody>
</table>
<p><strong class="notes">Notes:</strong></p>
<ul>
<li>The Java installation of the IDE enables you to optionally install and register the GlassFish server with the IDE.</li>
<li>If you need to compare your project with a working solution, you can
<a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%2520Web%252FHelloSpring69.zip">download
the sample application</a>.</li>
</ul>
<h2 id="setting">Setting up a New Project with Spring Web MVC Support</h2>
<ul>
<li><a href="#creating">Creating a Spring Web MVC Skeleton Project</a></li>
<li><a href="#running">Running the Skeleton Project</a></li>
</ul>
<div class="indent">
<h3 id="creating">Creating a Spring Web MVC Skeleton Project</h3>
<p>Start by creating a new project for a web application using the Spring Framework.</p>
<ol>
<li>Choose New Project (Ctrl-Shift-N; &#8984-Shift-N on Mac) from the IDE's File menu. Select the Java Web
category, then under Projects select Web Application. Click Next.</li>
<li>In Project Name, type in <strong>HelloSpring</strong>. Click Next.</li>
<li>In Step 3: Server and Settings, deselect the Enable Contexts and Dependency
Injection option, as you are not working with the <a href="http://jcp.org/en/jsr/detail?id=299">JSR-299</a>
specification in this tutorial.
<br><br>
Also, ensure that the GlassFish server is selected in the Server drop-down list,
and note that Java EE 6 Web is the default EE version for this server.
Click Next.</li>
<li>In Step 4, the Frameworks panel, select Spring Web MVC.
<br>
<img src="../../../images_www/articles/71/web/spring/frameworks-window.png"
class="margin-around b-all"
title="Spring Web MVC displayed in the Frameworks panel"
alt="Spring Web MVC displayed in the Frameworks panel">
<p>
When you select Spring Web MVC, note that the JSTL (JavaServer Pages Standard
Tag Library) library is added to the classpath during project creation by default.
Deselect this option (as in the above screenshot), since you do not require JSTL
for this tutorial. Also, note that the IDE enables you to add the Spring 2.5 library
to your project, if this is your preference.</p></li>
<li>Click the Configuration tab and note that the wizard enables you to specify
the name and mapping of the Spring Dispatcher servlet.
<br>
<img src="../../../images_www/articles/71/web/spring/spring-configuration.png"
title="Specify the name and mapping of the Spring Dispatcher servlet under the Configuration tab"
class="margin-around b-all" alt="Spring configuration options"></li>
<li>Click Finish. The IDE creates a project for the entire application, including
all metadata, as well as the project's Ant build script which you can inspect
from the Files window (Ctrl-2; &#8984-2 on Mac). You can view the template
structure from the Projects window (Ctrl-1; &#8984-1 on Mac). Also note that
four files open by default in the IDE's editor: <code>dispatcher-servlet.xml</code>,
<code>applicationContext.xml</code>, <code>redirect.jsp</code>, and <code>index.jsp</code>.</li>
<li>In the Projects window, expand the new project's Libraries node and note that
the Spring JARs are included in the project's classpath.
<br>
<img src="../../../images_www/articles/71/web/spring/spring-libraries.png"
title="Spring JARs are listed under the project's Libraries node"
class="margin-around b-all" alt="Spring JARs listed under project's Libraries node">
</li>
</ol>
<h3 id="running">Running the Skeleton Project</h3>
<p>Before making any changes to project files, try running the new project in the
IDE:</p>
<ol>
<li>Click the Run Project (
<img src="../../../images_www/articles/71/web/spring/run-project-btn.png"
alt="Run Project button"> ) in the IDE's main toolbar. The IDE automatically
starts the GlassFish server if it is not already running, compiles the project,
then deploys it to the server. Note any output displayed in the IDE's Output
window (Ctrl-4; &#8984-4 on Mac). The generated output completes with a
<code>BUILD SUCCESSFUL</code> message.
<br>
<img src="../../../images_www/articles/71/web/spring/output.png"
alt="Output window displaying information when running the project"
title="Output window displays information when running the project"
class="margin-around b-all">
<br>
The IDE's default browser starts up, and you see content from the
welcome page view (<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="668"
title="Welcome page output is displayed in browser"
alt="Welcome page output displayed in browser"></li>
</ol>
<p class="tips">When you run your project in the IDE, the project is compiled and deployed
to the server, and then opens in your default browser. Furthermore, the IDE
provides a Deploy on Save feature, which is activated by default for web
projects. When you save files in the editor, your project is automatically
recompiled and deployed to the server. To view changes, you can simply
refresh pages in your browser.</p>
<p>In order to understand what just took place, start by examining the project's
deployment descriptor (<code>web.xml</code>). To open this file in the Source
Editor, right-click the <code>WEB-INF</code> &gt; <code>web.xml</code> node in the
Projects window and choose Edit. The default entry point for the application
is <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>Within <code>redirect.jsp</code>, there is a redirect statement that points all
requests to <code>index.htm</code>:</p>
<div class="indent">
<pre class="examplecode">&lt;% response.sendRedirect(&quot;index.htm&quot;); %&gt;</pre>
</div>
<p>In the deployment descriptor, note that all requests for URL patterns that
match <code>*.htm</code> are mapped to Spring's
<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">The fully qualified name of the dispatcher servlet, as shown above,
is <code>org.springframework.web.servlet.DispatcherServlet</code>. This
class is contained in the Spring library, which was added to the project
classpath when the project was created. You can verify this in the Projects
window by drilling down from the Libraries node. Locate the <code>spring-webmvc-3.0.0.RELEASE.jar</code>,
then expand it to find <code>org.springframework.web.servlet</code> &gt;
<code>DispatcherServlet</code>.</p>
<p>The <code>DispatcherServlet</code> handles incoming requests based on configuration
settings found in <code>dispatcher-servlet.xml</code>. Open <code>dispatcher-servlet.xml</code>
by clicking on its tab in the editor. Note the following 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>Three beans are defined in this file: <code>indexController</code>, <code>viewResolver</code>,
and <code>urlMapping</code>. When the <code>DispatcherServlet</code> receives a
request that matches <code>*.htm</code> such as <code>index.htm</code>, it looks
for a controller within <code>urlMapping</code> that can accommodate the request.
Above, you see that there is a <code>mappings</code> property that links <code>/index.htm</code>
to <code>indexController</code>.</p>
<p>The runtime environment then searches for the definition of a bean named <code>indexController</code>,
which is conveniently provided by the skeleton project. Note that <code>indexController</code>
extends <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/ParameterizableViewController.html"><code>ParameterizableViewController</code></a>.
This is another class provided by Spring, which simply returns a view. Above, note that
<code>p:viewName=&quot;index&quot;</code> specifies the logical view name, which is resolved
using the <code>viewResolver</code> by prepending <code>/WEB-INF/jsp/</code> and appending
<code>.jsp</code> to it. This allows the runtime to locate the file within the application
directory, and respond with the welcome page view (<code>/WEB-INF/jsp/index.jsp</code>).</p>
</div>
<h2 id="overview">Overview of the Application</h2>
<p>The application you create is comprised of two JSP pages (which can be referred to as <em>views</em>
in <a href="http://www.oracle.com/technetwork/articles/javase/index-142890.html">MVC</a>
terminology). The first view contains an HTML form with an input field asking for the user's
name. The second view is a page that simply displays a hello message containing the user's name.</p>
<p>The views are managed by a <em>controller</em>, which receives requests to the application
and decides which views to return. It also passes to the views any information that they
need to display (this is called a <em>model</em>). This application's controller is named
<code>HelloController</code>.</p>
<p>In a complex web application, the business logic is not contained directly in the controller.
Instead, another entity, named a <em>service</em>, is used by the controller whenever it
needs to perform some business logic. In our application, the business logic is limited to
the act of processing the hello message, and for this purpose you create a <code>HelloService</code>.
<a name="service"></a>
<h2>Implementing a Service</h2>
<p>Now that you are sure your environment is set up properly, you can begin
extending the skeleton project according to your needs. Start by creating
the <code>HelloService</code> class.</p>
<ol>
<li>Click the New File (
<img src="../../../images_www/articles/71/web/spring/new-file-btn.png"
alt="New File button"> ) button in the IDE's toolbar. (Alternatively, press Ctrl-N;
&#8984;-N on Mac.)</li>
<li>Select the <strong>Java</strong> category, then select <strong>Java Class</strong>
and click Next.</li>
<li>In the New Java Class wizard that displays, type in <strong>HelloService</strong>
for Class Name, and enter <strong>service</strong> for Package Name to create
a new package for the class.</li>
<li>Click Finish. The IDE creates the new class and opens it in the editor.</li>
</ol>
<p>The <code>HelloService</code> class performs a very simple service. It takes a name
as a parameter, and prepares and returns a <code>String</code> that includes the name.
In the editor, create the following <code>sayHello()</code> method for the
class (changes in <strong>bold</strong>).</p>
<div class="indent">
<pre class="examplecode">
public class HelloService {
<strong>public static String sayHello(String name) {
return &quot;Hello &quot; + name + &quot;!&quot;;
}</strong>
}</pre></div>
<h2 id="controller">Implementing the Controller and Model</h2>
<p>You can use 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>
to handle user data and determine which view to return.</p>
<ol>
<li>Open the New File wizard by pressing Ctrl-N (&#8984;-N on Mac). Under Categories
select <strong>Spring Framework</strong>; under File Types select <strong>Simple
Form Controller</strong>.
<br>
<img src="../../../images_www/articles/71/web/spring/simple-form-controller.png"
class="b-all margin-around" style="width:668px"
alt="New File wizard - Spring Framework category"
title="NetBeans IDE provides templates for various Spring artifacts">
<br>
<span class="tips">NetBeans IDE provides templates for various Spring artifacts,
including the Spring XML Configuration File, the
<a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/mvc/AbstractController.html"><code>AbstractController</code></a>,
and the <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>Click Next.</li>
<li>Name the class <strong>HelloController</strong> and create a new package for it by
typing <strong>controller</strong> in the Package text field. Click Finish. The IDE
creates the new class and opens it in the editor.</li>
<li>Specify controller properties by uncommenting the setter methods that display by
default in the class template. To uncomment the code snippet, highlight the code
as in the image below, then press Ctrl-/ (&#8984-/ on Mac).
<br>
<img src="../../../images_www/articles/71/web/spring/comment-out.png"
class="b-all margin-around"
alt="Code snippet highlighted in editor"
title="Highlight code snippets, then press Ctrl-/ to toggle comments">
<br>
<span class="tips">Pressing Ctrl-/ (&#8984-/ on Mac) toggles comments in the editor.</span>
</li>
<li>Make changes as follows (shown in <strong>bold</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>
<p>Setting the <code>FormView</code> enables you to set the name of the view that
is used to display the form. This is the page that contains the text field
allowing users to enter their name. Setting the <code>SuccessView</code> likewise
lets you set the name of the view that should display upon a successful submit.
When you set the <code>CommandName</code> you define the name of the command in
the model. In this case, the command is the form object with request parameters
bound onto it. Setting the <code>CommandClass</code> allows you set the name of the
command class. An instance of this class gets populated and validated upon each
request.</p>
<p>Note that an error is flagged for <code>Name</code> in the <code>setCommandClass()</code> method:</p>
<img src="../../../images_www/articles/71/web/spring/set-command-class.png" class="b-all margin-around"
alt="The editor displaying an error for setCommandClass()"
title="An error badge displays for setCommandClass()">
<p>
You now need to create the <code>Name</code> class as a simple bean to hold information
for each request.</p></li>
<li>In the Projects window, right-click on the project node and choose New &gt; Java
Class. The New Java Class wizard displays.</li>
<li>Enter <strong>Name</strong> for the Class Name, and for Package select <strong>controller</strong>
from the drop-down list.</li>
<li>Click Finish. The <code>Name</code> class is created and opens in the editor.</li>
<li>For the <code>Name</code> class, create a field named <code>value</code>, then create
accessor methods (i.e., getter and setter methods) for this field. Start by declaring
the <code>value</code> field:
<pre class="examplecode">
public class Name {
<strong>private String value;</strong>
}</pre>
<p class="tips">To quickly type out '<code>private</code>' you can type '<code>pr</code>'
then press Tab. The '<code>private</code>' access modifier is automatically added to
the line. This is an example of using the editor's code templates. For a full list of
code templates, choose Help &gt; Keyboard Shortcuts Card.</p>
<br><a name="createAccessors"></a>
The IDE can create accessor methods for you. In the editor, right-click on <code>value</code>
and choose Insert Code (or press Alt-Insert; Ctrl-I on Mac). In the popup menu, choose Getter
and Setter.
<br>
<img src="../../../images_www/articles/71/web/spring/generate-code.png"
class="margin-around b-all"
alt="The Generate Code popup menu displayed in editor"
title="The Generate Code popup menu enables you to set accessor methods"></li>
<li>In the dialog that displays, select the <code>value : String</code> option, then
click OK. The <code>getValue()</code> and <code>setValue()</code> methods are added to
the <code>Name</code> class:
<pre class="examplecode">
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}</pre></li>
<li>Press Ctrl-Tab and choose <code>HelloController</code> to switch back to the
<code>HelloController</code> class. Note that the previous error badge has
disappeared since the <code>Name</code> class now exists.</li>
<li>Delete the <code>doSubmitAction()</code>
method and uncomment the
<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>
method. The <code>onSubmit()</code> method enables you to create your own
<code>ModelAndView</code>, which is what is required here. Make the following
changes:
<pre class="examplecode">@Override
protected ModelAndView onSubmit(
HttpServletRequest request,
HttpServletResponse response,
Object command,
BindException errors) throws Exception {
Name name = (Name) command;
ModelAndView mv = new ModelAndView(getSuccessView());
mv.addObject("helloMessage", helloService.sayHello(name.getValue()));
return mv;
}</pre>
As indicated above, the <code>command</code> is recast as a <code>Name</code> object.
An instance of <code>ModelAndView</code> is created, and the success view is
obtained using a getter in <code>SimpleFormController</code>. Finally, the model
is populated with data. The only item in our model is the hello message obtained
from the <code>HelloService</code> created earlier. You use the <code>addObject()</code>
method to add the hello message to the model under the name <code>helloMessage</code>.</li>
<li>Fix import errors by right-clicking in the editor and choosing Fix Imports
(Ctrl-Shift-I; &#8984;-Shift-I on Mac).
<br>
<img src="../../../images_www/articles/71/web/spring/fix-imports70.png"
class="margin-around b-all" alt="Fix All Imports dialog"
title="Press Ctrl-Shift-I to fix imports in your file">
<p class="notes"><strong>Note.</strong> Confirm that <strong><tt>org.springframework.validation.BindException</tt></strong> and
<strong><tt>org.springframework.web.servlet.ModelAndView</tt></strong> are selected in the Fix All Imports dialog box.</p></li>
<li>Click OK. The following import statement is added to the top of the file:
<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>
As stated in the API documentation, this class &quot;represents a model and view returned
by a handler, to be resolved by a <code>DispatcherServlet</code>. The view can take the
form of a <code>String</code> view name which will need to be resolved by a <code>ViewResolver</code>
object; alternatively a <code>View</code> object can be specified directly. The model is
a <code>Map</code>, allowing the use of multiple objects keyed by name.&quot;
<br><br>
Note that at this stage, not all errors are fixed because the class still cannot identify the
<code>HelloService</code> class, nor make use of its <code>sayHello()</code> method.</li>
<li>Within <code>HelloController</code>, declare a private field named <code>HelloService</code>:
<pre class="examplecode">private HelloService helloService;</pre>
Then create a public setter method for the field:
<pre class="examplecode">public void setHelloService(HelloService helloService) {
this.helloService = helloService;
}</pre>
Finally, right-click in the editor and choose Fix Imports (Ctrl-Shift-I; &#8984;-Shift-I
on Mac). The following statement is added to the top of the file:
<pre class="examplecode">import service.HelloService;</pre>
All errors should now be fixed.</li>
<li>Register <code>HelloService</code> in <code>applicationContext.xml</code>. Open
<code>applicationContext.xml</code> in the editor and enter the following
bean declaration:
<pre class="examplecode">
&lt;bean name=&quot;helloService&quot; class=&quot;service.HelloService&quot; /></pre>
<div class="tips">Spring support in the IDE includes code completion
within XML configuration files for Java classes as well as bean references. To
invoke code completion, press Ctrl-Space when working in the editor:
<br>
<img src="../../../images_www/articles/71/web/spring/code-completion.png"
alt="Code completion invoked when pressing Ctrl-Space"
title="Code completion invoked when pressing Ctrl-Space"
class="b-all margin-around"></div></li>
<li>Register <code>HelloController</code> in <code>dispatcher-servlet.xml</code>. Open
<code>dispatcher-servlet.xml</code> in the editor and enter the following
bean declaration:
<pre class="examplecode">
&lt;bean class=&quot;controller.HelloController&quot; p:helloService-ref=&quot;helloService&quot;/&gt;</pre></li>
</ol>
<h2 id="view">Implementing the Views</h2>
<p>To implement the view for this project, you need to create two JSP pages. The first,
which you will call <code>nameView.jsp</code>, serves as the welcome page and allows
users to input a name. The other page, <code>helloView.jsp</code>, displays a greeting
message that includes the input name. Begin by creating <code>helloView.jsp</code>.</p>
<ol>
<li id="create-jsp">In the Projects window, right-click the WEB-INF &gt; <code>jsp</code>
node and choose New &gt; JSP. The New JSP File wizard opens. Name the file <strong>helloView</strong>.</li>
<li>Click Finish. The new JSP page is created in the <code>jsp</code> folder and opens
in the editor.</li>
<li>In the editor, change the file's title to <code>Hello</code>, and change
the output message to retrieve the <code>helloMessage</code> of the <code>ModelandView</code>
object that is created in <code>HelloController</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>Create another JSP page in the same manner <a href="#create-jsp">as above</a>,
but name it <code>nameView</code>.</li>
<li>In the editor, add the following Spring tag library declaration to <code>nameView.jsp</code>.
<pre class="examplecode">&lt;%@taglib uri=&quot;http://www.springframework.org/tags&quot; prefix=&quot;spring&quot; %&gt;</pre>
This imports the <a href="http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html">Spring
tag library</a>, which contains tags useful when implementing views as JSP pages.
<li>Change the contents of the <code>&lt;title&gt;</code> and <code>&lt;h1&gt;</code>
tags to read: <code>Enter Your Name</code>.</li>
<li>Enter the following code beneath the <code>&lt;h1&gt;</code> tags:
<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>
allows you to bind a bean property. The bind tag provides a bind status and
value, which you use as the name and value of the input field. This way, when
the form is submitted, Spring will know how to extract the submitted value.
Here, our command class (<code>controller.Name</code>) has a <code>value</code>
property, therefore you set the <code>path</code> to <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>
enables you to prepend a specified path to a bean. So, when used with <code>spring:bind</code>
as shown above, the path to the bean becomes: <code>name.value</code>. As you recall, the
command name of <code>HelloController</code> is <code>name</code>. Therefore, this path refers
to the <code>value</code> property of a bean named <code>name</code> in the page scope.
<li>Change the relative entry point for the application. Currently, the project entry
point is still <code>index.htm</code> which, as described in <a href="#running">Running
the Skeleton Project</a> above, redirects to <code>WEB-INF/jsp/index.jsp</code>. You
can specify an entry point for the project when it is deployed and run. In the Projects
window, right-click the project node and choose Properties. The Project Properties
dialog displays. Under Categories select Run. In the Relative URL field, type in
<code>/hello.htm</code>, then click OK.
<br><br>
At this moment you may wonder where the mapping of <code>hello.htm</code> to
<code>HelloController</code> is located. You have not added a mapping to the
<code>urlMapping</code> bean, as is the case for <code>index.htm</code>, the
skeleton project's welcome page. This is possible with a bit of Spring magic
provided by the following bean definition in <code>dispatcher-servlet.xml</code>:
<pre class="examplecode">&lt;bean class=&quot;org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping&quot;/&gt;</pre>
This bean is responsible for automatically creating an URL mapping for all controllers
registered in the file. It takes the fully-qualified class name of the controller
(in our case, <code>controller.HelloController</code>) and strips the package name
and <code>Controller</code> suffix, then uses the result as a URL mapping. Therefore,
for <code>HelloController</code> it creates a <code>hello.htm</code> mapping. This magic
however does not work for controllers that are included in the Spring Framework,
such as <code>ParameterizableViewController</code>. They require an explicit mapping.</li>
<li>In the Projects window right-click the project node and choose Run. This compiles,
deploys and runs the project. Your default browser opens, displaying <code>hello.htm</code>
as the project's <code>nameView</code>:
<br>
<img src="../../../images_www/articles/71/web/spring/name-view.png"
alt="nameView displayed in a browser"
title="nameView is displayed in a browser"
class="b-all margin-around">
<br>
Enter your name in the text field and click enter. The <code>helloView</code>
displays with a greeting message:
<br>
<img src="../../../images_www/articles/71/web/spring/hello-view.png"
alt="helloView displayed in a browser"
title="helloView is displayed in a browser"
class="b-all margin-around"></li>
</ol>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Introduction%20to%20Spring">Send
Us Your Feedback</a></div>
<br style="clear:both;">
<h2 id="seeAlso">See Also</h2>
<p>This concludes the Introduction to the Spring Framework in NetBeans IDE. This document
demonstrated how to construct a simple web MVC application in the NetBeans IDE using
the Spring Framework, and introduced you to the IDE's interface for developing web
applications.</p>
<p>You are encouraged to continue learning about the Spring Framework by working through
other tutorials in NetBeans IDE, such as
<a href="http://sites.google.com/site/springmvcnetbeans/step-by-step/">Developing a
Spring Framework MVC Application Step-by-Step using NetBeans and the GlassFish server</a>.
This is the official <a href="http://static.springframework.org/docs/Spring-MVC-step-by-step/">Spring
Framework tutorial</a> by Thomas Risberg which has been adapted for NetBeans IDE by
Arulazi Dhesiaseelan.</p>
<p>Many of the Spring NetBeans Module capabilities can also be applied to non-web based
Spring framework applications.
<p>For other related tutorials, see the following resources:</p>
<ul>
<li><a href="../../docs/web/framework-adding-support.html">Adding Support for a Web Framework</a>.
A basic guide describing how to add support by installing a web framework
plugin using the NetBeans Update Center.</li>
<li><a href="../../docs/web/jsf20-intro.html">Introduction to JavaServer Faces 2.0</a>. Demonstrates
how to add JSF 2.0 support to an existing project, wire managed beans, and take
advantage of Facelets templating.</li>
</ul>
</body>
</html>