码迷,mamicode.com
首页 > 编程语言 > 详细

Servlet3.0与Spring

时间:2019-04-13 23:46:51      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:containe   code   子类   types   cep   users   原理   startup   tty   

 

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

标签:containe   code   子类   types   cep   users   原理   startup   tty   

原文地址:https://www.cnblogs.com/toov5/p/10703441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!