JSP&Servlet 学习笔记(二)

5,从容器到HttpServlet

请求过程:

当请求来到HTTP服务器,而HTTP服务器转交请求给容器时,容器会创建一个代表当次请求的HttpServletRequest对象,

并将请求相关信息设置给该对象。同时,容器会创建一个HttpServletResponse对象,作为稍后要对客户端进行响应的

Java对象。

接着容器会根据读取的@WebServlet标注或web.xml的设置,找出处理该请求的Servlet,调用它的service()方法,将创建的HttpServiceRequest对象,

HttpServletResponse对象传入作为参数,service()方法中会根据HTTP请求的方式,调用对应的doXXX()方法。

例如,若为GET,则调用doGet()方法,接着在doGet()方法中,可以使用HttpServletRequest对象,HttpServletResponse对象。完成各种操作后容器将HttpServletRequest对象,

HttpServletResponse对象销毁回收,该次请求相应结束。

web容器管理对象的生命周期,负责请求/响应对象的创建与销毁。

6,doXXX()方法

Svervlet接口的service()方法签名其实接受的是ServletRequest,ServletResponse;

public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException;

定义Servlet期待Servlet不仅仅应用于HTTP故与HTTP相关的行为分别由ServletRequest,ServletResponse,的子接口定义。

Web容器确实创建的是HttpServletRequest,HttpServletResponse的实现对象,然后调用Servlet的Service,其在HttpServlet实现如下:

public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException{
HttpServletRequest request;
HttpServletResponse response;
try{
request=(HttpServletRequest)req;
response=(HttpServletResponse)res;
}catch(ClassCastException e){
throw new ServletException("non-HTTP request or response");
}
service(request,response);
}

上面调用的service(request,response),其实是HttpServlet新定义的方法:

Protected void service(ServletRequest req,ServletResponse res) throws ServletException,IOException{
String method=req.getMethod();
if(method.equals(METHOD_GET)){
long lastModified=getLastModified(req);/缓存页面的最新更新时间
if(lastModified==-1){
doGet(req,resp);
}else{
long ifModifiedSince=req.getDateHeader(HEADER_IFMODSINCE);///网页的最后修改时间
if(ifModifiedSince<(lastModified/1000*1000)){
maybeSetLastModified(resp,lastModified);
doGet(req,resp);
}else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
}else if(method.equals(METHOD_HEAD)){
long lastModified=getLastModified(req);
maybeSetLastModified(resp,lastModified);
doHead(req,resp);
}else if(method.equals(METHOD_POST)){
doPost(req,resp);
}else if(method.equals(METHOD_PUT)){
......

}
}

如果网页的最后修改时间比最新更新时间指定的时间早的话,web服务器就会请求的页面,如果自If-modified-Since指定的时间以来,网页内容没有被修改的话,服务器就会返回一个304响应头,一次告诉浏览器继续使用已缓存的页面。

这也是为什么在继承HttpServlet之后,必须实现与HTTP方法对应的doXXX()方法来处理请求。HTTP中定义了GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACE

等请求方式,而HttpServlet中对应的方法:

doGet():处理HTTP GET 请求

doPost()处理HTTP POST 请求:

doPut():处理HTTP PUT 请求

doDelete():处理HTTP DELETE 请求

doHead():处理HTTP HEAD 请求

doOptions():处理HTTP OPTIONS 请求

doTrace():处理HTTP TRACE 请求

假若客户端发出没有实现的请求:(HttpServlet的doGet()):

protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
String protocol=req.getProtocol();
String msg=lStrings.getString("http.method_get_not_supported");
if(protocol.endsWith("1.1")){
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED,msg);
}else{
resp.sendError(HttpServletResponse.SC_BAD_REQUEST,msg);
}
}

当没有重新定义doGet方法客户端发出GET请求其会收到错误信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章