Servlet
Servlet介绍
Servlet是Java Servlet (server applet)的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能用于交互地浏览和修改数据,由Servlet容器进行管理(创建或销毁)。
Java Servlet(继承结构)
- Servlet接口(javax.servlet.Servlet)
- GenericServlet(javax.servlet.GenericServlet)
- HttpServlet(javax.servlet.http.HttpServlet)
Servlet关联的类和接口
Servlet常用方法
所在包:javax.servlet
destroy():销毁
getServletConfig():获取Servlet实现类的示例
getServletInfo():获取Servlet信息
init(javax.servlet.ServletConfig):初始化方法
service(javax.servlet.ServletRequest, javax.servlet.ServletResponse):在Servlet响应用户时被容器调用
HttpServlet
HttpServlet是基于HTTP协议的Servlet实现。用户创建Servlet一般继承HttpServlet。
Serializable是IO的一个序列化接口
GenericServlet常用方法
destroy()
getInitParameter(java.lang.String):获取一些已经配置的数据(键值对形式)
getInitParameterNames():获取配置的所有的名称
getServletConfig()
getServletContext():获取Servlet上下文
getServletInfo()
getServletName():获取Servlet名字
init(javax.servlet.ServletConfig)
log(java.lang.String, java.lang.Throwable):日志(字符串+异常)
log(java.lang.String):日志
service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
HttpServlet常用方法
HttpServlet类所在包:javax.servlet.http
doDelete(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
getHead(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
doOptions(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
doPut(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
doTrace(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
getLastModified(javax.servlet.http.HttpServletRequest)
service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
Servlet的生命周期
Java Web Server端的运用都是围绕着Servlet展开
Servlet生命周期需要结合Servlet接口中定义的方法来了解Servlet的加载、创建、服务以及销毁的过程。
Servlet生命周期演示:
创建Servlets(可以创建多个)
配置Servlets
启动Tomcat
观察
创建一个Servlet过程
继承HttpServlet
重写service(doGet、doPost)方法
在web.xml中配置Servlet
在web.xml中配置Servlet的例子:
servlet标签表示配置一个servlet
servlet-name标签配置指定名称(不一定要和服务类名相同)
servlet-class配置对应的Servlet类(需要使用全类名)
url-pattern配置通过访问该服务的路径,需以斜杠开头。例如,我们在地址栏里面输入tp://localhost:8080/ServletLifecycle/s1便可以启用ServletTest服务。url-pattern可以配置多个,只需多加url-pattern标签即可
load-on-startup:此标签可加可不加,不加其实默认值为-1,如果加了此标签且值大于等于0,则表示,此服务并不需要通过用户访问而在加载到服务器时就已经初始化一个实例了。小于零的值则需要通过用户访问才能初始化
init-param:通过键值对的方式配置初始化参数
<!-- 配置servlet -->
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>com.li.servlet.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletTest2</servlet-name>
<servlet-class>com.li.servlet.ServletTest2</servlet-class>
<!-- 通过键值对的方式设置初始化参数 -->
<init-param>
<param-name>test</param-name>
<param-value>123456</param-value>
</init-param>
<!-- 不加此标签,默认值为-1,代表被使用的时候才会被加载创建,修改参数为0表示只要这个应用程序只要被加载到服务器里面,就会立马加载并实例化 -->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest2</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
处理Servlet生命周期事件
在Servlet生命周期中涉及到其他相关对象的创建、销毁或者更改其他对象属性时提供对应的回调接口来实现特定的功能。
Object | Event | Listener Interface and Event Class |
---|---|---|
Web Context | Initialization and destruction | javax.servlet.ServletContextListener and ServletContextEvent |
Web Context | Attribute, added, removed, or replaced | javax.servlet.ServletContextAttributeListener and ServletContextAttributeEvent |
Session | creation, invalidation, activation, passivation, timeout | javax.servlet.http.HttpSessionListener, javax.servlet.http.HttpSessionActivationListener, and HttpSessionEvent |
Session | Attribute, added, removed, or replaced | javax.servlet.http.HttpSessionAttributeListener, HttpSessionBindingEvent |
Request | A servlet request has started being processed by web components | javax.servlet.ServletRequestListener and ServletRequestEvent |
Request | Attribute added, removed, or replaced | javax.servlet.ServletRequestAttributeListener and ServletRequestAttributeEvent |
示例源代码
工程名为:ServletLifecycle
Servlet1
package com.li.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;
/*Servlet生命周期演示*/
public class ServletTest extends HttpServlet {
private static final long serialVersionUID = 1L;
/*
* 创建完成有一个警告(也无关紧要):原因是HttpServlet继承了GenericServlet类
* 而GenericServlet实现了java.io的虚拟化接口(Serializable),实现虚拟化接口的这些类,
* 都必须提供一个虚拟化的ID,不提供,就会给出一个警告。当然,不解决这个警告也没问题,并不影响类的运行。
* 点击警告add defalut serial version ID。
*/
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
print("init");
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
print("service");
/*输出ServletContext的hashCode码,在一个Web应用里面,只有一个ServletContext实例*/
System.out.println(getServletContext().hashCode());
}
@Override
public void destroy() {
print("destroy");
}
public void print(String content) {
/*打印输出:
*获取当前类名、当前方法、以及当前线程名
*/
System.out.println(getClass().getSimpleName()+" method: "+content+" thread name:"+Thread.currentThread().getName());
}
}
Servlet2
package com.li.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;
/*Servlet生命周期演示*/
public class ServletTest2 extends HttpServlet {
private static final long serialVersionUID = 1L;
/*
* 创建完成有一个警告(也无关紧要):原因是HttpServlet继承了GenericServlet类
* 而GenericServlet实现了java.io的虚拟化接口(Serializable),实现虚拟化接口的这些类,
* 都必须提供一个虚拟化的ID,不提供,就会给出一个警告。当然,不解决这个警告也没问题,并不影响类的运行。
* 点击警告add defalut serial version ID。
*/
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
print("init");
//获取初始参数
System.out.println("init-param:"+config.getInitParameter("test"));
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
print("service");
/*输出ServletContext的hashCode码,在一个Web应用里面,只有一个ServletContext实例*/
System.out.println(getServletContext().hashCode());
}
@Override
public void destroy() {
print("destroy");
}
public void print(String content) {
/*打印输出:
*获取当前类名、当前方法、以及当前线程名
*/
System.out.println(getClass().getSimpleName()+" method: "+content+" thread name:"+Thread.currentThread().getName());
}
}
WebContextListener
package com.li.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class WebContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent event) {
System.out.println("WebContextListener method name: contextDestroyed");
}
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("WebContextListener method name: contextInitialized");
}
}
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>ServletLifecycle</display-name>
<!-- 欢迎页,默认的欢迎页名都是index或者default -->
<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>
<servlet-name>ServletTest</servlet-name>
<servlet-class>com.li.servlet.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletTest2</servlet-name>
<servlet-class>com.li.servlet.ServletTest2</servlet-class>
<!-- 通过键值对的方式设置初始化参数 -->
<init-param>
<param-name>test</param-name>
<param-value>123456</param-value>
</init-param>
<!-- 不加此标签,默认值为-1,代表被使用的时候才会被加载创建,修改参数为大于等于0表示只要这个应用程序只要被加载到服务器里面,就会立马加载并实例化 -->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest2</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.li.listener.WebContextListener</listener-class>
</listener>
</web-app>
在浏览器地址栏中输入 http://localhost:8080/ServletLifecycle/s1 便可访问Servlet1服务;输入 http://localhost:8080/ServletLifecycle/s2 便可访问Servlet2服务。