Introduction to the Spring Framework
This document shows you how to construct a simple web MVC application using the Spring Framework. 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.
The Spring Framework is a popular open source application framework that can make J2EE 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.
The IDE provides built-in support for Spring Framework 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 DispatcherServlet
. The JSTL library is automatically registered. Support for Spring XML bean configuration files is also provided, including the following functionality:
- Code completion. Invoked in Spring XML configuration files for Java classes as well as bean references.
- Navigation. Hyperlinking of Java classes and properties mentioned in Spring bean definitions, as well as hyperlinking to other Spring bean references.
- Refactoring. Renaming of references to Java classes in Spring XML configuration files.
For more information on the Spring Framework, visit http://www.springframework.org. For a more fine-grained explanation of how Spring Framework artifacts behave and interact with other objects in an application, visit the official Spring Framework Reference Documentation, or consult the Spring Framework API.
Contents
- Setting up a New Project with Spring Web MVC Support
- Overview of the Application
- Implementing a Service
- Implementing the Controller and Model
- Implementing the Views
- See Also
To complete this tutorial, you need the following software and resources.
Software or Resource | Version Required |
---|---|
NetBeans IDE | version 6.1 or 6.5 Java |
Java Development Kit (JDK) | version 5 or 6 |
GlassFish application server or Tomcat servlet container | V2 or V3 version 6.x |
Notes:
- The Web and Java EE installation enables you to optionally install the GlassFish (V2 or V3) application server and the Apache Tomcat servlet container 6.0.18. You must install one of these (or register a different server in the IDE) to work through this tutorial.
- If you need to compare your project with a working solution, you can download the sample application.
Setting up a New Project with Spring Web MVC Support
Creating a Spring Web MVC Skeleton Project
Start by creating a new project for a web application using the Spring Framework:
- Choose New Project (Ctrl-Shift-N) from the IDE's File menu. Under Categories select Java Web. (If you are using NetBeans 6.1, select Web.) Under Projects select Web Application. Click Next.
- In Project Name, type in
HelloSpring
. Click Next. - In Step 3, Server and Settings, select the server you plan to work with from the Server drop-down list. Leave all other settings at their defaults and click Next.
- In Step 4, the Frameworks panel, select Spring Web MVC 2.5:
When you select Spring Web MVC 2.5, note that you can configure the name and mapping of the Spring dispatcher servlet under the Configuration tab. If you click the Libraries tab, note that JSTL libraries are by default added to the classpath during project creation.
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). You can view the template structure from the Projects window (Ctrl-1). Also note that four files open by default in the IDE's Source Editor:dispatcher-servlet.xml
,applicationContext.xml
,redirect.jsp
, andindex.jsp
.
Running the Skeleton Project
Before making any changes to project files, try running the new project in the IDE:
- In the Projects window, right-click the project node and choose Run Project. The IDE automatically starts your server if it is not already running, builds then deploys the application to it. The application runs using the configuration data contained in
dispatcher-servlet.xml
. Note any output displayed in the IDE's Output window (Window > Output). The generated output completes with aBUILD SUCCESSFUL
message:
The IDE's default browser starts up, and you see content from the welcome page view (/WEB-INF/jsp/index.jsp
):
In order to understand what just took place, start by examining the project's deployment descriptor (web.xml
). To open this file in the Source Editor, right-click the WEB-INF
> web.xml
node in the Projects window and choose Edit. The default entry point for the application is redirect.jsp
:
redirect.jsp
Within redirect.jsp
, there is a redirect statement that points all requests to index.htm
:
<% response.sendRedirect("index.htm"); %>
In the deployment descriptor, note that all requests for URL patterns that match *.htm
are mapped to Spring's DispatcherServlet
:
dispatcher
org.springframework.web.servlet.DispatcherServlet
2
dispatcher
*.htm
The class of the dispatcher
servlet, as shown above, is org.springframework.web.servlet.DispatcherServlet
. This class is contained in the Spring libraries, which were added to the project classpath when the project was created. To verify this, in the Projects window drill down from the Libraries node:
The DispatcherServlet
handles incoming requests based on configuration settings found in dispatcher-servlet.xml
. Open dispatcher-servlet.xml
by clicking on its tab in the Source Editor. Note the following code:
indexController
Three beans are defined in this file: indexController
, viewResolver
, and urlMapping
. When the DispatcherServlet
receives a request that matches *.htm
such as index.htm
, it looks for a controller within urlMapping
that can accommodate the request. Above, you see that there is a mappings
property that links /index.htm
to indexController
.
The runtime environment then searches for the definition of a bean named indexController
, which is conveniently provided by the skeleton project. Note that indexController
extends ParameterizableViewController
. This is another class provided by Spring, which simply returns a view. Above, note that p:viewName="index"
specifies the logical view name, which is resolved using the viewResolver
by prepending /WEB-INF/jsp/
and appending .jsp
to it. This allows the runtime to locate the file within the WAR file of the application, and respond with the welcome page view (/WEB-INF/jsp/index.jsp
).
Overview of the Application
The application you create is comprised of two JSP pages (which are named views in Spring Web MVC 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.
The views are managed by a controller, 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 model). This application's controller is named HelloController
.
In a complex web application, the business logic is not contained directly in the controller. Instead, another entity, named a service, is used by the controller whenever it needs to perform business logic. In our application, the business logic is the computation of the hello message, so for this purpose you create a HelloService
.
Implementing a Service
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 HelloService
class.
- In the Projects window, right-click the project node and choose New > Java Class.
- In the New Java Class wizard that displays, enter
HelloService
for Class Name, and type inservice
for Package Name to create a new package for the class. Click Finish. The IDE creates the new class and opens it in the Source Editor. Also note that the Projects window automatically updates to reflect changes.
The HelloService
class performs a very simple service. It takes a name as a parameter, and prepares and returns a String
that includes the name. In the Source Editor, create the following sayHello()
method for the class (changes in bold):
public class HelloService {
public String sayHello(String name) {
return "Hello " + name + "!";
}
}
Implementing the Controller and Model
You can use a SimpleFormController
to handle user data and determine which view to return.
- Open the New File wizard by pressing Ctrl-N (⌘-N on Mac). Under Categories select Spring Framework; under File Types select
Simple Form Controller
. Click Next. - Name the class
HelloController
and create a new package for it by typingcontroller
in the Package text field. Click Finish. The IDE creates the new class and opens it in the Source Editor. - Specify controller properties by uncommenting the setter methods that display by default in the class template. Make changes as follows (changes in bold):
public HelloController() {
Setting the
setCommandClass(Name.class);
setCommandName("name");
setSuccessView("helloView");
setFormView("nameView");
}FormView
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 theSuccessView
likewise lets you set the name of the view that should display upon a successful submit. When you set theCommandName
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 theCommandClass
allows you set the name of the command class. An instance of this class gets populated and validated upon each request.
Note that an error is flagged forName
in thesetCommandClass()
method:
You need to create theName
class as a simple bean to hold information for each request. - In the Projects window, right-click on the project node and choose New > Java Class. The New Java Class wizard displays. Enter
Name
for the Class Name, and for Package selectcontroller
from the drop-down list. Click Finish. TheName
class is created and opened in the Source Editor. - For the
Name
class, create a field namedvalue
, then create accessor methods for this field. Type in the following (changes in bold):public class Name {
The IDE can create accessor methods for you. In the Source Editor, right-click on
private String value;value
and choose Insert Code (or press Alt-Insert; Ctrl-I on Mac) to open the Generate Code popup menu. Then choose Getter and Setter.
- In the dialog that displays, select the
value : String
option, then click OK. ThegetValue()
andsetValue()
methods are added to theName
class:public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
} - Click back to
HelloController
in the Source Editor and notice the previous error badge has disappeared due to the fact that you created theName
class. Delete thedoSubmitAction()
method and uncomment theonSubmit()
method. TheonSubmit()
method enables you to create your ownModelAndView
, which is what is required here. Make the following changes:@Override
As indicated above, the
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
is recast as aName
object. An instance ofModelAndView
is created, and the success view is obtained using a getter inSimpleFormController
. Finally, the model is populated with data. The only item in our model is the hello message obtained from theHelloService
created earlier. You use theaddObject()
method to add the hello message to the model under the namehelloMessage
. - Fix import errors by right-clicking in the Source Editor and choosing Fix Imports (Ctrl-Shift-I; ⌘-Shift-I on Mac). The following import statement is added to the top of the file:
import org.springframework.web.servlet.ModelAndView;
Not all errors are fixed however, because the class still cannot identify theHelloService
class, nor make use of itssayHello()
method. - Within
HelloController
, declare a private field namedHelloService
:private HelloService helloService;
Then create a public setter method for the field:public void setHelloService(HelloService helloService) {
Finally, right-click again in the Source Editor and choose Fix Imports. Note that the following statement is added to the top of the file:
this.helloService = helloService;
}import service.HelloService;
All errors should now be fixed. - Register
HelloService
inapplicationContext.xml
. OpenapplicationContext.xml
in the Source Editor and enter the following bean declaration: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 Source Editor:
- Register
HelloController
indispatcher-servlet.xml
. Opendispatcher-servlet.xml
in the Source Editor and enter the following bean declaration:
Implementing the Views
To implement the view for this project, you need to create two JSP classes. The first, which you will call nameView.jsp
, serves as the welcome page and allows a user to input a name. The other page, helloView.jsp
, displays a greeting message that includes the input name. Begin by creating helloView.jsp
.
- In the Projects window, right-click the WEB-INF > jsp node and choose New > JSP. The New JSP File wizard opens. Name the file
helloView
. Click Finish. The new JSP file is created in the jsp folder and opens in the Source Editor. - In the Source Editor, change the file's title to
Hello
, and change the output message to retrieve thehelloMessage
of theModelandView
object that is created inHelloController
:
Hello
${helloMessage}
- Create another JSP File in the same manner as above, but name it
nameView
. - In the Source Editor, add the following tag library declaration to
nameView.jsp
:<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
This imports the Spring tag library, which contains tags useful when implementing views as JSP pages. - Change the contents of the
andtags to read:
Enter Your Name
. - Enter the following code beneath the
h2
tags:
spring:bind 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 (
controller.Name
) has avalue
property, therefore you set thepath
tovalue
.
spring:nestedPath enables you to prepend a specified path to a bean. So, when used withspring:bind
as shown above, the path to the bean becomes:name.value
. As you recall, the command name ofHelloController
isname
. Therefore, this path refers to thevalue
property of a bean namedname
in the page scope. - Change the relative entry point for the application. Currently, the project entry point is still
index.htm
which, as described in Running the Skeleton Project above, redirects toWEB-INF/jsp/index.jsp
. 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/hello.htm
, then click OK.
At this moment you may wonder where the mapping ofhello.htm
toHelloController
is located. You have not added a mapping to theurlMapping
bean, as is the case forindex.htm
, the skeleton project's welcome page. This is possible with a bit of Spring magic provided by the following bean definition indispatcher-servlet.xml
:
This bean is reponsible 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,controller.HelloController
) and strips the package name andController
suffix, then uses the result as a URL mapping. Therefore, forHelloController
it creates ahello.htm
mapping. This magic however does not work for controllers that are included in the Spring Framework, such asParameterizableViewController
. They require an explicit mapping. - In the Projects window right-click the project node and choose Run. This compiles, deploys and runs the project. Your default browser opens, displaying
hello.htm
as the project'snameView
:
Enter your name in the text field and click enter. ThehelloView
displays with a greeting message: