JavaWeb—Servlet

1.什么是Servlet

  • 用来扩展web服务器功能的组件——早期的web服务器只能处理静态资源的请求,即须要事先将html文件准备好,并存放到web服务器上面。不可以处理动态资源的请求(须要计算,动态生成html),而Servlet能够根据客户端不一样请求给予相应的响应服务(处理动态请求)。
  • Servlet是一个直接或间接实现javax.servlet.Servlet接口的Java类(一般能够继承HttpServlet类
  • Servlet必须部署在web服务器端,用来处理客户端的请求,一般咱们把可以运行Servlet的服务器称做Servlet容器,如Tomcat

 

2.Servlet的建立

  建立Servlet实例有两个时机:html

  • 客户端第一次请求某个Servlet时,容器建立该Servlet实例(大部分Servlet都是以这种方式建立)。
  • Web应用启动时当即建立Servlet实例,即load-on-startup Servlet。

  关于load-on-startup参数:java

  • load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
  • 它的值必须是一个整数,表示servlet应该被载入的顺序
  • 当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
  • 当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
  • 正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
  • 当值相同时,容器就会本身选择顺序来加载。

 

3.Servlet的生命周期

javax.servlet.Servlet源码: web

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

 全部的servlet都是javax.servlet.Servlet的子类,就像Java里面全部的类都是Object的子类同样。Servlet类规定了每一个servlet应该实现的方法,这个是遵循Servlet规范的。可是自定义的servlet通常不用直接实现Servlet,而是继承javax.servlet.GenericServlet或者javax.servlet.http.HttpServlet就好了。这是由于HttpServlet间接实现了Servlet,提供了通用的功能。因此咱们在自定义的TestServlet里面只须要专一实现业务逻辑就好了。服务器

Servlet里面有三个比较重要的方法:init、service、destroy。它们被称做是servlet生命周期的方法,它们都是由servlet容器调用。另外两个方法用于获取servlet相关信息的,须要根据业务逻辑进行实现和调用。并发

Servlet生命周期: app

  • 实例化:容器建立Servlet对象
  • 初始化:调用Servlet的init()方法
  • 服务:调用Servlet实例的service()方法来处理请求
  • 销毁:容器删除Servlet实例(调用Servlet实例的destroy()方法)

 

4.HttpServlet运行过程

HttpServlet是一个针对HTTP协议的通用实现,它实现了HTTP协议中的基本方法get、post等,经过重写service方法实现方法的分派。post

  1. Web Client依据ip,port向Servlet容器(Tomcat)发出Http请求
  2. 容器接收Web Client的请求
  3. 容器建立一个HttpRequest对象,将Web Client请求的信息封装到这个对象中。
  4. 容器建立一个HttpResponse对象
  5. 容器建立Servlet对象,而后调用该对象的service方法,把HttpRequest与HttpResponse做为参数传给 Servlet 对象。
  6. Servlet 对象调用HttpRequest的有关方法,获取Http请求信息。(Servlet的service方法中)
  7. Servlet 对象调用HttpResponse的有关方法,生成响应数据。(Servlet的service方法中)
  8. 容器把HttpResponse的响应结果传给Web Client。

  若是想要分别响应客户端的GET和POST请求,须要重写HttpServlet对象的doGet和doPost方法,若是全部请求的响应都是同样的,则只须要重写service方法便可。测试

 

5.Servlet与JSP

  JSP的本质就是Servlet,咱们将编写好的JSP文件部署在web容器中以后,web容器会将JSP编译成对应的Servlet。this

  若是Servlet要生成表现层页面时,全部的HTML标签都须要使用Servlet的输出流来输出,繁琐且不利于美工人员修改。url

  在标准的MVC模式中,Servlet仅做为控制器使用,而JSP仅做为表现层技术使用:

  • M:Model,即模型,对应JavaBean。
  • V:View,即视图,对应JSP。
  • C:Controller,即控制器,对应Servlet。 

 

6.Java建立Servlet实例

6.1 首先建立一个JavaWeb工程,而后建立一个类继承HttpServlet

package com.xzh;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by xiangzh on 2017/8/29.
 */
public class ServletDemo extends HttpServlet{
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the GET method");
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the POST method");
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }
}

6.2 在web.xml文件中配置上面的Servlet

    <servlet>
        <servlet-name>ServletDemo</servlet-name>
        <servlet-class>com.xzh.ServletDemo</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>ServletDemo</servlet-name>
        <url-pattern>/ServletDemo</url-pattern>
    </servlet-mapping>

6.3 将项目打包放到Tomcat中,启动Tomcat,测试结果以下:

注意:一个Web应用对应一个ServletContext,一个Servlet对应一个ServletConfig。每一个Servlet都是单例的,因此须要本身处理好并发的场景。

 

 

 

参考:

JavaWeb——Servlet

http://www.cnblogs.com/xdp-gacl/p/3760336.html

http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.html

http://www.cnblogs.com/goody9807/archive/2007/06/13/782519.html

http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html

相关文章
相关标签/搜索