A good web application should have the perfect exception handling mechanism so that the user will not be rendered with any unhandled exception thrown. Spring MVC provides a great way to handle this exception with the help of @ExceptionHandler annotation. We simply have to annotate a method with @ExceptionHandler annotation and that method will be called automatically when the exception occurred. Let’s see how Spring handles an exception.
Let’s again take our Spring MVC Registration Form example here too with a slight modification.
Folder Structure :
- Create a Dynamic Web Project RegistrationForm and create a package for our src files “com.javainterviewpoint“
- Place the Spring 3 jar files under WEB-INF/Lib
commons-logging-1.1.1.jar
log4j-1.2.16.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
spring-aspects-3.2.4.RELEASE.jar
spring-beans-3.2.4.RELEASE.jar
spring-context-3.2.4.RELEASE.jar
spring-core-3.2.4.RELEASE.jar
spring-expression-3.2.4.RELEASE.jar
spring-web-3.2.4.RELEASE.jar
spring-webmvc-3.2.4.RELEASE.jar - Put the index.jsp under the WebContent directory.
- Create the Java classes RegistrationController.java and RegistrationBean.java under com.javainterviewpoint folder.
- Place the SpringConfig-servlet.xml and web.xml under the WEB-INF directory
- View files RegistrationForm.jsp and exceptionPage.jsp are put under the sub directory under WEB-INF/Jsp
RegistrationController.java
package com.javainterviewpoint; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.validation.Valid; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @Controller public class RegistrationController { @ModelAttribute("professionList") public List populateProfessionList() { List professionList = new ArrayList(); professionList.add("Devloper"); professionList.add("Manager"); professionList.add("Architecht"); return professionList; } @ModelAttribute("hobbyList") public List populateHobbyList() { List hobbyList = new ArrayList(); hobbyList.add("Cricket"); hobbyList.add("Football"); hobbyList.add("Hockey"); hobbyList.add("Basketball"); return hobbyList; } @RequestMapping("/dispForm") public String displayForm(Map model) { RegistrationBean rb = new RegistrationBean(); model.put("rb",rb); return "registrationForm"; } @RequestMapping(value="/register",method=RequestMethod.POST) public String processRegistration(@ModelAttribute("rb") RegistrationBean rb) throws IOException { if(rb.getFirstName().length()>5) { throw new IOException("IOException has occured"); } return "success"; } @ExceptionHandler(IOException.class) public ModelAndView processException(IOException ioe) { ModelAndView mav = new ModelAndView("exceptionPage"); mav.addObject("name", ioe.getClass().getSimpleName()); mav.addObject("message", ioe.getMessage()); return mav; } }
In our controller class we have thrown up a IOException when the length of the firstName is greater than 5.
The “processException()” method is annotated with @ExceptionHandler(IOException.class) , which handles IOException whenever occured and returns the view “exceptionPage” so that the user will not be rendered with the all the stack trace instead with a clear exception type and exception message.
exceptionPage.jsp
<%@ 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>Insert title here</title> </head> <body> <h3 style="color: red">Ops!! Something went wrong!</h3> <h5 style="color: red">${name}</h5><br> <h5 style="color: red">${message}</h5> </body> </html>
This page will be rendered to the user when IOException occurs.
Index.jsp
This is simply a start-up page which redirects the user to our RegistrationForm.
<%@ 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>Insert title here</title> </head> <body> <a href="displayForm.html">Click here to Register</a> </body> </html>
RegistrationForm.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ 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=ISO-8859-1"> <title>Insert title here</title> </head> <body> <form:form action="register" method="post" commandName="rb"> <table> <tr><td>First Name</td><td><form:input path="firstName"/></td></tr> <tr><td>Last Name</td><td><form:input path="lastName"/></td></tr> <tr><td>Email</td><td><form:input path="email"/></td></tr> <tr><td>Profession</td><td><form:select path="profession" items="${professionList}"></form:select></td><td></td></tr> <tr><td>Hobby</td><td><form:checkboxes items="${hobbyList}" path="hobby"/></td></tr> <tr><td></td><td><input type="submit" value="Register"></td></tr> </table> </form:form> </body> </html>
RegistraionBean.java
package com.javainterviewpoint; public class RegistrationBean { String firstName; String lastName; String email; String profession; String[] hobby; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getProfession() { return profession; } public void setProfession(String profession) { this.profession = profession; } public String[] getHobby() { return hobby; } public void setHobby(String[] hobby) { this.hobby = hobby; } }
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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee%20 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <servlet> <servlet-name>SpringConfig</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringConfig</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
Spring Configuration File
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" 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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <context:component-scan base-package="com.javainterviewpoint"></context:component-scan> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/Jsp/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
Let’s Run our application and see how it behaves
Enter any value in the firstName field greater than 5 character length and submit the form.
http://localhost:8080/Spring_MVC_ExceptionHandler/
Leave a Reply