Servlet简介
●Java Servlet是和平台无关的服务器端组件, 它运行在Servlet容器中。Servlet容器 负责Servlet和客户的通信以及调用Servlet的方法, Servlet和客户的通信采用“请求/响应”的模式。
●Servlet可完成如下功能:-
–创建并返回基于客户请求的动态HTML页面。
-创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段)。
-与其它服务器资源(如数据库或基于Java的应用程序)进行通信。
javaWeb的基本结构
一个继承了servlet的类 HelloServlet
package day0128.javaweb;
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 destroy() {
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig");
return null;
}
@Override
public String getServletInfo() {
System.out.println("getServletInfo");
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.err.println("service");
}
public HelloServlet() {
System.out.println("constructor~~~");
}
}
在 web.xml 中进行配置(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" version="3.1">
<!-- 配置和映射 servlet -->
<servlet>
<!-- 注册的名字 -->
<servlet-name>HelloServlet</servlet-name>
<!-- Servlet 的 全类名 -->
<servlet-class>day0128.javaweb.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 需要和某一个 servlet 节点的 servlet-name 子节点的文本节点一致 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 映射具体的访问路径: / 代表的是当前 WEB 应用的根目录 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
启动服务器 tomcata 服务器
得到启动服务时,先调用类的构造函数,然后调用init 函数,最后调用server 服务
关闭服务器时
会调用destroy 函数‘
servlet 生命周期的方法
(都是由servlet 容器进行调用)
- 构造器:只被调用一次。只有第一次请求Servlet时,创建Servlet的实例。调用构造器。这说明Serlvet的单实例的!
- init 方法: 只被调用一次。在创建好实例后立即被调用。用于初始化当前Servlet .
- service: 被多次调用.每次请求都会调用service方法。实际用于响应请求的.
- destroy: 只被调用一次。在当前Servlet 所在的WEB应用被卸载前调用。用于释放当前Servlet 所占用的资源。
多个 元素可以映射一个 已经注册的Servlet
<servlet>
<!-- 注册的名字 -->
<servlet-name>HelloServlet</servlet-name>
<!-- Servlet 的 全类名 -->
<servlet-class>day0128.javaweb.HelloServlet</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
//用/hello 获取服务
<servlet-mapping>
<!-- 需要和某一个 servlet 节点的 servlet-name 子节点的文本节点一致 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 映射具体的访问路径: / 代表的是当前 WEB 应用的根目录 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
//第二个 映射,以 .html 结尾的都可以获取服务
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>*.html</url-pattern><
</servlet-mapping>
在中:(映射同一个servlet 设服务是A)
<url-pattern>/hello1</url-pattern> 表示 /hello1 获得服务A
<url-pattern>/hello2</url-pattern> 表示 /hello2 获得服务A
<url-pattern>*.html</url-pattern> 表示 任何以.html结尾都可 获得服务A
<url-pattern>/*</url-pattern> 表示 任意串都可 获得服务A
记:不可以<url-pattern>/*.html</url-pattern>
获取服务的顺序:load-on-startup
load-on-startup index
index越小,越先获得服务
<!-- 配置和映射 servlet -->
<servlet>
<!-- 注册的名字 -->
<servlet-name>HelloServlet</servlet-name>
<!-- Servlet 的 全类名 -->
<servlet-class>day0128.javaweb.HelloServlet</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
<!-- 第二个servlet -->
<servlet>
<servlet-name>HelloServlet2</servlet-name>
<servlet-class>day0128.javaweb.HelloServlet2</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
servletConfig 接口方法
servlet 内的初始化
<!-- 配置和映射 servlet -->
<servlet>
<!-- 注册的名字 -->
<servlet-name>HelloServlet</servlet-name>
<!-- Servlet 的 全类名 -->
<servlet-class>day0128.javaweb.HelloServlet</servlet-class>
<!-- 初始化 -->
<init-param>
<param-name>user</param-name>
<param-value>JXK</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>19980402</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
通过继承类 HelloServlet 获得 servletConfig 变量
@Override
public void init(ServletConfig config) throws ServletException {
String user = config.getInitParameter("user");
System.out.println("user:"+ user);
//打印所有参数
Enumeration<String> names = config.getInitParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String value = config.getInitParameter(name);
System.out.println("^^"+name+":"+value);
}
//得到注册名
String servletName = config.getServletName();
System.out.println("servletName:"+servletName);
- String user = config.getInitParameter(“user”); 得到 初始化变量名为 ‘user’ 的变量值
- Enumeration names = config.getInitParameterNames(); 得到所有初始化变量名组成的Enueration 数组变量(具体看代码)
- String servletName = config.getServletName();得到注册名(HelloServlet)
getServletContext 方法
web.xml 中初始化 servlet 的代码
(这个没有放在servlet 中,与放在servlet 中的初始化方法是一个整体与局部的关系)
<!-- 配置当前web 应用的初始化参数 -->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>driver.url</param-value>
</context-param>
@Override
public void init(ServletConfig config) throws ServletException {
//得到setvletContext 变量
ServletContext servletContext = config.getServletContext();
String driString = servletContext.getInitParameter("driver");
System.out.println("WEB driver:"+driString);
//打印所有 web 的初始化参数
Enumeration<String> names2 = servletContext.getInitParameterNames();
while (names2.hasMoreElements()) {
String name = names2.nextElement();
String value = servletContext.getInitParameter(name);
System.out.println("Java web"+name+":"+value);
}
//得到当前web 在一个服务器上的绝对路径
//是某一文件在服务器上的绝对路径,而不死部署路径
String realPath = servletContext.getRealPath("/jdbc.properties");
//E:\eclipse\code\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\javaWebDay0128\jdbc.properties
System.out.println(realPath);
//获得当前 web 应用的名称
String contexPath = servletContext.getContextPath();
System.out.println(contexPath);
//获取当前 web 应用某一文件对应的输入流
try {
ClassLoader classLoader = getClass().getClassLoader();
InputStream is = classLoader.getResourceAsStream("jdbc.properties");
System.err.println("1."+is);
} catch (Exception e) {
e.printStackTrace();
}
try {
//InputStream is2 = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
//输出 Null 要写服务器上的绝对路径
InputStream is2 = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
System.err.println("1."+is2);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("init");
}
-
得到初始化名 与变量值的方法与之前一样
String driString = servletContext.getInitParameter(“driver”);
System.out.println(“WEB driver:”+driString); -
String realPath = servletContext.getRealPath("/jdbc.properties");
获得当前 web 应用的某一个文件在服务器上的绝对路径,而不是部署的相对路径 -
String contexPath = servletContext.getContextPath();获得当前 web 应用的名称
-
获取当前 web 应用的某一个文件对应的输入流
InputStream is2 = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
(这儿的路径要写在服务器上的绝对路径,而不是部署的路经,不然会返回 )