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的实现原理及相互关系。

原文地址:https://www.cnblogs.com/yy3b2007com/p/5227054.html