• springboot


    应用不用Spring MVC, 采用ErrorPageRegistrar 接口能直接映射errors。

    1、概览

    2、java代码

    1)、MyAppServlet

    package com.ebc.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet(name = "appServlet", urlPatterns = "/app/*")
    public class MyAppServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            String requestURI = req.getRequestURI();
            if (requestURI.endsWith("test")) {
                throw new RuntimeException("test exception from " + requestURI);
            } else if (requestURI.endsWith("test2")) {
                throw new ServletException("test servlet exception");
            } else {
                resp.getWriter().println("Response from appServlet at " + requestURI);
            }
        }
    }

    2)、MyErrorPageRegistrar

    package com.ebc.servlet;
    
    import org.springframework.boot.web.server.ErrorPage;
    import org.springframework.boot.web.server.ErrorPageRegistrar;
    import org.springframework.boot.web.server.ErrorPageRegistry;
    import org.springframework.http.HttpStatus;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyErrorPageRegistrar implements ErrorPageRegistrar {
    
        @Override
        public void registerErrorPages(ErrorPageRegistry registry) {
            registry.addErrorPages(
                    createNotFoundErrorPage(),
                    createRuntimeExceptionPage(),
                    createOtherErrorPage());
        }
    
        private ErrorPage createNotFoundErrorPage() {
            return new ErrorPage(HttpStatus.NOT_FOUND, "/notFoundServlet");
        }
    
        private ErrorPage createRuntimeExceptionPage() {
            return new ErrorPage(RuntimeException.class, "/runtimeExceptionHandler");
        }
    
        private ErrorPage createOtherErrorPage() {
            return new ErrorPage(Throwable.class, "/WEB-INF/internal-error.jsp");
        }
    }

    3)、NotFoundServlet

    package com.ebc.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet(name = "not-found-error-servlet", urlPatterns = "/notFoundServlet")
    public class NotFoundServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            resp.setContentType("text/html");
            PrintWriter writer = resp.getWriter();
            writer.write("<h2>Page not found </h2>");
            String requestUri = (String) req.getAttribute("javax.servlet.error.request_uri");
            writer.write("request uri: " + requestUri);
            writer.write("<br>Response from " + this.getClass());
        }
    }

    4)、RuntimeExceptionServlet

    package com.ebc.servlet;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet(name = "runtime-handler-servlet", urlPatterns = "/runtimeExceptionHandler")
    public class RuntimeExceptionServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
    
            resp.setContentType("text/html");
            PrintWriter writer = resp.getWriter();
            writer.write("<h2>RuntimeException</h2>");
    
            String requestUri = (String) req.getAttribute(RequestDispatcher.ERROR_REQUEST_URI);
            writer.write("request uri: " + requestUri);
            Integer code = (Integer) req.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
            writer.write("<br>status code: " + code);
            String errorMessage = (String) req.getAttribute(RequestDispatcher.ERROR_MESSAGE);
            writer.write("<br>error message: " + errorMessage);
            writer.write("<br>Response from "+this.getClass());
        }
    }

    5)、MyApplication

    package com.ebc;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletComponentScan;
    
    @SpringBootApplication
    @ServletComponentScan
    public class MyApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    
    }

    3、internal-error.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h3>Error on server side</h3>
    <p>
        <%= request.getAttribute("javax.servlet.error.exception") %>
    </p>
    <p>From jsp page.</p>
    </body>
    </html>

    4、pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
    </dependencies>

    5、执行

  • 相关阅读:
    springboot动态修改日志级别
    加密算法之RSA算法
    关于 BeanDefinitionOverrideException的解析
    Hive基础知识总结
    Java中的字符串替换:replace/replaceAll/StringTemplate
    xxl-job简介&整体架构设计
    java启动springboot jar包后台不挂断运行
    java自定义线程名称
    idea2019.2.2版本激活
    Log4j的MDC机制如何在线程池中使用
  • 原文地址:https://www.cnblogs.com/yaoyuan2/p/11903650.html
Copyright © 2020-2023  润新知