servlet工作原理_JAVA技术篇
一个请求发送到服务器后,容器通过web.xml配置文件找到对象的Servlet,通过反射创建实例,调用里面的service方法。
service方法在GenericServlet里面是一个抽象方法,是到HttpServlet里面来实现的。其实质是通过发送上来的请求,孝作文取到请求行里面的请求方法类型,判断是什么类型的请求,在service方法里面去调对应的doXXX方法 。
service方法在GenericServlet里面是一个抽象方法,是到httpServlet里面来实现的。其实质是通过发送上来的请求,取到请求行里面的请求方法类型,
http方法 请求的URL HTTP版本
GET /lovobook/index.html HttP/1.1
Host:127.0.0.1:80 这一行以下的全属于请求头:
User-Agent:Mozilla/5.0
Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=
0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept=Language:zh-cn,zh;q=0.5
Accept-Encoding:gzip,deflate
Accept-Charset:gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive:300
HTTP请求方法类型:GET HEAD POST PUT DELETE OPTIONS TRACE
HttpServlet处理方法:doGet doHead doPost doPut doDelete doOptions doTrace;
HttpServlet实现采用的是模板方法模式,它在service方法里面调用自己类里面的doXXX方法,只是写的一个模板在哪个地方。所有的处理都必须在子类里面去实现。。
其代码大致往下:
protected void service
throws ServletException, IOException
{
//取得请求方法类型,如:GET,这个是容器去做的,做了些处理,变成了METHOD_GET。
String method = req.getMethod;
if ) {
long lastModified = getLastModified;
if {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
//这个是调用本类的doGet,但在我们使用时,这个方法都被重写了。
doGet;
} else {
long ifModifiedSince = req.getDateHeader;
if ) {
// If the servlet mod time is later, call doGet
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified;
doGet;
} else {
resp.setStatus;
}
}
} else if ) {
long lastModified = getLastModified;
maybeSetLastModified;
doHead;
} else if ) {
doPost;
} else if ) {
doPut;
} else if ) {
doDelete;
} else if ) {
doOptions;
} else if ) {
doTrace;
} else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
//
String errMsg = lStrings.getString;
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format;
resp.sendError;
}
}