Javaweb01--servlet详解

一,学习目标

1、Servlet相关架构图

2、Serlvet生命周期

3、Servlet工作原理

4、请求和响应

5、转发和重定

1.1 什么是Servlet

和applet相对应,是运行在服务器端的小程序,用来处理客户端的请求并给予响应的java类,继承了HttpServlet类。

1、servlet体系结构

Javaweb01--servlet详解_第1张图片

 2、Servlet接口

Servlet的框架是由两个Java包组成的:javax.servlet与javax.servlet.http。在javax.servlet包中定义了所有的Servlet类都必须实现或者扩展的通用接口和类。在javax.servlet.http包中定义了采用Http协议通信的HttpServlet类。Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这个接口

Javaweb01--servlet详解_第2张图片

 3.servlet继承关系

Javaweb01--servlet详解_第3张图片

 二, 生命周期

2.1 servlet工作原理

Javaweb01--servlet详解_第4张图片

当Web服务器接收到一个HTTP请求时,它会先判断请求内容——如果是静态网页数据,Web服务器将会自行处理,然后产生响应信息;如果牵涉到动态数据,Web服务器会将请求转交给Servlet容器。此时Servlet容器会找到对应的处理该请求的Servlet实例来处理,结果会送回Web服务器,再由Web服务器传回用户端。

针对同一个Servlet,Servlet容器会在第一次收到http请求时建立一个Servlet实例,然后启动一个线程(从容器线程池中获取一个)。第二次收到http请求时,Servlet容器无须建立相同的Servlet实例,而是启动第二个线程来服务客户端请求。所以多线程方式不但可以提高Web应用程序的执行效率,也可以降低Web服务器的系统负担。

2、Servlet工作流程(重点*****)

1、Web Client 向Servlet容器(Tomcat)发出Http请求

2、Servlet容器接收Web Client的请求

3、Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中

4、Servlet容器创建一个HttpResponse对象

5、Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet对象

6、HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息

7、HttpServlet调用HttpResponse对象的有关方法,生成响应数据

8、Servlet容器把HttpServlet的响应结果传给Web Client

3、Servlet生命周期

Servlet生命周期,是指Servlet从加载、初始化、处理请求、返回响应、直到销毁的过程。

Servlet中跟生命周期相关的方法:

  • init():初始化
  • service(ServletRequest,ServletResponse):服务方法,用来处理各种请求的方法
  • destroy():销毁

 Javaweb01--servlet详解_第5张图片

生命周期过程

1、实例化(创建对象:调用构造方法)(只实例化一次)

2、初始化(数据的赋初值,或者获取配置信息的过程)(只初始化一次)

3、提供服务(doGet,doPost)(多次)

4、销毁(关闭容器时销毁)(一次)

4、实例化:

创建Servlet对象的时机:

  1. 默认情况下,在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet对象的service方法;
  1. Servlet容器启动时:当web.xml文件中如果元素中指定了子元素时,Servlet容器在启动web服务器时,将按照顺序创建并初始化Servlet对象;
  1. Servlet的类文件被更新后,重新创建Servlet。Servlet容器在启动时自动创建Servlet,这是由在web.xml文件中为Servlet设置的属性决定的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在;

销毁Servlet对象的时机:

Servlet容器停止或者重新启动:Servlet容器调用Servlet对象的destroy方法来释放资源。

 3.service方法处理请求响应

对于每一个HTTP请求,servlet容器会创建一个封装了HTTP请求的ServletRequest实例传递给servlet的service方法,ServletResponse则表示一个Servlet响应,其隐藏了将响应发给浏览器的复杂性。

通过ServletRequest的方法你可以获取一些请求相关的参数,而ServletResponse则可以将设置一些返回参数信息,并且设置返回内容。

3.1HttpServlet中的service方法:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    获取请求的方式 get /post /head /put /delete

       String method = req.getMethod();

       long lastModified;

       if (method.equals("GET")) {

           lastModified = this.getLastModified(req);

           if (lastModified == -1L) {

               调用doGet方法

               this.doGet(req, resp);

          } else {

               long ifModifiedSince;

               try {

                   ifModifiedSince = req.getDateHeader("If-Modified-Since");

              } catch (IllegalArgumentException var9) {

                   ifModifiedSince = -1L;

              }

               if (ifModifiedSince < lastModified / 1000L * 1000L) {

                   this.maybeSetLastModified(resp, lastModified);

                   this.doGet(req, resp);

              } else {

                   resp.setStatus(304);

              }

          }

      } else if (method.equals("HEAD")) {

           lastModified = this.getLastModified(req);

           this.maybeSetLastModified(resp, lastModified);

           this.doHead(req, resp);

      } else if (method.equals("POST")) {

           this.doPost(req, resp);

      } else if (method.equals("PUT")) {

           this.doPut(req, resp);

      } else if (method.equals("DELETE")) {

           this.doDelete(req, resp);

      } else if (method.equals("OPTIONS")) {

           this.doOptions(req, resp);

      } else if (method.equals("TRACE")) {

           this.doTrace(req, resp);

      } else {

           String errMsg = lStrings.getString("http.method_not_implemented");

           Object[] errArgs = new Object[]{method};

           errMsg = MessageFormat.format(errMsg, errArgs);

           resp.sendError(501, errMsg);

      }

3.2HttpServletResquest常用方法:

getParameter(String); //根据名字获取参数的值:表单中的参数,地址栏中的参数

getParameterValues(String);//根据名字获取一组参数的值(复选框)

getParameterMap()://获得一个Map对象,所有的参数值都放在字符串数组中

getAttribute(String);//根据名字获取属性的值

setAttribute(String,Object);//根据属性设置值

getRequestDispatcher(String);//请求转发

setCharactorEncoding(); //设置编码方式

HttpServletResponse常用方法:

sendRirect();//重定向:重新请求指定的地址

setContentType();//设置响应的编码方式;

addCookie(); //添加cookie

你可能感兴趣的:(JavaWeb基础,服务器,java,web)