Servlet3.0与Spring
Posted toov5
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet3.0与Spring相关的知识,希望对你有一定的参考价值。
servlet filter listener web.xml
DispatcherServlet web.xml
后期 servlet3.0我们去除web.xml 通过注解方式
同时需要servlet7以上
创建web项目:
不需要生成web.xml了
此时是没有web.xml文件的
jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <a href="hello"> hello </a> </body> </html>
servlet:
@WebServlet("/hello") public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("hello"); } }
其他的注解 @WebFilter @WebListener @WebInitParam
接口:
public interface HelloService { }
子类:
public interface HelloServiceExt extends HelloService { }
实现类:
public class HelloServiceImpl implements HelloService { }
抽象类:
public abstract class AbstractHelloService implements HelloService { }
实现指定接口:
// 容器启动的时候会将@HandlesTypes指定的这个类下面的子类(实现类,子接口)传递过来 @HandlesTypes(value= {HelloService.class}) public class MyServletContainerInitializer implements ServletContainerInitializer{ @Override public void onStartup(Set<Class<?>> arg0, ServletContext arg1) throws ServletException { System.out.println("感兴趣的类型:"); for(Class<?> clazz : arg0) { System.out.println(clazz); } } }
创建目录结构:
写入全类名:
com.toov5.servlet.MyServletContainerInitializer
运行:
我们可以通过这个进行反射呢 可以获取反射后的对象
过程原理:
servlet容器启动会扫描当前应用里面的 每一个jar包
ServletContainerInitializer的实现
提供ServletCOntainerInitializer的实现类,必须绑定在 META-INF/servicesjavax.ServletContainerInitializer
文件的内容就是 ServletContainerInitializer实现类的全类名
总结: 容器在启动时候,会扫描当前应用每一个jar包里面
META-INF/services/javax.servlet.ServletContainerInitializer
指定的实现类,启动并运行这个实现类的方法; 插入感兴趣的类型
感兴趣的某个子类可以进行创建对象之类的
给 ServletContext 对象注册web容器的三大组件
使用ServletContext注册web组件的用法 web组件:Servlet、 Filter、 Listener 三大组件
如果是第三方的 原先可以通过配置web.xml进行设置
监听器:
//监听项目的启动和停止 public class UserListener implements ServletContextListener { //监听ServletContext销毁 @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("UserListener...contextDestroyed"); } //监听ServletContext启动初始化 @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println("UserListener...contextInitialized"); } }
过滤器:
public class UserFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { //过滤请求 System.out.println("UserFilter...doFilter"); //放行 arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
servlet:
public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("toov5"); } }
注册组件:
// 容器启动的时候会将@HandlesTypes指定的这个类下面的子类(实现类,子接口)传递过来 @HandlesTypes(value= {HelloService.class}) public class MyServletContainerInitializer implements ServletContainerInitializer{ @Override public void onStartup(Set<Class<?>> arg0, ServletContext sc) throws ServletException { System.out.println("感兴趣的类型:"); for(Class<?> clazz : arg0) { System.out.println(clazz); } //注册组件 Dynamic servlet = (Dynamic) sc.addServlet("UserServlet", new UserServlet()); //配置Servlet的映射信息 servlet.addMapping("/user"); //注册Listener sc.addListener(UserListener.class); //注册Filter javax.servlet.FilterRegistration.Dynamic filter = sc.addFilter("userFiter", UserFilter.class); //配置Filter的映射信息 filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); } }
监听到容器启动:
同时访问首页 filter也运行了
访问之:
拦截器被调用
servlet被触发执行
这样就使用了编码方式,在项目启动时候给ServletContext 里面添加组件
必须在项目启动时候添加
ServletContainerInitializer 得到 ServletContext
ServletContextListener 得到 ServletContext
以上是关于Servlet3.0与Spring的主要内容,如果未能解决你的问题,请参考以下文章
spring boot基础之servlet3.0和spring4.x零配置相关文章