Spring MVC hello world example

Note
This tutorial is based on Spring 2.5.6, quite outdated. Try considering the new tutorials :

  1. Gradle + Spring 4 MVC Hello World
  2. Maven + Spring 3 MVC Hello World

In this tutorial, we will show you a Spring MVC hello world web application.

Technologies used :

  1. Spring 2.5.6
  2. JDK 1.6
  3. Eclipse 3.6
  4. Maven 3

1. MVC Basic

In Spring MVC web application, it consists of 3 standard MVC (Model, Views, Controller) components :

  1. Models – Domain objects that are processed by the service layer (business logic) or persistent layer (database operation).
  2. Views – Display data, normally it’s a JSP page written with the Java Standard Tag Library (JSTL).
  3. Controllers – URL mapping and interact with service layer for business processing and return a Model.

The following figures demonstrates how the Spring MVC web application handles a web request.

Figure 1.1 – Image is copied from Spring MVC reference with slightly modified.

spring mvc concepts

Figure 1.2 – Image is copied from this book : Spring Recipes

spring-mvc-concepts-2
Note
In Spring MVC , the core dispatcher component is the DispatcherServlet, which act as the front-controller (design pattern). Every web request has to go through this DispatcherServlet, and the DispatcherServlet will dispatch the web request to suitable handlers.

2. Directory Structure

A standard Maven project directory structure.

spring2-mvc-hello-world

3. Maven

Declares the spring-webmvc dependency, Maven will help you manage the transitive dependencies automatically (download other dependencies that are required by spring-webmvc, like spring-context or spring-beans).

If you are using the JSP page with JSTL technology, include the jstl dependency also.

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
	http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.mkyong.common</groupId>
	<artifactId>spring2-mvc-xml-hello-world</artifactId>
	<packaging>war</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>Spring 2 MVC</name>
	
	<properties>
		<jdk.version>1.6</jdk.version>
		<spring.version>2.5.6</spring.version>
		<jstl.version>1.2</jstl.version>
		<servletapi.version>2.5</servletapi.version>
		
	</properties>
	
	<dependencies>

		<!-- Spring MVC framework -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- JSTL -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
		</dependency>

		<!-- for compile only, your container should have this -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>${servletapi.version}</version>
			<scope>provided</scope>
		</dependency>
		
	</dependencies>

	<build>
		
	  <plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.3</version>
			<configuration>
				<source>${jdk.version}</source>
				<target>${jdk.version}</target>
			</configuration>
		</plugin>

                <!-- embedded jetty, good for testing -->
		<plugin>
			<groupId>org.eclipse.jetty</groupId>
			<artifactId>jetty-maven-plugin</artifactId>
			<version>9.2.11.v20150529</version>
			<configuration>
				<scanIntervalSeconds>10</scanIntervalSeconds>
				<webApp>
					<contextPath>/spring2</contextPath>
				</webApp>
			</configuration>
		</plugin>

                <!-- configure Eclipse workspace -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-eclipse-plugin</artifactId>
			<version>2.9</version>
			<configuration>
				<downloadSources>true</downloadSources>
				<downloadJavadocs>true</downloadJavadocs>
				<wtpversion>2.0</wtpversion>
				<wtpContextName>spring2</wtpContextName>
			</configuration>
		</plugin>
			
	  </plugins>
		
	</build>

</project>

4. Spring Controller

Spring comes with many Controllers, normally, you just need to extend the AbstractController, and override the handleRequestInternal() method.

HelloWorldController.java

package com.mkyong.common.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class HelloWorldController extends AbstractController{

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
		HttpServletResponse response) throws Exception {

		ModelAndView model = new ModelAndView("HelloWorldPage");
		model.addObject("msg", "hello world");
		
		return model;
	}
}

4.1 ModelAndView(“HelloWorldPage”) – To identify which view should return back to the user, in this example HelloWorldPage.jsp will be returned.

4.2 model.addObject(“msg”, “hello world”) – Add a “hello world” string into a model named “msg”, later you can use EL ${msg} to display the “hello world” string.

5. View (JSP page)

In this case, “view” is a JSP page, you can display the value “hello world” that is stored in the model “msg” via expression language (EL) ${msg}.

HelloWorldPage.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
	<h1>Spring MVC Hello World Example</h1>

	<h2>${msg}</h2>
</body>
</html>
Note
If the ${msg} is displayed as it is, not the value inside the “msg” model, it may caused by the old JSP 1.2 descriptor, which make the expression languages disabled by default, see the solution here.

6. Spring XML Configuration

6.1 Declared the Spring Controller and viewResolver.

mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean name="/welcome.htm" 
		class="com.mkyong.common.controller.HelloWorldController" />
		
    <bean id="viewResolver"
    	class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

</beans>

1. Controller – Declared a bean name /welcome.htm and map it to HelloWorldController. It means, if an URL with /welcome.htm pattern is requested, the HelloWorldController controller will handle the request.

2. viewResolver – Define how Spring will look for the view template. In this case, the controller HelloWorldController will return a view named HelloWorldPage, the viewResolver will find the file with following mechanism : prefix + view name + suffix, which is /WEB-INF/pages/HelloWorldPage.jsp.

Note
Actually, you don’t need to define the BeanNameUrlHandlerMapping in the web.xml, by default, if no handler mapping can be found, the DispatcherServlet will create a BeanNameUrlHandlerMapping automatically. See this article – BeanNameUrlHandlerMapping example for detail.

6.2 In web.xml, declared a DispatcherServlet servlet to act as the front-controller to handle all the entire web request which end with htm extension.

web.xml

<web-app id="WebApp_ID" version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <display-name>Spring Web MVC Application</display-name>
  
  <servlet>
  	<servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>
             org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
 	<servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
  </servlet-mapping>

</web-app>
Note
The mvc-dispatcher is used to define which file to load the Spring XML configurations. By default, it will look for Spring XML configuration file by joining the servlet name mvc-dispatcher with -servlet.xml.

In this example, Spring will look for this file – mvc-dispatcher-servlet.xml.

7. Demo

7.1 To run this project with Maven :


$ mvn jetty:run

7.2 To run this project in Eclipse IDE, create Eclipse project settings with the following Maven command :


$ mvn eclipse:eclipse

Imports the project manually and start with the server plugin.

URL : http://localhost:8080/spring2/welcome.htm

spring2-mvc-demo

How it works?

  1. http://localhost:8080/spring2/welcome.htm is requested.
  2. URL is end with “.htm” extension, so it will redirect to “DispatcherServlet” and send requests to the default BeanNameUrlHandlerMapping.
  3. BeanNameUrlHandlerMapping return HelloWorldController to the DispatcherServlet.
  4. DispatcherServlet forward request to the HelloWorldController.
  5. HelloWorldController process it and return a ModelAndView object, with view name “HelloWorldPage”.
  6. DispatcherServlet received the ModelAndView and call the viewResolver to process it.
  7. viewResolver return the /WEB-INF/pages/HelloWorldPage.jsp back to the DispatcherServlet.
  8. DispatcherServlet return the “HelloWorldPage.jsp” back to the user.

Download Source Code

Download it – spring2-mvc-xml-hello-world.zip (14 KB)

References

  1. Spring MVC documentation

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

Leave a Reply

avatar
newest oldest most voted
kuladeep
Guest
kuladeep

great tutorial, as always.

but what happens if I wanna pass an object rather than a simple string?

SomeObj myObject = new SomeObj();…
model.addObject(“obj”, myObject)

Name
Guest
Name

good content!

ohadr dev
Guest
ohadr dev

great tutorial, as always.

but what happens if I wanna pass an object rather than a simple string?

SomeObj myObject = new SomeObj();…
model.addObject(“obj”, myObject)

mkyong
Guest
mkyong

Article is updated, try this new URL – http://localhost:8080/spring2/welcome.htm

However, the Spring 2.5.6 is too old, try considering the new tutorials :

1. Gradle + Spring 4 MVC Hello World
2. Maven + Spring 3 MVC Hello World

umar
Guest
umar

why we add jars in spring mvc project..

Puneeth Shivalingaiah
Guest
Puneeth Shivalingaiah

Thanks man. Its clear and concise……. :)

Michael M
Guest
Michael M

Thank you!!!

sunny
Guest
sunny

Hi, Its nice example. I have one concern, Instead of *.htm, If i change the

/, then hitting the url with welcome.htm is not working.
What could be the reason for this?

Richard Richter
Guest
Richard Richter
The inner box about appcontxt configuration file should be clearer. What it creates is actually two contexts, where the MVC (still with default name though) has main appcontext as its parent. MVC appcontext sees the main one, not the other way around. It is not really an alternative way how to put MVC configuration into another file. To do that properly you simply put init-param to MVC servlet directly: mvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/spring-mvc.xml 1 Separation of main appcontext (for service layer, but also shared with Spring Security) and MVC appcontext is quite typical. @Controllers can reach @Services but not the… Read more »
Nikhil
Guest
Nikhil

hey well done but i’d like to know the role played by the listener in this application as also the cause for loading the spring.xml file enclosed within the context-param

Deepak
Guest
Deepak

Hi Yong,
Please correct web.xml file i.e it should be mvc-dispatcher-servlet.xml rather than

SpringMVCBeans.xml

mkyong
Guest
mkyong

Article is updated, thanks report this error.

Gaurav Khare
Guest
Gaurav Khare

java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener : getting this error.. anybody please suggest.

trackback
Chanaka Indrajith: OAuth2 with LinkedIn | PHP World
[…] Following figure shows basic flow of OAuth2 authentication process. If you are really interested in digging more details, OAuth2 RFC will be the best resource. I strongly recommend you to go through at least up to 1.6 section in the RFC. With this blog post, I show you how third party java application can access protected LinkedIn resources. 1. Creat an application on LinkedIn. – This basically helps to create a link between LinkedIn and your application (third party application). 2. Get an access token – The access token represent the credentials to access protected resources. So your application does not need… Read more »
Nikesh
Guest
Nikesh

can anybody tell me why we need pom.xml file. Is this file is required everytime.Can anybody explain me this. thanks in advance

jethro
Guest
jethro

read about maven

abc
Guest
abc

nice reply.

Diva
Guest
Diva

you can find some more details in the below link,”http://javadomain.in/spring-mvc-hello-world-example-step-by-step/”

Ariel
Guest
Ariel

I believe that a good idea to put WEB-INF/index.jsp file and into file include this line , after if Tomcat is installed as a server in your Eclipse – you can run the application now by right clicking the project node (in the [Project Explorer] window), selecting Run As > Run on Server.

Thanks a lot mkyong for this example!!!

Prabhat Ranjan
Guest
Prabhat Ranjan

This is very good startup exmaple and i have tried this is working after fixing my own env issue.

Thanks

lenin
Guest
lenin

I like your way of explanation and examples etc.. but I want the eclipse project download..Because of this after spending most time in your webpage, I cant run it using maven, so I got stuffs from other resources.. IT would be great if you can have another download url that gives the eclipse project download..thank you very much..

mkyong
Guest
mkyong

To run in Eclipse, use Maven to create the Eclipse project settings :
$ mvn eclipse:eclipse

Feng Luh
Guest
Feng Luh

Excellent tutorial! Thank you.

pegasus
Guest
pegasus
Im trying to integrate spring with JSF and I added the following in web.xml, org.springframework.web.context.ContextLoaderListener org.springframework.web.context.request.RequestContextListener I have also added spring-web and common logging in my tomcat classpath in eclipse There are no build errors , but while running on tomcat im getting the following error, java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener at java.lang.ClassLoader.findBootstrapClass(Native Method) at java.lang.ClassLoader.findBootstrapClassOrNull(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) and java.lang.NoClassDefFoundError: javax/servlet/ServletRequestListener at java.lang.ClassLoader.findBootstrapClass(Native Method) at java.lang.ClassLoader.findBootstrapClassOrNull(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) My settings, There is a servlet-api jar in tomcat lib In my Pom.xml… Read more »
moha
Guest
moha

firsty thanks for this tuto , it’s so interesting just i have a remark :

in file web.xml:
change the following tags :

contextConfigLocation
/WEB-INF/mvc-dispatcher-servlet.xml

by :

contextConfigLocation
/WEB-INF/SpringMVCBeans.xml

NB: it’s corrected in War file

raju
Guest
raju

i download the war file and than import the war in eclipse ,it shows the error in the source file .could u pls tell why it’s happen ?

veerendra
Guest
veerendra

Hi mkyong,
its very good tutorial. Any body can understand easily.

veerendra
Guest
veerendra

Hi mkyong,
this tutorial is very useful for the new developers of spring framework.

Abhishek kumar
Guest
Abhishek kumar

Hey What is the root tag of pom.xml file is it equivalet to applicationcontext.xml and what would be the location of this file .

sandeep
Guest
sandeep

pom.xml is nthing but maven dependencies to configure jar files by hard code..

Abhishek kumar
Guest
Abhishek kumar

! Nicely described, keep it up !

Yuta
Guest
Yuta

Hi I am receiving 404 resource not found. I have downloaded the project and added the spring 4.0 library from springframework.org and a jstl2.0.jar.

Will you please tell me what do i have to do to eliminate this error?

When does 404 usually occur ?

Freakyuser
Guest
Freakyuser

I think this post is dead for any replies from the author by now. I am also waiting for a reply.

Freakyuser
Guest
Freakyuser

How does the Spring configurations work in general?
Let us say that an application is run. What happens from here?
Please explain step by step.
The container looks for the context-path and what happens from there on?

Thanks in advance.

Freakyuser
Guest
Freakyuser

I know the question that I have asked is very basic but it will be helpful not only for me but for many beginners. They will be able to understand and do instead of just working blindly like I was.
Please explain briefly about how the server starts to work on the project. What does the serrver look for and then how does it proceed?

Thanks in advance

Freakyuser
Guest
Freakyuser

WARN : org.springframework.web.servlet.PageNotFound – No mapping found for HTTP request with URI [/common/] in DispatcherServlet with name ‘appServlet’

I am getting this error. I don’t know how the Spring works. I created a Spring Template Project in SpringSource Tool Suite.

When I run the project, what exactly happens. How does the Spring configuration works?

Sami Ewais
Guest
Sami Ewais

Thanks for the helpful post.

Harikrishna
Guest
Harikrishna

which jar files are required
can you please provide me jar files

Sami Ewais
Guest
Sami Ewais

use the pom.xml file to add your dependencies and JARs will be downloaded automatically into your project.