由于SpringBoot是通过jar包的形式运行,其内部嵌入了Servlet容器,项目中不存在web.xml文件,所以注册三大组件就不能通过web.xml文件注册。
1.注册servlet
创建servlet
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("自定义servlet");
}
}
注册servlet
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.peng.demo.servlet.MyServlet;
@Configuration
public class MyServerConfig {
//注册servlet
@Bean
public ServletRegistrationBean<MyServlet> myServlet() {
ServletRegistrationBean<MyServlet> servletRegistrationBean = new ServletRegistrationBean<MyServlet>(new MyServlet(),"/myServlet");//映射地址
return servletRegistrationBean;
}
}
2.注册Filter
创建filter
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter implements Filter {
//销毁
@Override
public void destroy() {
}
//过滤
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain)
throws IOException, ServletException {
System.out.println("filter执行啦!!!!!!!!!!");
chain.doFilter(arg0, arg1);
}
//初始化
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
注册Filter
//注册Filter
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter());//指定拦截的filter
filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));//指定拦截路径
return filterRegistrationBean;
}
3.注册Listener
创建Listener
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("web应用关闭啦!!!!!!!!!!!!!");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("web应用启动啦!!!!!!!!!!!!!");
}
}
注册Listener
//注册listener
@Bean
public ServletListenerRegistrationBean myListener() {
ServletListenerRegistrationBean servletListenerRegistrationBean=new ServletListenerRegistrationBean(new MyListener());
return servletListenerRegistrationBean;
}
4.总结
SprongBoot注册SpringMVC的DispatcherServlet就是通过这种方式注册的
DispatcherServletRegistrationBean为ServletRegistrationBean的实现类,默认拦截地址通过this.serverProperties.getServlet().getPath()获取,即拦截所有(包括静态资源,不包括jsp)
所以可以通过server.path修改前端控制器默认拦截路径。