📜  Spring MVC - 异常处理

📅  最后修改于: 2022-05-13 01:55:29.079000             🧑  作者: Mango

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类使用三个对象firstNamelastNamerollNo定义了 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项目中,我们在方法和类级别定义了异常处理程序,并定义了我们自己的自定义异常视图页面,以获得更好的用户体验。