zoukankan      html  css  js  c++  java
  • Java Servlet(六):HttpServlet实现原理(jdk7+tomcat7+eclipse)

    本篇记录了HttpServlet的实现过程,主要讲述了如何依赖Servlet,GenericServlet实现的原理。

    HttpServlet实现过程:
    1、是一个Servlet,继承自GenericServlet,针对HTPP协议所定制。

    2、在Servlet的service(ServletRequest request,ServletResponse response)方法中直接把ServletRequest和ServletResponse转为HttpServletRequest和HttpServletResponse,并调用了重载的service(HttpServletRequest request,HttpServletResponse response)。

    3、在service(HttpServletRequest request,HttpServletResponse response) 获取了请求方式:request.getMethod()。根据请求方式创建了doXxx()方法(Xxx为具体的请求方式,比如:doGet,doPost等)。

    4、在实际开发中,直接继承HttpServlet,并根据请求方式复写doXxx()方法接口。
    这样的好处:直接针对具体的请求方式,实现不同的doXxx方法,直接使用HttpServletRequest和HttpServletResponse,不需要进行强转。

    上个章节,记录了GenericServlet的实现过程,确实是给我们带了很大的方便,但是他并没有针对HTTP给出较全面的特殊处理,比如我们要在service(ServletRequest arg0,ServletResponse arg1)中要获取请求方式时,还需要这样处理:

     1 public class LoginServlet extends GenericServlet {
     2     public LoginServlet() {
     3     }
     4 
     5     public void init() {
     6         System.out.println("init....");
     7     }
     8 
     9     public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
    10         // 即使我们继承了GenericServlet,我们还是有些操作不太方便。
    11         // 比如:获取请求方法
    12         HttpServletRequest req = (HttpServletRequest) request;
    13         String requestMethod = req.getMethod();
    14     }
    15 }

    那么我们怎么解决这样的问题呢?

    下边将会给出一种解决方案:

    在工程中新建一个MyHttpServlet类:

     1 package com.dx.hiservlet;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.ServletRequest;
     7 import javax.servlet.ServletResponse;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 /**
    12  * 针对HTPP协议定义的一个Servlet
    13  * */
    14 public class MyHttpServlet extends MyGenericServlet{
    15 
    16     public MyHttpServlet() {
    17         // TODO Auto-generated constructor stub
    18     }
    19 
    20     @Override
    21     public void service(ServletRequest arg0, ServletResponse arg1) 
    22             throws ServletException, IOException {
    23         if(arg0 instanceof HttpServletRequest){
    24             HttpServletRequest request=(HttpServletRequest)arg0;
    25             if(arg0 instanceof HttpServletResponse){
    26                 HttpServletResponse response=(HttpServletResponse)arg1;
    27                 
    28                 service(request,response);
    29             }
    30         }
    31     }
    32     
    33     public void service(HttpServletRequest request,HttpServletResponse response)
    34             throws ServletException, IOException {
    35         // 1. 获取请求方式。
    36         String method= request.getMethod();
    37         
    38         // 2.根据请求方式,调用相应处理方法。
    39         if(method.toUpperCase().equals("GET")){            
    40             doGet(request,response);
    41         }else if(method.toUpperCase().equals("POST")){    
    42             doPost(request,response);
    43         }
    44         // ...
    45     }
    46 
    47     public void doGet(HttpServletRequest request, HttpServletResponse response)
    48             throws ServletException, IOException { 
    49             
    50     }
    51     
    52     public void doPost(HttpServletRequest request, HttpServletResponse response)
    53             throws ServletException, IOException {
    54         // TODO Auto-generated method stub
    55         
    56     }
    57 
    58 
    59 }

    我们重新定义一个LoginServlet2继承MyHttpServlet类。

    package com.dx.hiservlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginServlet2 extends MyHttpServlet{
    
        public LoginServlet2() {
            // TODO Auto-generated constructor stub
        }
        
        @Override
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {    
            String method = request.getMethod();
    
        }
        
        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response) 
                throws ServletException, IOException {
            
        }
    
    }

    如果使用过HttpServlet或查看过HttpServlet源码的话,就会发现原来我们目前的MyHttpServlet,就是HttpServlet的一个简化实现。

    综合前几个章节,相信已经可以掌握GenericeServlet、HttpServlet的实现原理及相互关系。

  • 相关阅读:
    第一次作业
    第五次作业
    第三次作业
    第六次作业
    第二次作业
    scikitlearn学习 决策树
    [阅读]Think Python CH3 Functions
    [阅读]Think Python CH2 Variables, Expressions, and Statements
    [阅读]Think Python CH1 The Way of the Program
    Hive操作符和函数
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/5227054.html
Copyright © 2011-2022 走看看