1.什么是Servlet?

        从广义上来讲,Servlet规范是Sun公司制定的一套技术标准,包含与Web应用相关的一系列接口,是Web应用实现方式的宏观解决方案。而具体的Servlet容器负责提供标准的实现。
        从狭义上来讲,Servlet指的是javax.servlet.Servlet接口及其子接口,也可以指实现了Servlet接口的实现类。

  •         Servlet(Server Applet)作为服务器端的一个组件,它的本意是“服务器端的小程序”。
  •         Servlet的实例对象由Servlet容器负责创建;
  •         Servlet的方法由容器在特定情况下调用;
  •         Servlet容器会在Web应用卸载时销毁Servlet对象的实例。

在Servlet中通常需要:

  • 接收请求数据;
  • 处理请求;
  • 完成响应。

2.怎么来使用Servlet

实现Servlet有三种方式:

  • 实现Servlet接口;
  • 继承javax.servlet.GenericServlet类;
  • 继承javax.servlet.http.HttpServlet类;

实现Servlet接口需要重写它的(init(),getServletConfig(),service(),getServletInfo(),destory())方法

public class AServalet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}

继承GenericServlet类需要重写它的service方法

public class AServalet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    }
}

继承HttpServlet类需要重新doGet和doPost方法

public class AServalet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}

 在实际开发中使用第三种方法!

运行Servlet需要配置Servlet文件

在web目录下WEB-INF中的web.xml文件配置

<servlet>
    //名称,随意取, 一般取名类名
    <servlet-name>Servlet02</servlet-name>
    //对应的Servlet类, 全名(包.类名)
    <servlet-class>com.fs.web01.Servlet02</servlet-class>
    </servlet>
    //指定访问路径
    <servlet-mapping>
        <servlet-name>Servlet02</servlet-name>
        //访问路径
        <url-pattern>/Servlet02</url-pattern>
    </servlet-mapping>

我的第一个Servlet应用

public class Servlet02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Hello Servlet!");
    }
}

需要在浏览器域名后输入访问路径 

java 用容器id连接数据库 unkonwhost_开发语言

java 用容器id连接数据库 unkonwhost_ide_02

 在后面的开发中我们推荐使用注解来替换配置文件,使用方法:

name忽略: @WebServlet(name="Servlet02",urlPatterns="/Servlet02") @WebServlet(urlPatterns="/Servlet02") urlPatterns 与value 等同 @WebServlet(value="/Servlet02")

@WebServlet(value = "/Servlet02")
public class Servlet02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Hello Servlet!");
    }
}

 Servlet作用:

  • 接收请求 【解析请求报文中的数据:请求参数】
  • 处理请求 【DAO和数据库交互】
  • 完成响应 【设置响应报文】

3.Servlet生命周期 

所谓生命周期,就是说出生、服务,以及死亡。Servlet生命周期也是如此!与Servlet的生命周期相关的方法有:

  • void init(ServletConfig);
  • void service(ServletRequest,ServletResponse);
  • void destroy();

        1.出生:服务器会在Servlet 第一次被访问时创建Servlet ,或者是在服务器启动时创建Servlet 。 如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。在Servlet被创建后,服务器会马上调用Servlet的void init(ServletConfig)方法。请记住, Servlet出生后马上就会调用init()方法,而且一个Servlet的一生 这个方法只会被调用一次。

        2.服务:当服务器每次接收到请求时,都会去调用Servlet的service()方法来处理请求。 服务器接收到一次请求,就会调用service() 方法一次 ,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!

        3.死亡:Servlet是不会轻易离去的,通常都是在服务器关闭时Servlet才会离去!在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servlet的destroy()方法,我们可以把Servlet的临终遗言放到destroy()方法中,例如对某些资源的释放等代码放到destroy()方法中。

测试生命周期:

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet(value="/Servlet02")
public class Servlet02 implements Servlet{

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("我出生啦");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("我在这里!");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("我要寄啦!");
    }
}

启动后 

java 用容器id连接数据库 unkonwhost_服务器_03

关闭后

java 用容器id连接数据库 unkonwhost_服务器_04

 4.Servlet两个接口

1. ServletConfig接口

ServletConfig接口封装了Servlet配置信息

  • 每一个Servlet都有一个唯一对应的ServletConfig对象,代表当前Servlet的配置信息。
  • 对象由Servlet容器创建,并传入生命周期方法init(ServletConfig config)中。可以直接获取使用。
  • 代表当前Web应用的ServletContext对象也封装到了ServletConfig对象中,使ServletConfig对象成为了获取ServletContext对象的一座桥梁。
  • ServletConfig对象的主要功能:
  • 获取Servlet名称:getServletName()
  • 获取全局上下文ServletContext对象:getServletContext()
  • 获取Servlet初始化参数:getInitParameter(String) / getInitParameterNames()。

2.ServletContext接口

 Web容器在启动时,它会为每个Web应用程序都创建一个唯一对应的ServletContext对象,意思是Servlet上下文,代表当前Web应用。

  • 由于一个Web应用程序中的所有Servlet都共享同一个ServletContext对象,所以ServletContext对象也被称为 application 对象(Web应用程序对象)。
  • 对象由Servlet容器在项目启动时创建,通过ServletConfig对象的getServletContext()方法获取。在项目卸载时销毁。
  • ServletContext对象的主要功能: a.获取项目的上下文路径(带/的项目名): getContextPath()
@Override
    public void init(ServletConfig servletConfig) throws ServletException {
        //获取路径对象
        ServletContext servletContext = servletConfig.getServletContext();
        //获取具体路径
        String contextPath = servletContext.getContextPath();
        System.out.println(contextPath);
    }

        b.获取虚拟路径所映射的本地真实路径:getRealPath(String path)

        c. 作为域对象共享数据

                setAttribute(key,value):以后可以在任意位置取出并使用

                getAttribute(key):取出设置的value值.