本篇记录了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的实现原理及相互关系。