1,何为Web容器
容器:用来保存持有对象集合对象,对于Servlet/JSP,不仅持有对象,并且负责对象的生命周期与相关服务连接;
在抽象层面,可以将Web容器视为运行Servlet/JSP的HTTP服务器.,如同java仅认得JVM这个操作系统,Servlet/JSP程序在抽象层面上,也仅认得Web容器其这个概念上的
HTTP服务器。(JSP最终也是转译,编译,加载为Servlet,在容器的世界中,真正负责请求,相应的是Servlet)
一个请求到Servlet处理的线性关系:
浏览器<->实体服务器<->HTTP服务器程序<->Web容器<->Servlet
一个请求/响应的基本例子:
(1)客户端(大部分情况下是浏览器)对Web服务器发出HTTP请求。
(2)HTTP服务器收到HTTP请求,将请求转由Web容器处理,Web容器会剖析HTTP请求内容,创建各种对象(如HttpServletRequest,HttpServletResponse,HttpSession等)。
(3)Web容器由请求的URL决定要使用哪个Servlet来处理请求。
(4)Servet根据请求对象(HttpServletRequest)的信息决定如何处理,通过响应对象(HttpServletResponse)来创建相应。
(5)Web容器与HTTP服务器沟通,Web服务器将响应转换为HTTP相应并传回客户端。
2,Servlet的运行
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
若要编译一个servlet的java文件,则类路径中必须包括ServletAPI的相关类。
例如:javac -classpath Yourlibrary/YourTomcat/lib/servlet-api.jar -d ./classessrc/cc/openhome/HelloServlet.java
HttpServlet相关API类图
GenericServlet并没有规范任何有关HTTP的相关方法,而是由继承它的 HttpServlet来定义。在最初定义Servlet时,并不限定与它
只能用于HTTP,所以并没有将HTTP相关服务流程定义在GenericServlet之中,而是定义在HttpServlet的service()方法 中。
HttpServlet的service()方法中的流程大致如下:
protected void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
String method=req.getMethod();//取得请求方法
if(method.equals(METHOD_GET)){//HTTP GET
//略
doGet(req,resp);
//略
}else if(method.equals(METHOD_HEAD)){
//略
doHead(req,resp);
//略
}else if(method.equals(METHOD_POST)){
//略
doPost(req,resp);
//略
}else if(method.equals(METHOD_PUT)){
//略
}
}
当请求到来,容器会调用Servlet的service()方法。可以看到,HttpServlet的service()中定义的,基本就是判断HTTP请求的方式,再分别调用doGet()等方法。
所以若想针对GET,POST等方法处理,继承HttpServlet后,需要重新定义相应方法。
3,@WebServlet
@WebServlet(name="Hello",
urlPatterns={"/hello.view"}
loadOnStartup=1)
上面的@WebServlet告知容器,此serlvet的名称为Hello,若客户端请求的URL为/hello.view则由名称为Hello的Servlet来处理。
(若没有设置@WebServlet的name属性,默认值为Servlet的类完整名称)
loadOnStartup表示容器启动时,就先将Servlet类载入,实例化并做好初始化动作。数字代表了顺序,数字一样,则由容器厂商决定要如何载入
哪个Servlet。
4,URL模式设置
一个请求URI组成:requestURI=contextPath+servletPath+pathInfo
Servlet的URL模式:
(1)路径映射:以“/”开头但以"/*"结尾的URL模式;
(2)扩展模式:以"*."开头的URL模式;
(3)环境根目录映射:空字符串"";
(4)预设Servlet:仅包括"/"的URL模式,当找不到合适的URL模式对应时,就会使用预设Servlet;
(5)完全匹配:作路径的严格对应;
URL模式在设置比对规则在请求有所重叠时,请求比对原则为从最严格的URL模式开始符合。