Servlet

Servlet:

Servlet(Server Applet)是Java Servlet的简称,可以运行在Web服务器中的小型Java程序,有时也叫做服务器端的小应用程序。以通过 HTTP协议接收和响应来自 Web 客户端的请求。

 1 package com.monkey1024.servlet;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Servlet;
 6 import javax.servlet.ServletConfig;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.ServletRequest;
 9 import javax.servlet.ServletResponse;
10 
11 public class FirstServlet implements Servlet {
12 
13     @Override
14     public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
15         System.out.println("Hello Servlet");
16     }
17 
18     @Override
19     public void destroy() {
20 
21     }
22     @Override
23     public ServletConfig getServletConfig() {
24         return null;
25     }
26 
27     @Override
28     public String getServletInfo() {
29         return null;
30     }
31 
32     @Override
33     public void init(ServletConfig arg0) throws ServletException {
34 
35     }
36 
37 }

执行过程:

  1. 客户端向tomcat发送请求
  2. tomcat根据请求的URL找到servlet的应用
  3. tomcat根据请求的URI”/hello”找到web.xml文件中url-pattern与之对应的标签
  4. tomcat根据url-pattern标签中的servlet-name定位到com.monkey1024.servlet.FirstServlet类。
  5. tomcat实例化FirstServlet类
  6. 调用FirstServlet类中的init方法
  7. 调用FirstServlet类中的service方法
  8. FirstServlet将数据响应给客户端
  9. 调用distroy方法销毁FirstServlet

生命周期

Servlet

Servlet第一次请求执行构造方法、init()方法、service()方法

以后每次请求执行一次service()方法

关闭Tomcat 执行destroy()方法

由于 Servlet 是单例多线程的,所以为了保证其线程安全性,一般情况下是不建议在 Servlet类中定义可修改的成员变量,因为每个线程均可修改这个成员变量,会出现线程安全问题。

在tomcat启动时,默认不会创建servlet实例,如果想要让tomcat在启动时创建servlet实例的话,只需要在web.xml中添加load-on-startup标签即可

<servlet>
      <servlet-name>lifeServlet</servlet-name>
      <servlet-class>com.monkey1024.servlet.LifeServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>lifeServlet</servlet-name>
      <url-pattern>/life</url-pattern>
  </servlet-mapping>
View Code

添加load-on-startup的作用是,标记是否在 Tomcat启动时创建并初始化这个 Servlet实例。它的值必须是一个整数。

  • 当值大于等于 0 时,表示容器在启动时就加载并初始化这个 Servlet,数值越小,该 Servlet的优先级就越高,其被创建的也就越早;
  • 当值相同时,容器会自己选择创建顺序。

ServletConfig接口

Servlet 规范将Servlet 的配置信息全部封装到了 ServletConfig 接口对象中。在tomcat调用 init()方法时,首先会将 web.xml 中当前 Servlet 类的配置信息封装为一个对象。传给ServletConfig参数

ServletConfig中的方法

  • getInitParameter(): 获取指定名称的初始化参数值。例如从下面的servlet中调用 getInitParameter("userName");方法会返回字符串"monkey1024"。
  • getInitParameterNames():获取当前 Servlet 所有的初始化参数名称。其返回值为枚举类型 Enumeration。
  • getServletName():获取当前 Servlet 的中指定的 Servlet名称。如下面中的 ServletName 为"configServlet"。
  • getServletContext():获取到当前 Servlet 的上下文对象 ServletContext,这是个非常重要的对象,将在下一节中详细介绍

ServletContext接口(application)

ServletContext中不仅包含了 web.xml 文件中的配置信息,还包含了当前应用中所有Servlet可以共享的数据。

常用方法

  • String getInitParameter ():获取 web.xml 文 件 的 中 指 定 名 称 的上下文参数值 。
  • Enumeration getInitParameterNames():获取 web.xml 文件的中的所有的上下文参数名称。其返回值为枚举类型 Enumeration。
  • void setAttribute(String name, Object object):在 ServletContext 的公共数据空间中,也称为域属性空间,放入数据。这些数据对于 Web应用来说,是全局性的,与整个应用的生命周期相同。当然,放入其中的数据是有名称的,通过名称来访问该数据。
  • Object getAttribute(String name):从 ServletContext 的域属性空间中获取指定名称的数据。
  • void removeAttribute(String name):从 ServletContext 的域属性空间中删除指定名称的数据。
  • String getRealPath(String path):获取当前 Web 应用中指定文件或目录在本地文件系统中的路径。
  • String getContextPath():获取当前应用在 Web 容器中的名称。

欢迎页面

1 <welcome-file-list>
2     <welcome-file>index.html</welcome-file>
3     <welcome-file>index.htm</welcome-file>
4     <welcome-file>index.jsp</welcome-file>
5     <welcome-file>default.html</welcome-file>
6     <welcome-file>default.htm</welcome-file>
7     <welcome-file>default.jsp</welcome-file>
8   </welcome-file-list>

由上到下依次加载

url-pattern

精确路径

1 <servlet-mapping>
2       <servlet-name>contextServlet02</servlet-name>
3       <url-pattern>/context02</url-pattern>
4       <url-pattern>/servlet/context02</url-pattern>
5       <url-pattern>/test/servlet/context02</url-pattern>
6  </servlet-mapping>

通配符

1 <servlet-mapping>
2       <servlet-name>contextServlet02</servlet-name>
3       <url-pattern>/servlet/*</url-pattern>
4   </servlet-mapping>

使用/*,表示当前的 Servlet 会拦截用户对于静态资源(.css、.js、.html、.jpg、.png…..)与动态资源(.jsp)的请求。

1   <servlet-mapping>
2       <servlet-name>contextServlet02</servlet-name>
3       <url-pattern>/*</url-pattern>
4   </servlet-mapping>

使用/,表示当前的 Servlet 会拦截用户对于静态资源(.css、.js、.html、.jpg、.png…..),
但对于动态资源的请求,是不进行拦截的。

1   <servlet-mapping>
2       <servlet-name>contextServlet02</servlet-name>
3       <url-pattern>/*</url-pattern>
4   </servlet-mapping>

后缀名模式

1 <servlet-mapping>
2       <servlet-name>contextServlet02</servlet-name>
3       <url-pattern>*.do</url-pattern>
4 </servlet-mapping>

路径匹配原则匹配过程 4->3->2->1

  1. /xxx/*
  2. /xxx/*.do
  3. /some
  4. /some/other/*

继承GenericServlet类

只需要重写service()即可

HttpServlet类

重写doGet()、doPost()等方法

创建servlet的三种方式

  • 定一个类实现javax.servlet.Servlet接口
  • 定义一个类继承javax.servet.GenericServlet类
  • 定义一个类继承javax.servlet.http.HttpServlet类

Servlet

如果是通过参数传过来的对象,就叫依赖
通过方法得到的对象,就叫关联