JSP&Servlet 学习笔记(一)

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模式开始符合。

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