纵有疾风起
人生不言弃

SpringBoot使用servletAPI与异常处理

工程结构:

SpringBoot使用servletAPI与异常处理插图

主方法类:

package com.boot.servlet.api.bootservlet;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;// @ServletComponentScan //扫描的方式使用servlet@SpringBootApplication(exclude = ErrorMvcAutoConfiguration.class)public class BootServletApplication {    public static void main(String[] args) {        SpringApplication.run(BootServletApplication.class, args);    }}

Setvlet

package com.boot.servlet.api.bootservlet.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 = "MyServlet",urlPatterns = "/my")public class MyServlet extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        System.out.println("执行了servlet请求");    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doPost(request, response);    }}

过滤器

package com.boot.servlet.api.bootservlet.filter;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import java.io.IOException;@WebFilter(filterName = "MyFilter", urlPatterns = "/*")public class MyFilter implements Filter {    public void destroy() {    }    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {        System.out.println("执行filter");        chain.doFilter(req, resp);    }    public void init(FilterConfig config) throws ServletException {    }}

监听器

package com.boot.servlet.api.bootservlet.listener;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import javax.servlet.http.HttpSessionBindingEvent;@WebListenerpublic class Listener implements ServletContextListener,        HttpSessionListener, HttpSessionAttributeListener {    // Public constructor is required by servlet spec    public Listener() {    }    // -------------------------------------------------------    // ServletContextListener implementation    // -------------------------------------------------------    public void contextInitialized(ServletContextEvent sce) {      /* This method is called when the servlet context is         initialized(when the Web application is deployed).          You can initialize servlet context related data here.      */        System.out.println("servlet容器启动");    }    public void contextDestroyed(ServletContextEvent sce) {      /* This method is invoked when the Servlet Context          (the Web application) is undeployed or          Application Server shuts down.      */    }    // -------------------------------------------------------    // HttpSessionListener implementation    // -------------------------------------------------------    public void sessionCreated(HttpSessionEvent se) {        /* Session is created. */    }    public void sessionDestroyed(HttpSessionEvent se) {        /* Session is destroyed. */    }    // -------------------------------------------------------    // HttpSessionAttributeListener implementation    // -------------------------------------------------------    public void attributeAdded(HttpSessionBindingEvent sbe) {      /* This method is called when an attribute          is added to a session.      */    }    public void attributeRemoved(HttpSessionBindingEvent sbe) {      /* This method is called when an attribute         is removed from a session.      */    }    public void attributeReplaced(HttpSessionBindingEvent sbe) {      /* This method is invoked when an attibute         is replaced in a session.      */    }}

除了使用注解外还可以使用配置类的方式实现:

package com.boot.servlet.api.bootservlet.config;import com.boot.servlet.api.bootservlet.filter.MyFilter;import com.boot.servlet.api.bootservlet.listener.Listener;import com.boot.servlet.api.bootservlet.servlet.MyServlet;import org.springframework.boot.SpringBootConfiguration;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;import org.springframework.boot.web.servlet.ServletRegistrationBean;import org.springframework.context.annotation.Bean;import java.util.Arrays;/** * 通过配置类的方式引入servlet */@SpringBootConfigurationpublic class ServletConfiguration {    @Bean    public ServletRegistrationBean<MyServlet> registrationBean() {        ServletRegistrationBean<MyServlet> bean = new ServletRegistrationBean<>();        bean.setServlet(new MyServlet());        bean.setUrlMappings(Arrays.asList("/my"));        return  bean;    }    @Bean    public FilterRegistrationBean<MyFilter> filterFilterRegistrationBean() {        FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>();        bean.setFilter(new MyFilter());        bean.setUrlPatterns(Arrays.asList("/*"));        return bean;    }    @Bean    public ServletListenerRegistrationBean<Listener> servletListenerRegistrationBean() {        ServletListenerRegistrationBean<Listener> listener = new ServletListenerRegistrationBean<>();        listener.setListener(new Listener());        return listener;    }}

拦截器

package com.boot.servlet.api.bootservlet.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyInteceptor implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        return true;    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("postHandle");    }    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("afterCompletion");    }}

拦截器配置类

package com.boot.servlet.api.bootservlet.config;import com.boot.servlet.api.bootservlet.interceptor.MyInteceptor;import org.springframework.boot.SpringBootConfiguration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;/** * 拦截器配置类 */@SpringBootConfigurationpublic class MyWebMvcConfiguration extends WebMvcConfigurationSupport {    @Override    protected void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(new MyInteceptor());    }}

 

springBoot自定义错误页面处理

默认读取的静态资源位置:”classpath:/META-INF/resources/”, “classpath:/resources/”,
“classpath:/static/”, “classpath:/public/”

非模板: public/error/xxx.html

​模板的: templates/errror/xxx.html

​ 异常处理:

​ 局部@ExceptionHandler

​ 全局@ControllerAdvice+@ExceptionHandler

 

程序演示

结构:

SpringBoot使用servletAPI与异常处理插图1

 

 

package com.example.bootex.exception;/** * 自定义业务异常类 */public class BizException extends RuntimeException {    public BizException() {        super();    }    public BizException(String message) {        super(message);    }    public BizException(String message, Throwable cause) {        super(message, cause);    }    public BizException(Throwable cause) {        super(cause);    }    protected BizException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {        super(message, cause, enableSuppression, writableStackTrace);    }}

 

 

package com.example.bootex.controller;import com.example.bootex.exception.BizException;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.GetMapping;@Controllerpublic class PageController {    /**     * 局部异常处理     * @param ex     * @param model     * @return     */    @ExceptionHandler(BizException.class)    public String exPage1(Exception ex, Model model) {        model.addAttribute("ex", ex);        return  "/error/biz.html";    }    @GetMapping("/e500")    public String e500() {        throw new RuntimeException("runtime-exception");    }    @GetMapping("/add")    public String add() {        throw new BizException("添加出现异常");    }}

 

 

package com.example.bootex.exception;import org.springframework.http.HttpStatus;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseStatus;/** * 全局业务处理 */@ControllerAdvicepublic class GlobalExceptionHandler {    @ExceptionHandler(Exception.class)    @ResponseStatus(code = HttpStatus.NOT_FOUND)    public String e404() {        return "error/404.html";    }    @ExceptionHandler(RuntimeException.class)    @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)    public String e500() {        return "error/500.html";    }}

 

文章转载于:https://www.cnblogs.com/lm970585581/p/9822515.html

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » SpringBoot使用servletAPI与异常处理
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录