javaWeb 学习日记(3)---- servlet 学习(初始化,servletConfig & servletContext)

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 容器进行调用)

  1. 构造器:只被调用一次。只有第一次请求Servlet时,创建Servlet的实例。调用构造器。这说明Serlvet的单实例的!
  2. init 方法: 只被调用一次。在创建好实例后立即被调用。用于初始化当前Servlet .
  3. service: 被多次调用.每次请求都会调用service方法。实际用于响应请求的.
  4. 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");
    (这儿的路径要写在服务器上的绝对路径,而不是部署的路经,不然会返回 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值