javaweb入门(一)——servlet-04-SerlvetContext应用

一.ServletContext类详解

getInitParameter()方法

此方法和上一章我们遇到的Serlvet.getInitParameter相似,都是获取初始化参数。不同的是,Serlvet.getInitParameter方法获取的是使用此方法的servlet的初始化参数,配置设置在<servlet>标签中;而SerlvetContext.getInitParameter获取的是整个web应用的初始化参数,配置设置在web.xml中并且不在别的标签里面。

其实ServletContext的初始化参数相当于web应用的初始化参数。

接下来为了方便我们对于ServletContext.getInitParamter方法的理解,我们做一个小小的案例。
在此案例中我们需要完成以下步骤:

  1. web.xml中设置ServletContext的初始化参数。
  2. 编写一个servlet类,使用它获取上一步设置的初始化参数。
  3. 启动web应用,查看servlet类获取的初始化参数。

1.在web.xml中设置SerlvetContext的初始化参数。

    <context-param>
        <param-name>InitParamterTest</param-name>
        <param-value>This is a test for ServetContext.getInitParameter !</param-value>
    </context-param>

2.编写一个获取ServletContext初始化参数的servlet类,给它配置映射路径。

package com.kuang.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ServletContextGetInitParameterTest extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        ServletContext servletContext = this.getServletContext();
//        获取初始化参数
        String message = servletContext.getInitParameter("InitParamterTest");
//      将获取的初始化参数输出
        PrintWriter writer = resp.getWriter();
        writer.println("IninParameter test : " + message);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

配置映射路径:

    <servlet>
        <servlet-name>initParameterTest</servlet-name>
        <servlet-class>com.kuang.servlet.ServletContextGetInitParameterTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>initParameterTest</servlet-name>
        <url-pattern>/initParameterTest</url-pattern>
    </servlet-mapping>

(PS:配置映射路径的步骤就不在此处展示了。)
3.测试结果。
在这里插入图片描述

getRequestDispatcher()方法

我们只需要知道ServletContext中有请求转发的功能。其相关的知识我们将会在后面的学习中与重定向一同学习。

ServletContext读取资源文件

Properties类介绍

1.什么是Properties类?
Properties类是用于处理属性文件的类(一般来说,属性文件是使用键值对保存一些程序运行所需要的配置数据,例如jdbc的url等。这类文件的后缀一般是.properties)。Properties类继承Hashtable类,在Hashtable类的基础之上增加了一些与配置文件相关的方法

2.Properties类中常用的方法
Properties类中常用的方法有:load(),getProperty(),setProperty,store()
load():加载properties文件。一般使用的方式来加载。
getProperty():根据参数获取Property类中对应的数据信息。
setProperty():根据参数设置Property类中的信息。
store():将Property中的信息存储会properties文件之中。

3.使用ServletContex获取properties文件的方法

  1. 创建一个Properties文件
username = BugMaker2000
password = 123456
  1. 创建一个用于读取配置文件的Serlvet,使用ServletContext读取上一步设置的配置文件(作为读取)
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Properties;
import java.util.Set;

public class PropertiesTestServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
//        1.使用Servlet读取配置文件
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/Test.properties");
//        2.创建一个Properties类,并且使用load()方法加载获取的输入流
        Properties prop = new Properties();
        prop.load(is);
//        3.读取Properties中的数据
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
//        4.使用Servlet输出
        PrintWriter writer = resp.getWriter();
        writer.print("username : " + username + " password : " + password);
//        测试properties的修改功能
//        1.再properties中设置属性
        prop.setProperty("url","www.baidu.com");
//        2.创建文件的输出流(输出流要使用绝对路径)
        FileOutputStream fos = new FileOutputStream("D:\\IDEAWorkPlace\\javaweb-02-servlet\\servlet-02\\src\\main\\resources\\Test.properties");
//        3.使用store文件对数据进行保存
        prop.store(fos,"文件修改");


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

映射路径的操作在此省略。

  1. 启动服务器,查看读取的内容。
    properties读取结果:
    在这里插入图片描述
    properties修改结果:
    在这里插入图片描述

小知识:
在我们使用servlet读取数据时,我们使用的文件路径是:/WEB-INF/classes/Test.properties。这个路径是根据文件生成的target文件中的路径获取的。
在这里插入图片描述
其中我们可以看到’servlet-02’这个目录,在web应用中我们文件的目录便是从这个目录开始的。其中’class’目录我们称为classpath目录,我们在’java’以及’resource’目录下的创建的目录会生成在本目录之下。在没有进行其余操作时,我们是不可以在除了resource目录之外的地方创建.properties文件的(因为maven的特性:约定大于配置)。
如果需要在别的地方生成.properties并且被导出的话,我们需要在pom文件的<build>标签中添加下面标签:

<build>
	<resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
</build>

这个是固定格式。
在我们添加了<resources>标签之后我们便可以在别的目录之下创建.properties文件,并且可以被导出了。
在这里插入图片描述
本章结束。

本章学习之后,遗留两个问题:
1.在我们进行javaweb开发时,我们的OutPutFileStream类能否使用相对路径?如果能,相对路径是从哪里开始的?
2.本人尝试了在’com.kuang.servlet’路径之下创建properties文件,但是在启动服务器之后整个’com.kuang.servlet’路径之下的类都没有在target文件中生成,这是什么问题导致的?

这两个问题,我之后会研究并且回答,如果有知道的小伙伴请在评论区留下答案。万分感谢!