本篇记录了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)中要获取请求方式时,还需要这样处理:
public class LoginServlet extends GenericServlet {
public LoginServlet() {
} public void init() {
System.out.println("init....");
} public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// 即使我们继承了GenericServlet,我们还是有些操作不太方便。
// 比如:获取请求方法
HttpServletRequest req = (HttpServletRequest) request;
String requestMethod = req.getMethod();
}
}
那么我们怎么解决这样的问题呢?
下边将会给出一种解决方案:
在工程中新建一个MyHttpServlet类:
package com.dx.hiservlet; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* 针对HTPP协议定义的一个Servlet
* */
public class MyHttpServlet extends MyGenericServlet{ public MyHttpServlet() {
// TODO Auto-generated constructor stub
} @Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
if(arg0 instanceof HttpServletRequest){
HttpServletRequest request=(HttpServletRequest)arg0;
if(arg0 instanceof HttpServletResponse){
HttpServletResponse response=(HttpServletResponse)arg1; service(request,response);
}
}
} public void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
// 1. 获取请求方式。
String method= request.getMethod(); // 2.根据请求方式,调用相应处理方法。
if(method.toUpperCase().equals("GET")){
doGet(request,response);
}else if(method.toUpperCase().equals("POST")){
doPost(request,response);
}
// ...
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub } }
我们重新定义一个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的实现原理及相互关系。