zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    构造方法中使用this的含义
    Android Bundle类
    Android中使用PULL方式解析XML文件
    Android 创建与解析XML(四)—— Pull方式
    File的getPath()和getAbsolutePath()和getCanonicalPath()的区别
    Android-取出SDcard卡下指定后缀名的文件
    page、request、session和application有什么区别?
    prepareStatement的用法和解释
    pageContext对象的用法
    使用JSP连接MySql数据库读取HTML表单数据进行存贮
  • 原文地址:https://www.cnblogs.com/toov5/p/10703441.html
Copyright © 2011-2022 走看看