Spring 4 MVC Hello World Tutorial – Full Example

78 Flares Twitter 8 Facebook 29 Google+ 40 LinkedIn 1 Filament.io 78 Flares ×

In this tutorial you will learn how to develop a Spring 4  MVC Hello world example. We hope this tutorial will give you a quick start with Spring MVC development using the latest Spring 4 Release.

Technologies used:

  • Spring 4.0.1.RELEASE
  • JDK 1.6
  • Maven 3
  • Eclipse Java EE IDE ( Eclipse JUNO)

Updates (10 -Feb -2014): Updated the tutorial with JavaConfig. Now explains how to use WebApplicationInitializer and @Configuration 

Part 1: Maven Project Setup In Eclipse

Let us start with the creation of  a Maven web project in Eclipse. A maven web project archetype will create all the necessary folder structures required for a web project. We assume that you have installed the maven plugins for Eclipse. If you haven’t configured it, refer our earlier Spring tutorial that has section explaining how to setup maven in eclipse.

File ->  New  -> Other -> Maven -> Maven Project

Maven Project Eclipse

Click Next and Click Next again ( If you wish to change default Workspace location , you may do so). In the next screen you should pick the maven web app archetype. Refer the screen below

Maven Web App Archetype

Click Next  and provide the following values

  1. GroupId :com.javahash.web ( you can change this according to your package structure)
  2. Artifact Id: Spring4MVCHelloWorld
  3. Version: 1.0-SNAPSHOT

Click Finish to complete the Project Setup.

Project Structure-SpringMVC

Part 2:  Spring Configuration

We now need to add the spring framework libraries as dependencies in mavan (pom.xml).  For the sake of ease, we are going to define a maven variable to hold the spring framework version. If we need to change to a different spring release only this variable needs to be changed.

Dependencies – 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.javahash.web</groupId>
 <artifactId>Spring4MVCHelloWorld</artifactId>
 <packaging>war</packaging>
 <version>1.0-SNAPSHOT</version>
 <name>Spring4MVCHelloWorld Maven Webapp</name>
 <url>http://maven.apache.org</url>
 <properties>
 <spring.version>4.0.1.RELEASE</spring.version>
 </properties>
 <dependencies>
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>3.8.1</version>
 <scope>test</scope>
 </dependency>
 <!-- Spring dependencies -->
 <dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-core</artifactId>
 <version>${spring.version}</version>
 </dependency>

 <dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-web</artifactId>
 <version>${spring.version}</version>
 </dependency>

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

 </dependencies>
 <build>
 <finalName>Spring4MVCHelloWorld</finalName>
 </build>
</project>

Spring Beans Configuration

We need a configuration file that holds the spring configuration information. In this tutorial we will be using the Spring’s auto scan feature ( annotation) to detect and initialize beans. We can name this configuration file any name. We are using the name dispatcher-servlet.xml for this project. Place this file inside the WEB-INF folder.


<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 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-3.0.xsd


http://www.springframework.org/schema/context


http://www.springframework.org/schema/context/spring-context-3.0.xsd">

 <context:component-scan base-package="com.javahash.spring.controller" />

 <bean
 class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 <property name="prefix">
 <value>/WEB-INF/views/</value>
 </property>
 <property name="suffix">
 <value>.jsp</value>
 </property>
 </bean>
</beans>

We have told spring to look at the package com.javahash.spring.controller for the beans and we have also told the framework that all views are kept under WEB-INF/views folder.

Part 3 : Web App Configuration

Next step is to configure the web app so that it uses Spring’s DispatcherServlet as the Front Controller.
Configuring web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<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>Archetype Created Web Application</display-name>

 <servlet>
 <servlet-name>dispatcher</servlet-name>
 <servlet-class>
 org.springframework.web.servlet.DispatcherServlet
 </servlet-class>
 <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
 <servlet-name>dispatcher</servlet-name>
 <url-pattern>/</url-pattern>
 </servlet-mapping>

 <context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
 </context-param>

 <listener>
 <listener-class>
 org.springframework.web.context.ContextLoaderListener
 </listener-class>
 </listener>
</web-app>

Location of web.xml is inside the WEB-INF Folder

The servlet name we used in the web.xml is dispatcher. Due to this the framework will look for a file ( servletname-servlet.xml) to load the Spring MVC configurations. In our case it will be dispatcher-servlet.xml. If we have used a different name for the servlet, say frontcontroller, then the framework will look for a file with name frontcontroller-servlet.xml to load MVC configurations. We can override this behavior by explicitly specifying the mvc configuration file using the parameter contextConfigLocation. We have used that in our web.xml

Part 4: Controller Development

From Spring 3 on wards there exists excellent support for annotations. We will use annotations to  mark our class as  a controller in the standard MVC design. The HelloWorldController is a very simple controller that just echoes a message. It takes a parameter and just echoes it.


package com.javahash.spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloWorldController {

@RequestMapping("/hello")
 public String hello(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
 model.addAttribute("name", name);
 return "helloworld";
 }

}

Please note the use of @Controller and @RequestMapping . The URL takes a parameter with name “name”.

View

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Spring4 MVC -HelloWorld</title>
</head>
<body>
<h1>Hello : ${name}</h1>
</body>
</html>

We can generate a War file and deploy that to a web server to test the application. In eclipse , right click the project and Click Run As – > Maven Install. This will build the project and create a war file in the target folder. In the case of this example the file will be Spring4MVCHelloWorld.war

Deploy this WAR file to a web server , say Tomcat and issue

http://localhost:8080/Spring4MVCHelloWorld/hello/?name=JavaHash

Results

How to Avoid XML Files and use JavaConfig

Maintaining configuration using XML has its advantages and disadvantages. If you are not a fan of XML configuration and wish to enjoy the benefits of annotations based configuration, you can do so easily in Spring. It is your choice to go the XML path or the JavaConfig path. JavaConfig is a cool approach and helps in rapid application development and provides easy maintenance. When the number of artifacts in the project increases, JavaConfig is very handy. Also it is the developer friendly means of handling configuration. Let us see how we can replace the dispatcher-servlet.xml and the Spring Configuration defined in the web.xml to  Java classes using JavaConfig.

Replacing dispatcher-servlet.xml with Java File


package com.javahash.spring.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

@Configuration //Marks this class as configuration
//Specifies which package to scan
@ComponentScan("com.javahash.spring")
//Enables Spring's annotations
@EnableWebMvc
public class Config {

 @Bean
 public UrlBasedViewResolver setupViewResolver() {
 UrlBasedViewResolver resolver = new UrlBasedViewResolver();
 resolver.setPrefix("/WEB-INF/views/");
 resolver.setSuffix(".jsp");
 resolver.setViewClass(JstlView.class);
 return resolver;
 }
}

Moving Spring Configuration from web.xml to WebApplicationInitializer


package com.javahash.spring.config;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class WebInitializer implements WebApplicationInitializer {

public void onStartup(ServletContext servletContext) throws ServletException {

 AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
 ctx.register(Config.class);

 ctx.setServletContext(servletContext);

 Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
 servlet.addMapping("/");
 servlet.setLoadOnStartup(1);

 }

}

Download Source Code

Download – Project Source Code

References

Spring 4

Share this post:

Related Posts

  • https://twitter.com/a2xchip Alexander Chip

    Cool tutorial. I think about learning Java/Spring about a year. It is really cool.

  • Matthieu Bertin

    Why did you choose to use xml files for the configuration?

    • http://pickadvice.com/ prem kumar

      I have updated the tutorial with JavaConfig also. It is up-to the developer to choose which way they want to go. I have outlined both approaches in this update.

      • Anonymous Human

        If we go the JavaConfig route, what do we name the two configuration files and where in the project directory structure do we place them in the Eclipse IDE?

  • Edgar Miguel Mamani Condori

    Where do I find javax.servlet.ServletRegistration.Dynamic?

  • Douglas Crews

    Helpful++

  • dev

    I am not sure how were you able to run your code, you specify the version of spring as 4.0.1; however your xml context file says spring-beans 3.0 version…

    • http://pickadvice.com/ prem kumar

      That is the XML schema definition. It will work with spring 3 and 4.

  • Bogdan Marian Oloeriu

    This is confusing for someone new to spring. Can you please split this
    in 2 related tutorials? One based on xml configuration and one based on
    java configuration. I’m not able to see what file goes where in what
    package or folder and how the final project structure should look like.

    • http://pickadvice.com/ prem kumar

      Sure. I will organize it better.

  • Chris Kalubi

    My IDE (intelliJ) doesn’t recognize the register() method int the webInitializer class:
    ctx.register(Config.class);
    it’s strange because I have spring-web.jar in my dependecies.
    Do you know why?

  • ahmed abbas

    very helpful thanks

  • Brandon

    Hi there, Is it possible for you to provide a link for the code to be downlaoded?

    • http://pickadvice.com/ prem kumar

      I will provide the code in a week. Right now I am out of station and once iam back I will provide you the full code.

      • http://pickadvice.com/ prem kumar

        The article is updated with the link to download the complete project source code.

  • sandeep singh

    Hi ,
    Is it possible for you to provide a link for the code to be downlaoded?

    • http://pickadvice.com/ prem kumar

      Complete project source code is now available. Please check the Download section of the article.

      • sandeep

        thnx 4 source code.
        “http://localhost:8080/Spring4MVCHelloWorld/” is working
        but whn I fired “http://localhost:8080/Spring4MVCHelloWorld/hello/?name=JavaHash” URL that is not working it gives me 404 error.

        • DBspringing

          remove the / before the ?

  • DBspringing

    I swapped the xml for JavaConfig. Now when I run the output on the browser is

    Hello : ${name}

    What am I missing?

    • jaycuse

      I have the same problem.
      I added jstl dependency but doesn’t solve the problem
      jstl jstl 1.2

    • sn.

      I still have the same problem. Have you found any solution to it?

      Thanks in advance.

    • Felipe Drequeceler Pinto

      are you using the correct URL?
      ?name=JavaHash at the end1http://localhost:8080/Spring4MVCHelloWorld/hello/?name=JavaHash

    • kas

      It may be caused by wrong doctype of web.xml, try to change it to simple

      • kas

        editor cut the code “to simple ? xml version=”1.0″ encoding=”UTF-8″ ?” with tags around.

        • Nico Cortés

          The problem was inside the web.xml file.
          Changing the header as Kas told us, and it’ll work.
          Thanks Kas.

        • Ashish

          Thanks Kas… I had the same problem too.. :)

  • Seetesh

    Does this code run on JBoss 7.1.1? Pls try to deploy it as most of us wont use Tomcat to deploy the same. Besides you have not mentioned which
    Tomcat version it has been tested.

    • http://pickadvice.com/ prem kumar

      It should run on jboss. There is nothing tomcat specific in the code. Use maven to build the project and add all dependencies in pom.XML. I used Tomcat 7

  • Rex Rao

    Does this code work on JBoss 7.1.1?

    • http://pickadvice.com/ prem kumar

      It is just spring and jsp.it should work in jboss.

  • Sherlock Ouyang

    Hi there, thank you, the tutorial is very helpful. But I got a problem while trying to run your source code on eclipse, I chose to “run on server” but it said
    “Could not publish to the server.
    java.lang.IndexOutOfBoundsException”

    I am a green hand, could you tell me why and what to do to solve this problem ?Thanks again. :-)

  • Saad

    This as a great tutorial !! Thanks.
    Could you please do an extension on this on how to easily map from controller to views. (convention over configuration). Say I want to create a folder for each controller in the “views” folder and map each action to the specifig jsp file.

  • Sandip Bhaumik

    I am getting error on SEVERE: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener

    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

    But I can see that spring-web[version] present in my classpath. Tried cleaning few times but still no luck.

    Thanks,
    Sandip

  • Roland

    The tutorial has some points that should be improved:

    * The generated pom.xml contains an url element, which refers to maven.apache.org. This is wrong, since this project does not have a homepage at all. The element should be removed.

    * The pom.xml is neither indented correctly nor are there useful paragraphs in it. For example, there should be an empty line before and after the “properties” element.

    * JUnit 3.8 is outdated; for a modern example JUnit 4.12 should be used.

    * The file name “dispatcher-servlet.xml” is not arbitrary. It must correspond to the “servlet-name” in web.xml.

    * The many empty lines in the “dispatcher-servlet.xml” are not necessary.

    * In dispatcher-servlet.xml the “property” elements can be written shorter; they should be properly indented.

    * The web.xml uses the DTD for version 2.3 but declares a webapp with version 2.4; these versions should be the same.

    * The tutorial does not mention where exactly each of the example files has to be placed.

    * In helloworld.jsp there is a cross-site scripting vulnerability.

  • Carlos Barros

    thanks to spring guys now we are obligated to use maven, a hard and complex tool only for build helloworld applications like that… thats why a lot of new programers are moving to other technologies not so burocratic and much more eficient.
    yes I really hate maven most of times. the customer dont pay us to configure and setup tools but to effectively build software. maven force us infinite time consuming setups!

    • Miguel

      Maven makes dependency much easier. Also the archetypes generation save me lot of time.

      • Johaness

        I´m here for learning SPRING not MAVEN. most projects simply doesn’t use it due to complex infrastructure needed.

    • ∆ [c0d3r28] ∆

      “a hard and complex tool”

      I think perhaps you need to do a little more Maven homework, its a pretty straight forward and powerful build tool. Of course you dont have to use Maven, you can build it manually or with other build tools like Gradle. Maven is just the widest used because it is the easiest and works well with Spring.

      • Johaness

        its a lack of focus. Maven is not Spring, we are here to learn Spring not for learning maven! its not easy…

        • ∆ [c0d3r28] ∆

          Well, its a common practice to use a build system to build the project. Maven handles all the spring dependencies, no need to go and get them manually download them, add them to the project etc.

          It’s pretty hard to find a spring tutorial that doesn’t include some build system. Spring has been architectured to fit in with build systems, so Id say a Maven overview is pretty justified here, since its a popular build tool.

          However, this is far from the best tutorial on the subject.

  • Tony

    the biggest flaw with this tutorial is it never mentions where the web.xml and configuration files should be saved. Without this information, it’s no better than useless.

    • http://pickadvice.com/ prem kumar

      You should put web.xml and the dispatcher-servlet.xml in the WEB-INF Folder

  • newbies

    I have been searching for 10 hours and this is the only example that works out-of-the-box. Many thanks. Great job!

  • sam

    Hi
    I am not able to see hellow word on Hello.jsp i used view resolver
    Thanks

    • Ashish

      Same with me

  • tracksie

    eh? this was all doable in Spring 3 too. This tut doesn’t use any new goodness from Spring 4!?!

  • raju

    1 salute 2 u sir ji. after 15 days of problematic approach today only i got up with ur solution. it’s really nice that it’s working. i feel that i have done something(troubleshooting). having a inner happiness feeling

  • stevematdavies

    Dear oh dear, what a mess of a tutorial!

  • BAKRI Anouar

    the correct namespace and schemalocation for mvc-dispatcher-servlet.xml
    https://docs.google.com/document/d/13XcI828smC3pi2Xdk2t7yV9JGRcV7LZ8r7Y4PjbIV_4/

  • BAKRI Anouar

    the correct namespace and schemalocation for web.xml
    https://docs.google.com/document/d/1-OnGXInPmEcNEDcgnUalPg9-zprqXPaFwTTJ44oLf5I/

  • GG

    Awesome tutorial. Thanks :)

  • ∆ [c0d3r28] ∆

    “Deploy this WAR file to a web server , say Tomcat and issue”

    Ok, any chance you can run through this as there are a few steps involved, such as adding a server, setting up the project to run with the server and how to deploy the WAR?????

  • ∆ [c0d3r28] ∆

    Further investigation into this tutorial reveals quite many errors, and missing dependencies, such as java version, maven java version export dependencies. This is actually a now outdated and incorrectly configured project, and it appears as if the Author has not updated it. I will look elsewhere for a better provided tutorial, one that uses the Spring Tool Suite (sts) where the correct defaults are provided.

    To the Author whilst I appreciate the effort, I suggest you rethink this tutorial and update it with many of the corrections suggested in the comments, and a good look at the latest Spring Build