工程结构:
主方法类:
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;
@WebListener
public 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
*/
@SpringBootConfiguration
public 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;
/**
* 拦截器配置类
*/
@SpringBootConfiguration
public 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
程序演示
结构:
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; @Controller public 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; /** * 全局业务处理 */ @ControllerAdvice public 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"; } }
|