Spring MVC Login Form is a basic example for all spring based applications. We can hardly imagine any web application without forms in it, because forms has its own importance in web application develpment.

In this tutorial, we are going to see how forms are used in Spring Framework, and how spring forms are different then normal HTML forms.

Prerequisites for Spring MVC Login Form:

As part of this tutorial, I am going to implement a simple Spring based Login Form. Though it is a simple login form, it requires more understanding about each and every newer things init.

Spring offers different types of annotations to handling forms. Here are the typical annotations

@Controller :

  • @Controller is an annotation, used in Spring MVC Framework.
  • @Controller annotation is a sub annotation of @Cmponent annotation.
  • We can use @Controller annotation on top of the class only.
  • It indicates that a particular class serves the role of controller in MVC parttern.
  • @Controller annotation acts as a stereotype for the annotated class, indicating its roles.

@RequestMapping :

  • Like @Controller annotation, @RequestMapping annotation is also used in Spring MVC Framework.
  • @RequestMapping annotation can be applied on top of the class and/or methods, and it should be used along with the @Controller annotation.
  • It is used to bind a http request to spring components or handler methods.
  • Class level mapping binds a specific request to the Spring component (class), whereas method level mapping binds a specific request to a specific handler method.

@ModelAttribute :

  • @ModelAttribute annotation can be used on top of a method or method arguments.
  • An @ModelAttribute on a method is used to populate the model with commonly needed attributes for example to fill a drop-down with states.
  • @ModelAttribute on method arguments refers a specific property in Model class (MVC).
  • Used to bind the data from form to controller
  • It should be used along with @RequestMapping in Controllers
  • @ModelAttribute is invoked before the actual controller method starts execution along with @RequestMapping

Recommended: Spring with Hibernate Integration Complete Example

Example for Spring MVC Login Form:

Here we are going to implement Spring MVC Login form in step by step.

Download Example : Spring MVC Login Form Example with STS (NEW)

Project Structure:

Follow below project structure to add described files below.

Spring MVC Login Form

Login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <%@taglib
uri="http://www.springframework.org/tags/form" prefix="form"%>
<!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">
<title>Spring Login Form</title>
</head>
<body>
<form:form name="submitForm" method="POST">
<div align="center">
<table>
<tr>
<td>User Name</td>
<td><input type="text" name="userName" /></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit" /></td>
</tr>
</table>
<div style="color: red">${error}</div>

</div>
</form:form>
</body>
</html>

Points To Note :

  • On the above login form, we used <form:form> tag. Which is given by the spring framework. To use this tag, we need to include the below taglib directory on top of the jsp page.
    <%@taglib uri=”http://www.springframework.org/tags/form” prefix=”form”%>
  • The main advantage of using the <form: form> is,  spring automatically binds the form data to the model bean whenever we submit this form. To make it work, the properties in model class should be equal to the name of form data elements.
  • For instance, we have created a text box field with name userName and password field with the name password. The same names should be used as part of the Model class attributes.

Create a Login Model :

LoginBean.java
package com.spring.controller;

public class LoginBean {

  private String userName;
  private String password;

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

}

Recommended: Spring Boot MVC Login Form Example

servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="com.spring.controller" />
</beans:beans>

Points To Note :

  •  <annotation-driven />, informs Spring container that we are going to use annotations in this application and can be used to identify annotations and to perform respective functions.
  • Created a ViewResolver bean and mapped with the folder name where our actual views (jsp) are present as prefix and extension as suffix
  • Component scanning with <context:component-scan base-package=”com.spring.controller” />, is telling spring that it should search the classpath for all the classes under com.spring.controller and look at each class to see if it has a @Controller, or @Repository, or @Service, or @Component and if it does then Spring will register the class with the bean factory as if you had typed <bean class=”…” /> in the XML configuration files.

Configure the web.xml File :

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

Points To Note :

  • Define DispatcherServlet, that will act as front controller to route the requests

Create a Spring Controller :

LoginController.java

package com.spring.controller;

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

@Controller
public class LoginController {
  @RequestMapping(value = "/login", method = RequestMethod.GET)
  public String init(Model model) {
    model.addAttribute("msg", "Please Enter Your Login Details");
    return "login";
  }

  @RequestMapping(method = RequestMethod.POST)
  public String submit(Model model, @ModelAttribute("loginBean") LoginBean loginBean) {
    if (loginBean != null && loginBean.getUserName() != null & loginBean.getPassword() != null) {
      if (loginBean.getUserName().equals("chandra") && loginBean.getPassword().equals("chandra123")) {
        model.addAttribute("msg", loginBean.getUserName());
        return "success";
      } else {
        model.addAttribute("error", "Invalid Details");
        return "login";
      }
    } else {
      model.addAttribute("error", "Please enter Details");
      return "login";
    }
  }
}

Points To Note :

We have created two handler methods

  • init
    This is a default handler method for HTTP GET requests. The RequestMapping url is “/login”.
  • submit
    This method is called whenever the form get submitted because the HTTP type for this method is POST.
    All the form elements are feeded into LoginBean object and we retrieve them using @ModelAttribute annotation

Run It :

To run this application, we can make use of the bellow URL.

http://localhost:8080/Spring-MVC-LoginForm/login

Spring MVC Login Form Valid CredentialsError Response :

Spring Login Form Invalid CredentialsGiving Valid credentials :

Spring MVC Login Form Valid CredentialsSuccess Page :

Spring MVC Login Success Message

The complete Example is available for download : Spring MVC Login Form Example with STS (NEW)

Happy Learning 🙂

Download Example

About the Author:

Avatar
Founder of onlinetutorialspoint.com Love Java, Python, Shell and opensource frameworks. Follow him on twitter and facebook for latest updates.

25 Comments

  1. Avatar
    vishwanath December 29, 2015 at 8:02 am - Reply

    good one..here in the example there is one user where he is logging and getting the result.my query is if there are multiple users and each users are having different permisions and with specified page.please share such examples.

    • Avatar
      chandrashekhar December 30, 2015 at 4:34 pm - Reply

      Hi Vishwanath,

      Thank you for your comment. Can you please explain your query in detail, so that I can help you better.

      Thankyou,
      Chandrashekhar

      • Avatar
        Virendra February 7, 2016 at 8:17 am - Reply

        Very well demonstrated by you Mr. Chandrashekhar… Nice to have it. 🙂

      • Avatar
        Ravichandra March 14, 2017 at 5:34 am - Reply

        Hi Chandra….

        Very good example for beginners to understand spring MVC…. but can you explain us how to connect it with data base like HSQLDB like that…. because working with data base is necessary in projects….

    • Avatar
      Virendra February 7, 2016 at 8:34 am - Reply

      @Vishwanath
      I think you are wondering about the system which have users with multiple role types such as client, admin, superadmin for example.
      For such scenario you have to follow the same steps as Mr. Chandrashekhar has described, addition to that follow as,
      Step 1: Retrieve user roles from DB as per authentication from your DAO layer.
      Step 2: In Service layer, filter the return value for your view page based on the the user role you retrieved from DB for specific login credentials to your controller class. E.g.

      if(users.getUserRole.equals("amin"))
      {
      return "Admin";
      }
      if(users.getUserRole.equals("client"))
      {
      return "Client";
      }

      Step 3: And eventually, just return that same view name to ViewResolver which you received from Service layer.

      Step4; DONE… ViewResolver will properly navigate the user depending on its user type to its respective pages. Like Admin = Admin.jsp, Client= Client.jsp etc.
      Where all users will have their respective permissions to work in your system.

  2. Avatar
    pradeep March 28, 2016 at 4:42 am - Reply

    i am getting Error-The request sent by the client was syntactically incorrect.

  3. Avatar
    jagriti May 31, 2016 at 11:21 am - Reply

    why you added applicationcontext. xml in web.xml param name

  4. Avatar
    Tejeswar September 4, 2016 at 11:14 am - Reply

    I just downloaded the “Spring MVC Login Form Example With Netbeans” example.In the project itself there was no pom.xml.But in your project structure I am seeing the pom.xml.Am i missing something here.
    Thank you for your help.

    • Avatar
      chandrashekhar September 4, 2016 at 2:54 pm - Reply

      Hi Tejeswar,

      Thanks for following us. The example you have downloaded “Spring MVC Login Form Example With Netbeans” was written based on Ant build.

      For maven you can download the latest one “Spring MVC Login Form Example with STS (NEW)”. It is completely implemented in maven.

      Please don’t hesitate to write comment us, if you find any problem.

      Thanks.

  5. Avatar
    kanchan November 3, 2016 at 3:58 am - Reply

    can u please give example first register then login and then CRUD operation in single project

  6. Avatar
    satya prakash December 9, 2016 at 10:47 am - Reply

    When i submit page i got ” WARN : org.springframework.web.servlet.PageNotFound – Request method ‘POST’ not supported ” this exception and it shows “HTTP Status 405 – Request method ‘POST’ not supported” error at main page.
    Please explain exception ..

  7. Avatar
    Venkatesh December 13, 2016 at 8:14 am - Reply

    Hey i am not finding source file for root-context.xml…. can please send the code .. I am doing project in Maven

  8. Avatar
    Surendra January 19, 2017 at 6:42 am - Reply

    Very Well explained..

    Thank you @chandrashekhar

  9. Avatar
    Obireddy January 22, 2017 at 6:24 am - Reply

    I want login and registration example with spring +hibernate in with explanation… Your explaining way is very impressed me if possible please send fastly

  10. Avatar
    Thiyagarajan April 11, 2017 at 5:27 pm - Reply

    Hi,
    I am new to Spring. I understood the .files which is explained in above post.But I need what are the software requirements and how to add these files in a project. Please need an explanation in Eclipse.

  11. Avatar
    Sheeja May 3, 2017 at 10:08 am - Reply

    I am getting an error HTTP status 405 “Request method ‘GET’ not supported”. Why i’m getting this?

  12. Avatar
    Prasanta May 9, 2017 at 1:20 pm - Reply

    I am getting an error HTTP status 405 “Request method ‘GET’ not supported”

    can anyone explain why?

  13. Avatar
    raza November 19, 2017 at 10:21 am - Reply

    Hi !
    I just had a look at the demo. I have an inventory app developed in spring mvc and security. it takes ages to load login p[age and navigate to other functionalities. I have googled many a times bt there is no conclusive answere

  14. Avatar
    Umesh December 16, 2017 at 8:40 am - Reply

    I am also getting an error HTTP status 405 “Request method ‘GET’ not supported”

    can anyone help me please.

  15. Avatar
    prasanna December 20, 2017 at 10:14 am - Reply

    nice tutorial what i have to do to handle the session

  16. Avatar
    suresh December 21, 2017 at 6:35 am - Reply

    Hello Sir,….Your tutorial is really Good….

    But Netbeans project size is 0 bytes…Please share the login form using netbeans zip file to my email…

  17. Avatar
    Bhavesh March 1, 2018 at 8:49 am - Reply

    I am also getting an error HTTP status 405 “Request method ‘GET’ not supported”

  18. Avatar
    maha July 12, 2018 at 5:27 pm - Reply

    hello did u solve the problem of getting an error HTTP status 405 “Request method ‘GET’ not supported” ??i m using eclipse

    • Avatar
      Arpit July 28, 2019 at 6:25 pm - Reply

      Hi,
      Nice tutorial.

  19. Avatar
    Nehal Raju August 12, 2020 at 12:54 pm - Reply

    Can u send the link for login page using spring mvc and hibernate through NetBeans. share me to my email id

Leave A Comment