Servlet基础

一.ServletConfig讲解

1.1. 什么是ServletConfig

ServletConfig:代表当前Servlet在web.xml中的配置信息(用的不多)

  • String getServletName() – 获取当前Servlet在web.xml中配置的名字
  • String getInitParameter(String name) – 获取当前Servlet指定名称的初始化参数的值
  • Enumeration getInitParameterNames() – 获取当前Servlet所有初始化参数的名字组成的枚举
  • ServletContext getServletContext() – 获取代表当前web应用的ServletContext对象

1.2.配置Servlet初始化参数

在Servlet的配置文件web.xml中,可以使用一个或多个标签为servlet配置一些初始化参数。

例如:

logo

二.ServletContext:代表当前web应用

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。

ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象或者Servlet直接得到ServletConfig—->(this.getServletContext())。

1.做为域对象可以在整个web应用范围内共享数据。

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。可以理解为所有Servlet的容器。
恩, 就是这样。

举个栗子吧,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1 package com.vae.servlet;
2
3 import java.io.IOException;
4
5 import javax.servlet.ServletContext;
6 import javax.servlet.ServletException;
7 import javax.servlet.http.HttpServlet;
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 public class ServletTest01 extends HttpServlet {
12
13 public void doGet(HttpServletRequest request, HttpServletResponse response)
14 throws ServletException, IOException {
15 ServletContext context = this.getServletContext();
16 context.setAttribute("name", "smyhvae");
17 }
18
19 public void doPost(HttpServletRequest request, HttpServletResponse response)
20 throws ServletException, IOException {
21 doGet(request, response);
22 }
23
24 }

接下来所有Servlet都能访问’name’这个属性了。是不是和Session和Request的语法一样? 不过他们的作用范围不一样。ServletContext是全局的(其他用户都可以访问),而Session是局部的,Request是下个请求能够访问的。

2.获取WEB应用的初始化参数

我们在第一段中,通过标签为某一个单独的servlet加配置信息,这种配置信息在其他的Servlet中是无法访问到的。可如果我们使用标签(与Servlet标签并列)为整个Web应用配置属性的话,那所有的Servlet就都能访问里面的参数了。例如:可以把数据库的配置信息放在这里。

这里涉及到一些概念不要混淆:

  • 请求参数 parameter — 浏览器发送过来的请求中的参数信息
  • 初始化参数 initparameter — 在web.xml中为Servlet或ServletContext配置的初始化时带有的基本参数
  • 域属性 attribute — 四大作用域中存取的键值对

来串代码压压惊

logo
然后接下来我们在代码中来获取这些参数。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void doGet(HttpServletRequest request, HttpServletResponse response)
15 throws ServletException, IOException {
16 ServletContext context = this.getServletContext(); // 得到上下文对象
17
18 // 获取单个的Context里面的初始化参数
19 String value1 = context.getInitParameter("username");
20 String value2 = context.getInitParameter("password");
21 System.out.println(value1 + ";" + value2);
22 System.out.println();
23
24 // 一次性获取Context里所有的初始化参数
25 Enumeration enumeration = context.getInitParameterNames();
26 while (enumeration.hasMoreElements()) {
27 String name = (String) enumeration.nextElement();
28 String value = context.getInitParameter(name);
29 System.out.println(name + ";" + value);
30
31 }
32
33 }

3.加载资源文件:

我们先在WebRoot的根目录下新建一个资源文件config.properties:

3.1 ServletContext提供了getRealPath()方法,在这个方法中传入一个路径,这个方法的底层会在传入的路径的前面拼接当前web应用的硬盘路径,从而得到当前资源的硬盘路径,这种方式即使换了发布环境,方法的底层也能得到正确的web应用的路径从而永远都是正确的资源的路径。代码如下:

1
this.getServletContext().getRealPath("config.properties")

3.2 在很多情况下,Servlet中并不会处理大量的逻辑,而是直接调用其他的java代码,那就涉及到了下面的这个问题:
如果在非Servlet环境下要读取资源文件时可以采用类加载器加载文件的方式读取资源:MyService.class.getClassLoader().getResource(“../../../config.properties”).getPath()
那现在getResource()里面的路径该怎么写呢?

我们先看一下工程发布到tomcat里面的目录:
logo
进入WEB-INF目录下,是下面的样子:
logo
上图中的classes目录和工程文件的src目录等价。

  1. 如果config.properties文件放在src目录下,那路径为:getResource(“config.properties”)
  2. 如果config.properties文件的位置如下(和类处于同级目录):
    logo
    那路径和上面的代码一样:getResource(“com/vae/servlet/config.properties”)
  3. 如果config.properties文件的位置如下:

logo

此时config.properties文件和classes文件并列:
logo
那路径为:getResource(“../config.properties”) 注:”../“表示上一级目录。

先写到这里吧!