SpringBoot MVC 靜態(tài)資源存放和訪問
在SpringBoot中提供幾個約定的靜態(tài)資源存放路徑。
src/main/resources/public (優(yōu)先級最低)
src/main/resources/static
src/main/resources/resources
src/main/resources/META-INF/resources (優(yōu)先級最高)
自定義靜態(tài)資源路徑,需要定義配置類
@Configuration
public class MyStaticConfiguration implements WebMvcConfigurer{
? ? public void addResourceHandlers(ResourceHandlerRegistry registry) {
? ? ? ? registry.addResourceHandler("/**").addResourceLocations(
? ? ? ? ? ? ? ? "classpath:/mystatic/",
? ? ? ? ? ? ? ? "classpath:/resources/",
? ? ? ? ? ? ? ? "classpath:/static/",
? ? ? ? ? ? ? ? "classpath:/public/"
? ? ? ? ? ? ? ? );? } }
SpringBoot MVC異常處理機制
SpringBoot底層提供了一個ErrorMvcAutoConfiguration自動配置組件,創(chuàng)建了一個BasicErrorController對象,該Controller提供了/error請求響應(yīng)處理,當框架一旦捕獲到程序異常就會自動轉(zhuǎn)發(fā)/error請求,就會看到一個白板提示頁面“Whitelabel Error Page”。
1.如果需要自定義異常界面,可以編寫一個ErrorController覆蓋底層自動配置BasicErrorController功能。
@Controller
public class MyErrorController implements ErrorController{
? ? @RequestMapping("/error")
? ? public ModelAndView errorHtml() {
? ? ? ? ModelAndView mav = new ModelAndView();
? ? ? ? mav.setViewName("myerror");
? ? ? ? return mav;? }
? ? @Override
? ? public String getErrorPath() {
? ? ? ? return "/error"; } }
2.如果需要處理某一個或多個Controller中產(chǎn)生的異常,使用@ExceptionHandler標記
//在Controller類中添加下面的方法
@ExceptionHandler
@ResponseBody
public String errorException(Exception ex) {
? ? return "發(fā)生異常:"+ex.getClass().getName();
}
如果需要重用,可以將該方法封裝,采用繼承形式使用。如果使用@ControllerAdvice表示所有Controller繼承使用了。
@ControllerAdvice//等價于其他controller都繼承BasicController
public class BasicController {
? ? @ExceptionHandler
? ? @ResponseBody
? ? public String errorException(Exception ex) {
? ? ? ? return "發(fā)生異常:"+ex.getClass().getName();? } }
SpringBoot MVC攔截器
1.編寫攔截器組件,實現(xiàn)HandlerInterceptor接口
preHandle、postHandle、afterCompletion
@Component
public class CheckLoginInterceptor implements HandlerInterceptor{
? ? public boolean preHandle(HttpServletRequest request,
? ? ? ? ? ? HttpServletResponse response, Object handler)
? ? ? ? ? ? throws Exception {
? ? ? ? Object user = request.getSession().getAttribute("user");
? ? ? ? if(user == null) {
? ? ? ? ? ? //設(shè)置響應(yīng)界面
? ? ? ? ? ? response.sendRedirect("/tologin");
? ? ? ? ? ? return false;//表示未登錄 }
????????return true;//表示已登錄 }}
2.配置攔截器,實現(xiàn)WebMvcConfigurer接口
@Component
public class InterceptorConfiguration implements WebMvcConfigurer{
? ? @Autowired
? ? private CheckLoginInterceptor check;
? ? public void addInterceptors(InterceptorRegistry registry) {
? ? ? ? registry.addInterceptor(check).addPathPatterns("/**").excludePathPatterns("/tologin"); }}
SpringBoot Servlet/Filter
Filter使用
1.編寫Filter組件,實現(xiàn)Filter接口
2.配置Filter組件
使用@Bean+FilterRegistrationBean配置
@Configuration
public class ServletConfiguration {
? ? @Bean
? ? public FilterRegistrationBean<Filter> checkLoginFilter(){
? ? ? ? FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<Filter>();
? ? ? ? bean.setFilter(new CheckLoginFilter());
? ? ? ? List<String> urls = new ArrayList<String>();
? ? ? ? urls.add("/*");
? ? ? ? bean.setUrlPatterns(urls);
? ? ? ? return bean;? } }
提示:多個Filter執(zhí)行順序按bean.setOrder(1)指定。
使用@ServletComponentScan+@WebFilter配置
@WebFilter(filterName="checkLoginFilter",urlPatterns= {"/*"})
public class CheckLoginFilter implements Filter{
? ? @Override
? ? public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
? ? ? ? ? ? throws IOException, ServletException {
? ? ? ? HttpServletRequest httpRequest = (HttpServletRequest)request;
? ? ? ? HttpServletResponse httpResponse = (HttpServletResponse)response;
? ? ? ? String uri = httpRequest.getRequestURI();
? ? ? ? if(!uri.equals("/tologin")) {
? ? ? ? ? ? Object user = httpRequest.getSession().getAttribute("user");
? ? ? ? ? ? if(user==null) {
? ? ? ? ? ? ? ? //未登錄
? ? ? ? ? ? ? ? httpResponse.sendRedirect("/tologin");
? ? ? ? ? ? ? ? return; } }
? ? ? ? chain.doFilter(httpRequest, httpResponse);? } }
啟動類前面追加@ServletComponentScan
@SpringBootApplication
@MapperScan(basePackages= {"cn.xdl.dao"})
@ServletComponentScan//掃描servlet、filter、listener
public class RunBoot {
? ? public static void main(String[] args) {
? ? ? ? SpringApplication.run(RunBoot.class, args); } }
提示:多個Filter執(zhí)行順序按類名字典順序調(diào)用。
SpringBoot Servlet
1.編寫Servlet組件,繼承HttpServlet
2.配置Servlet組件
使用@Bean+ServletRegistrationBean配置
@Bean
public ServletRegistrationBean<Servlet> someServlet(){
? ? ServletRegistrationBean<Servlet> bean = new ServletRegistrationBean<Servlet>();
? ? bean.setServlet(new SomeServlet());
? ? bean.setLoadOnStartup(1);
? ? List<String> urls = new ArrayList<String>();
? ? urls.add("/some");
? ? urls.add("/some.do");
? ? bean.setUrlMappings(urls);
? ? return bean; }
使用@ServletComponentScan+@WebServlet配置
@WebServlet(name="helloservlet",urlPatterns= {"/some","/some.do"})
public class SomeServlet extends HttpServlet{
? ? public void service(HttpServletRequest request,HttpServletResponse response) throws IOException {
? ? ? ? ? ? PrintWriter out = response.getWriter();
? ? ? ? ? ? out.println("Hello Servlet");
? ? ? ? ? ? out.flush();
? ? ? ? ? ? out.close();? } }