WarApplication
package com.lv.study;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
/**
* Created by lvyanghui
* 2018/7/12 9:53
*/
@SpringBootApplication
@ServletComponentScan
public class WarApplication {
/**
* 当使用Spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet、Filter和Servlet规范的所有监听器(如HttpSessionListener监听器)。
Spring boot 的主 Servlet 为 DispatcherServlet,其默认的url-pattern为“/”。也许我们在应用中还需要定义更多的Servlet,该如何使用SpringBoot来完成呢?
在spring boot中添加自己的Servlet有两种方法,代码注册Servlet和注解自动注册(Filter和Listener也是如此)。
一、代码注册通过ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 获得控制。
也可以通过实现 ServletContextInitializer 接口直接注册。
二、在 SpringBootApplication 上使用@ServletComponentScan 注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码
* @param args
*/
public static void main(String[] args){
SpringApplication.run(WarApplication.class, args);
}
/**
* 使用代码注册Servlet(不需要@ServletComponentScan注解)
* @return
*/
/*@Bean
public ServletRegistrationBean registrationBean(){
return new ServletRegistrationBean(new ServletTest(),"/servlet*//*");
}*/
/**
* 修改DispatcherServlet默认配置
* @create 2016年1月6日
*/
/*@Bean
public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet);
registration.getUrlMappings().clear();
registration.addUrlMappings("*.do");
registration.addUrlMappings("*.json");
return registration;
}*/
}
FilterTest
package com.lv.study.filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* Created by lvyanghui
* 2018/7/12 15:01
*/
@WebFilter(urlPatterns="/*")
public class FilterTest implements Filter {
private static final Logger logger = LoggerFactory.getLogger(FilterTest.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("FilterTest init()");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
logger.info("FilterTest doFilter()");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
logger.info("FilterTest destroy()");
}
}
InterceptotStudy
package com.lv.study.interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by lvyanghui
* 2018/7/12 15:29
*/
public class InterceptotStudy implements HandlerInterceptor{
private static final Logger logger = LoggerFactory.getLogger(InterceptotStudy.class);
/**
* HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。
实现 UserRoleAuthorizationInterceptor 的拦截器有:
ConversionServiceExposingInterceptor
CorsInterceptor
LocaleChangeInterceptor
PathExposingHandlerInterceptor
ResourceUrlProviderExposingInterceptor
ThemeChangeInterceptor
UriTemplateVariablesHandlerInterceptor
UserRoleAuthorizationInterceptor
其中 LocaleChangeInterceptor 和 ThemeChangeInterceptor 比较常用。
配置拦截器也很简单,Spring 为什么提供了基础类WebMvcConfigurerAdapter ,我们只需要重写 addInterceptors 方法添加注册拦截器。
实现自定义拦截器只需要3步:
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
2、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)
*
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
logger.info(">>>InterceptotStudy>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
logger.info(">>>InterceptotStudy>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
logger.info(">>>InterceptotStudy>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
}
}
InterceptotTest
package com.lv.study.interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by lvyanghui
* 2018/7/12 15:29
*/
public class InterceptotTest implements HandlerInterceptor{
/**
* HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。
实现 UserRoleAuthorizationInterceptor 的拦截器有:
ConversionServiceExposingInterceptor
CorsInterceptor
LocaleChangeInterceptor
PathExposingHandlerInterceptor
ResourceUrlProviderExposingInterceptor
ThemeChangeInterceptor
UriTemplateVariablesHandlerInterceptor
UserRoleAuthorizationInterceptor
其中 LocaleChangeInterceptor 和 ThemeChangeInterceptor 比较常用。
配置拦截器也很简单,Spring 为什么提供了基础类WebMvcConfigurerAdapter ,我们只需要重写 addInterceptors 方法添加注册拦截器。
实现自定义拦截器只需要3步:
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
2、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)
*
*/
private static final Logger logger = LoggerFactory.getLogger(InterceptotTest.class);
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
logger.info(">>>InterceptotTest>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
logger.info(">>>InterceptotTest>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
logger.info(">>>InterceptotTest>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
}
}
WebAppConfigureTest
package com.lv.study.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* Created by lvyanghui
* 2018/7/12 15:33
*/
@Configuration
public class WebAppConfigureTest extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(new InterceptotStudy()).addPathPatterns("/**");
registry.addInterceptor(new InterceptotTest()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
HttpSessionListenerTest
package com.lv.study.listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* Created by lvyanghui
* 2018/7/12 15:09
*/
@WebListener
public class HttpSessionListenerTest implements HttpSessionListener{
private static final Logger logger = LoggerFactory.getLogger(HttpSessionListenerTest.class);
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
logger.info("sessionCreated 创建了");
logger.info(httpSessionEvent.getSession().toString());
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
logger.info("sessionDestroyed 销毁了");
}
}
ServletContextListenerTest
package com.lv.study.listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* Created by lvyanghui
* 2018/7/12 15:07
*/
@WebListener
public class ServletContextListenerTest implements ServletContextListener{
private static final Logger logger = LoggerFactory.getLogger(ServletContextListenerTest.class);
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
logger.info("ServletContex初始化");
logger.info(servletContextEvent.getServletContext().getServerInfo());
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
logger.info("ServletContex销毁");
}
}
SchedulingConfig
package com.lv.study.scheduling;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* Created by lvyanghui
* 2018/7/20 15:14
*/
@Configuration
@EnableScheduling
public class SchedulingConfig {
private static final Logger logger = LoggerFactory.getLogger(SchedulingConfig.class);
//@Scheduled(cron = "0/20 * * * * ?") // 每20秒执行一次
public void schedul(){
logger.info("..............schedul.......");
}
}
ServletScan
package com.lv.study.servlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
/**
* Created by lvyanghui
* 2018/7/12 14:37
*/
@WebServlet(urlPatterns="/servlet/scan",description="自定义servlet")
public class ServletScan extends HttpServlet{
private static final Logger logger = LoggerFactory.getLogger(ServletScan.class);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("ServletTest调用doGet方法");
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info(">>>>>>>>>>doPost()<<<<<<<<<<<");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>大家好,我的名字叫Servlet6666666</h1>");
out.println("</body>");
out.println("</html>");
}
}
ServletTest
package com.lv.study.servlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
/**
* Created by lvyanghui
* 2018/7/12 14:37
*/
@WebServlet(urlPatterns="/servlet/*",description="自定义servlet")
public class ServletTest extends HttpServlet{
private static final Logger logger = LoggerFactory.getLogger(ServletScan.class);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("ServletTest调用doGet方法");
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info(">>>>>>>>>>doPost()<<<<<<<<<<<");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>大家好,我的名字叫Servlet</h1>");
out.println("</body>");
out.println("</html>");
}
}
StartRunnerStudy
package com.lv.study.startrunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* Created by lvyanghui
* 2018/7/12 15:52
*/
@Component
@Order(value = 2)
public class StartRunnerStudy implements CommandLineRunner{
private static final Logger logger = LoggerFactory.getLogger(StartRunnerStudy.class);
@Override
public void run(String... strings) throws Exception {
logger.info("启动springboot时需要加载数据等其他操作-----------StartRunnerStudy");
}
}
StartRunnerTest
package com.lv.study.startrunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* Created by lvyanghui
* 2018/7/12 15:52
*/
@Component
@Order(value = 1)
public class StartRunnerTest implements CommandLineRunner{
private static final Logger logger = LoggerFactory.getLogger(StartRunnerTest.class);
@Override
public void run(String... strings) throws Exception {
logger.info("启动springboot时需要加载数据等其他操作-----------StartRunnerTest");
}
}