Spring MVC - 异常处理
先决条件: Spring MVC
当您的应用程序出现问题时,服务器会显示一个定义异常类型的异常页面,服务器生成的异常页面不是用户友好的。 Spring MVC为您的 Web 应用程序提供异常处理,以确保您将自己的异常页面而不是服务器生成的异常发送给用户。 @ExceptionHandler注解用于检测某些运行时异常并根据异常发送响应。在本文中我们将通过 Spring Mvc 项目来展示如何拦截和定义异常,我们将看看如何定义方法级别以及类级别的异常。
创建应用程序的步骤
首先,创建一个 maven 项目,我们为这个项目使用Eclipse IDE 。现在,搜索 webapp,因为我们正在创建一个 Web 应用程序。选择在创建新项目时创建 maven 并添加 maven webapp 原型。输入项目的组 ID 和工件 ID,然后单击完成。
单击完成后,您的项目结构将如下所示:
pom.xml是使用任何 maven 项目自动创建的,它定义了项目所需的所有依赖项。确保添加此文件中提到的所有依赖项。
XML
4.0.0
com.gfg
SpringMvcExceptionHandling
0.0.1-SNAPSHOT
war
SpringMvcExceptionHandling Maven Webapp
http://www.example.com
UTF-8
1.7
1.7
junit
junit
4.11
test
org.springframework
spring-webmvc
5.1.1.RELEASE
org.apache.tomcat
tomcat-jasper
9.0.12
javax.servlet
servlet-api
3.0-alpha-1
javax.servlet
jstl
1.2
SpringMvcExceptionHandling
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
XML
gfg
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/gfg-servlet.xml
1
gfg
/
XML
/WEB-INF/views/
.jsp
Java
package com.gfg.model;
public class Student {
private String firstName;
private String lastName;
private String rollNo;
public Student(String firstName, String lastName,
String rollNo)
{
super();
this.firstName = firstName;
this.lastName = lastName;
this.rollNo = rollNo;
}
public Student() {}
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 getRollNo() { return rollNo; }
public void setRollNo(String rollNo)
{
this.rollNo = rollNo;
}
}
Java
package com.gfg.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.gfg.model.Student;
@Controller
public class LoginController {
@RequestMapping("/login")
public String showForm(Model theModel) {
theModel.addAttribute("student", new Student());
return "portal";
}
@RequestMapping("/welcome")
public String processForm(@ModelAttribute("welcome") Student student, Model mod) {
mod.addAttribute("FirstName", student.getFirstName());
mod.addAttribute("LastName", student.getLastName());
int n = Integer.parseInt(student.getRollNo());
mod.addAttribute("RollNo", n);
return "welcome";
}
@ExceptionHandler(value = NumberFormatException.class)
public String numberformatHandler(Model theModel) {
theModel.addAttribute("err", "NumberFormatException");
return "error";
}
}
Java
package com.gfg.errorhandler;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(value = NullPointerException.class)
public String nullPointerHandler(Model theModel) {
theModel.addAttribute("err", "NullPointerException");
return "error";
}
@ExceptionHandler(value = Exception.class)
public String AnyOtherHandler() {
return "error";
}
}
HTML
<%@ taglib prefix="form" url="http://www.springframework.org/tags/form" %>
Student Portal
HTML
<%@ taglib prefix="form" url="http://www.springframework.org/tags/form" %>
Student Portal
HTML
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
Opps....
${err} Exception caused
web.xml定义了与不同 URL 和 servlet 的映射,以处理对这些 URL 的请求。
XML
gfg
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/gfg-servlet.xml
1
gfg
/
gfg-servlet.xml文件处理 Web 应用程序的所有 HTTP 请求。组件扫描根据定义的注解定位和分配bean。注解驱动启用spring注解类。 bean 配置有助于识别和扫描位于views 文件夹中的JSP。
XML
/WEB-INF/views/
.jsp
com.gfg.model中的Student类使用三个对象firstName 、 lastName和rollNo定义了 student 对象。请注意,我们将卷号保留为字符串而不是整数,这将有助于我们检查可能的 NumberFormat 异常。
Java
package com.gfg.model;
public class Student {
private String firstName;
private String lastName;
private String rollNo;
public Student(String firstName, String lastName,
String rollNo)
{
super();
this.firstName = firstName;
this.lastName = lastName;
this.rollNo = rollNo;
}
public Student() {}
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 getRollNo() { return rollNo; }
public void setRollNo(String rollNo)
{
this.rollNo = rollNo;
}
}
com.gfg.controller包中的LoginController类定义了两个方法,showForm 方法定义了一个 Get 映射并简单地显示学生登录表单。 processForm 方法有两个参数@ModelAttribute供学生使用,一个Model用于在我们的视图页面中设置属性。 model 参数将所有属性设置为视图页面。请记住,在 Student 类中,我们将rollNo定义为字符串。现在,我们将其解析为 int:这将有助于捕获两个 NumberFormat 异常。如果字符串为空或字符串两者都有字母,它将发送NumberFormatException 。现在,为了捕获该异常并单独处理它以获得更好的用户体验,我们定义了一个方法numberformatHandler并使用@ExceptionHandler对其进行注释, 并将值设置为NumberFormatException.class 。因此,这是一种在方法级别处理异常的方法。
Java
package com.gfg.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.gfg.model.Student;
@Controller
public class LoginController {
@RequestMapping("/login")
public String showForm(Model theModel) {
theModel.addAttribute("student", new Student());
return "portal";
}
@RequestMapping("/welcome")
public String processForm(@ModelAttribute("welcome") Student student, Model mod) {
mod.addAttribute("FirstName", student.getFirstName());
mod.addAttribute("LastName", student.getLastName());
int n = Integer.parseInt(student.getRollNo());
mod.addAttribute("RollNo", n);
return "welcome";
}
@ExceptionHandler(value = NumberFormatException.class)
public String numberformatHandler(Model theModel) {
theModel.addAttribute("err", "NumberFormatException");
return "error";
}
}
com.gfg.errorhandler中的MyExceptionHandler类为我们的应用程序定义了所有异常,因此对于不同类型的异常,用户可以看到正确而简单的错误页面。为了使它可用于我们项目中的所有类,我们只需添加注解@ControllerAdvice,这将建议spring MVC 使用我们的异常方法而不是服务器生成的页面。因此,在此我们在类级别定义了一个异常处理程序。
Java
package com.gfg.errorhandler;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(value = NullPointerException.class)
public String nullPointerHandler(Model theModel) {
theModel.addAttribute("err", "NullPointerException");
return "error";
}
@ExceptionHandler(value = Exception.class)
public String AnyOtherHandler() {
return "error";
}
}
视图文件夹中的portal.jsp文件定义了学生登录门户。
HTML
<%@ taglib prefix="form" url="http://www.springframework.org/tags/form" %>
Student Portal
views 文件夹中的welcome.jsp页面定义了我们的应用程序的欢迎页面。
HTML
<%@ taglib prefix="form" url="http://www.springframework.org/tags/form" %>
Student Portal
error.jsp页面是一个简单的异常处理程序页面,它定义异常的名称并通知用户有关异常的信息。
HTML
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
Opps....
${err} Exception caused
添加所有类和配置文件后,您的项目将如下所示:
现在我们已经完成了我们的项目,是时候在 tomcat 服务器上运行它了,只需启动 tomcat 服务器并输入http:localhost:8080/SpringMvcExceptionHandling/login
因此,在这个Spring MVC项目中,我们在方法和类级别定义了异常处理程序,并定义了我们自己的自定义异常视图页面,以获得更好的用户体验。