springmvc 源码分析(一)

一. servlet 3.0 的使用

  1.1 环境搭建:

         servlet跟spring没有任何关系,我创建一个servlet可以不依赖spring,现在搭建一个纯的servlet项目,并实现简单的类似springMVC的功能:

引入依赖:

   <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>8.0.1</version>
      <scope>provided</scope>
    </dependency>

项目的结构:

              

 1.2    web 三大组件的创建 servlet filter listener:

           自己创建的servlet可以直接实现Servlet接口,也可以继承HttpServlet

               

public class DispatcherServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.getWriter().write("test");
    }
}

        自己创建的filter要实现Filter接口:

public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest=(HttpServletRequest) request;
        String userName = httpServletRequest.getParameter("userName");
        if(!"xiaoMing".equals(userName)){
            response.getWriter().write("用户名不正确");
            return;
        }
        chain.doFilter(request,response);
    }
}

    
       自己创建的监听器需要实现下面接口:

public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext sc = sce.getServletContext();
        //todo 可以用sc注册各种组件

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }
}

配置路径映射的三种方式:

     方式1: 在web.xml中配置:

    

      方式2: servlet3.0的方式,使用注解实现

    

      方式3: 通过servletContex来注册:这里要用到servlet的3.0的一个SPI规范: tomcat容器在启动时,会找到类路径下:  META-INF/services/javax.servlet.ServletContainerInitializer 这个文件,文件名是固定的,为ServletContainerInitializer类的全限定类名,

    文件里面的内容,为实现ServletContainerInitializer该接口的类的全限定类名,tomcat会调用该类的onStartup方法:

      那么我们可以定义一个类来实现它:

    

     然后在类路径下:

              



 
 

 

    

    

    


   

     


      

 

猜你喜欢

转载自www.cnblogs.com/yangxiaohui227/p/13187719.html