Servlet

其实就是一个java程序,运行在我们的web服务器上,用于接收和响应 客户端的http请求。

更多的是配合动态资源来做。 当然静态资源也需要使用到servlet,只不过是Tomcat里面已经定义好了一个 DefaultServlet

使用Servlet

新建一个web项目创建项目最后一步是不要忘记勾选Generate web.xml deployment descriptor创建web.xml文件

  • 新建一个类,实现Servlet接口

com.servlet.HelloServlet.java

package com.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HelloServlet implements Servlet{

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        System.out.println("service方法");

    }
    @Override
    public void destroy() {
        // TODO 自动生成的方法存根

    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO 自动生成的方法存根
        return null;
    }

    @Override
    public String getServletInfo() {
        // TODO 自动生成的方法存根
        return null;
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        // TODO 自动生成的方法存根

    }
}
  • 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>ServletWeb</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.servlet.HelloServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/a</url-pattern>
</servlet-mapping>  

</web-app>

20170630111041660.png

Servlet的通用写法

Servlet (接口) -> GenericServlet -> HttpServlet(用于处理http的请求)

  • 新建一个类,继承HttpServlet

com.servlet.Servlet1.java

package com.servlet;

import java.io.IOException;

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

public class Servlet1 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO 自动生成的方法存根
        System.out.println("isget");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO 自动生成的方法存根
        doGet(req, resp);
    }
}
  • 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>ServletWeb</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

<servlet>
    <servlet-name>Servlet1</servlet-name>
    <servlet-class>com.servlet.Servlet1</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Servlet1</servlet-name>
    <url-pattern>/s1</url-pattern>
</servlet-mapping>  

</web-app>

上一个实现Servlet接口中,使用的是service方法,这次使用的是doget和dopost在源码中service方法是根据请求类型调用doget和dopost,其他请求类型分别调用对应的do方法

Servlet的生命周期

  • 生命周期

从创建到销毁的一段时间

  • 生命周期方法

从创建到销毁,所调用的那些方法。

  • init方法

在创建该servlet的实例时,就执行该方法。一个servlet只会初始化一次,init方法只会执行一次默认情况下是,初次访问该servlet,才会创建实例。

  • service方法

只要客户端来了一个请求,那么就执行这个方法了。该方法可以被执行很多次。一次请求,对应一次service方法的调用

  • destroy方法

servlet销毁的时候,就会执行该方法

该项目从tomcat的里面移除。

正常关闭tomcat就会执行 shutdown.bat

提前创建Servlet实例

默认情况下,只有在初次访问servlet的时候,才会执行init方法。有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至是做一些比较耗时的逻辑。初次访问,可能会在init方法中逗留太久的时间。在配置的时候,使用load-on-startup元素来指定,给定的数字越小,启动的时机就越早。一般不写负数,从2开始即可。

  • Servlet1类,继承HttpServlet

com.servlet.Servlet1.java

package com.servlet;

import java.io.IOException;

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

public class Servlet1 extends HttpServlet{
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init方法。。。");
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO 自动生成的方法存根
        System.out.println("isget");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO 自动生成的方法存根
        doGet(req, resp);
    }
}
  • 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>ServletWeb</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

<servlet>
    <servlet-name>Servlet1</servlet-name>
    <servlet-class>com.servlet.Servlet1</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Servlet1</servlet-name>
    <url-pattern>/s1</url-pattern>
</servlet-mapping>  

</web-app>

在servlet启动时会调用init方法,输出对应的字符串

ServletConfig

Servlet的配置,通过这个对象,可以获取servlet在配置的时候一些信息

获取servletName

package com.servlet;

import java.io.IOException;

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

public class Servlet1 extends HttpServlet{

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("init方法。。。");
    }

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

        //得到servlet配置对象 专门用于在配置servlet的信息
        ServletConfig config = getServletConfig();

        //获取到的是配置servlet里面servlet-name 的文本内容
        String servletName = config.getServletName();
        System.out.println("servletName="+servletName);

    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  • 重写init(ServletConfig config)时应调用super.init(config)方法调用父类的init方法创建ServletConfig对象 否则getServletConfig()会返回null

获取单个参数和所有参数

package com.servlet;

import java.io.IOException;
import java.util.Enumeration;

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

public class Servlet1 extends HttpServlet{

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("init方法。。。");
    }

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

        ServletConfig config = getServletConfig();
        // 可以获取具体的某一个参数
        String address = config.getInitParameter("address");
        System.out.println("address="+address);

        System.out.println("----------------------------------");
        // 获取所有的参数名称
        Enumeration<String> names = config.getInitParameterNames();
        //遍历取出所有的参数名称
        while (names.hasMoreElements()) {
            String key = (String) names.nextElement();
            String value = config.getInitParameter(key);
            System.out.println("key==="+key + "   value="+value);

        }
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  • web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>ServletWeb</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/a</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>Servlet</servlet-name>
    <servlet-class>com.servlet.Servlet1</servlet-class>
    <load-on-startup>2</load-on-startup>
    <init-param>
        <param-name>address</param-name>
        <param-value>1997sty</param-value>
    </init-param>
    <init-param>
        <param-name>name</param-name>
        <param-value>enderman</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>Servlet</servlet-name>
    <url-pattern>/s1</url-pattern>
  </servlet-mapping>

</web-app>