ServletConfig对象和ServletContext对象

本文详细介绍了Servlet中ServletConfig与ServletContext对象的应用,包括初始化参数的配置与获取、上下文对象的使用、请求转发及缓存设置等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.ServletConfig对象
(1)在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
例如:

package cn.lsl.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		ServletConfig config = this.getServletConfig();
		//方法一:通过getInitParameter()方式获取
		//String value = config.getInitParameter("charset");
		//System.out.println(value);
		
		//方法二:通过getInitParameterNames()方式获得
		Enumeration e = config.getInitParameterNames();
		while(e.hasMoreElements()){
			String name = (String)e.nextElement();
			String value = config.getInitParameter(name);
			System.out.println(name+"="+value);
		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request,response);
	}
}

web.xml

<servlet>
    <servlet-name>ServletDemo1</servlet-name>
    <servlet-class>cn.lsl.web.servlet.ServletDemo1</servlet-class>
    <init-param>
    	<param-name>charset</param-name>
    	<param-value>UTF-8</param-value>
    </init-param>
    <init-param>
    	<param-name>XXX</param-name>
    	<param-value>YYYY</param-value>
    </init-param>
</servlet>

当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
2.ServletContext对象
(1)WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
(2)ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以ServletConfig.getServletContext方法获得ServletContext对象。
(3)由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
例如:

ServletDemo1.java

package cn.lsl.web.servlet;

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

public class ServletDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
		//两种获取servletContext对象的方式
		ServletContext context = this.getServletConfig().getServletContext();
		//ServletContext context1 = this.getServletContext();
		//servletDemo1带数据给servletDemo2(用context对象实现数据共享)
		context.setAttribute("data", "aaa");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request,response);
	}
}


ServletDemo2.java

package cn.lsl.web.servlet;

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

public class ServletDemo2 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		ServletContext context = this.getServletContext();
		System.out.println(context.getAttribute("data"));
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request,response);
	}
}

(4)通过servletContext,获取为web应用配置的初始化参数

package cn.lsl.web.servlet;

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

public class ServletDemo3 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String url = this.getServletContext().getInitParameter("url");
		String username = this.getServletContext().getInitParameter("username");
		String password = this.getServletContext().getInitParameter("password");
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request,response);
	}
}


web.xml

web.xml
  <context-param>
  	<param-name>url</param-name>
  	<param-value>jdbc:mysql://localhost:3306/test</param-value>
  </context-param>
  <context-param>
  	<param-name>username</param-name>
  	<param-value>root</param-value>
  </context-param>	
  <context-param>
  	<param-name>password</param-name>
  	<param-value>123456</param-value>
  </context-param>

(5)通过通过servletContext获取文件的mime类型

package cn.lsl.web.servlet;

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

public class ServletDemo4 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String filename = "1.jpg";
		ServletContext context = this.getServletContext();
		System.out.println(context.getMimeType(filename));
		response.setHeader("content-type", "image/jpeg");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}
}

(6)通过servletContext 实现请求转发,servletDemo9收到请求后,转发给index.jsp处理   (mvc设计模式)

ServletDemo5.java

package cn.lsl.web.servlet;

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

public class ServletDemo5 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String data = "aaaaa";
		this.getServletContext().setAttribute("data", data);
		RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/index.jsp");
		rd.forward(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request,response);
	}
}

idex.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
    <title>My JSP 'index.jsp' starting page</title>
  </head>
  <body>
    <font color="red" size="100px">
    	${data}
    </font>
  </body>
</html>

(7)读取配置文件
配置文件:db.properties
url=jdbc:mysql://localhost:3306/test
username=root
password=123456
package cn.lsl.web.servlet;

package cn.lsl.web.servlet;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo6 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		test3();
	}
	
	
	//读取配置文件的第一种方式
	private void test1() throws IOException{
		ServletContext context = this.getServletContext();
		InputStream in = context.getResourceAsStream("/db.properties");
		Properties prop = new Properties();
		prop.load(in);
		String url = prop.getProperty("url");
		String username = prop.getProperty("username");
		String password = prop.getProperty("password");
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}
	
	
	//读取配置文件的第二种方式(读取真实路径)   此种方式可以获取到读取的配置文件的文件名
	private void test2() throws IOException{
		ServletContext context = this.getServletContext();
		String realpath = context.getRealPath("/db.properties");
		
		//获取到操作文件名
		String filename = realpath.substring(realpath.lastIndexOf("\\")+1);
		System.out.println("当前读到的文件是:"+filename);
		FileInputStream in = new FileInputStream(realpath);
		Properties prop = new Properties();
		prop.load(in);
		String url = prop.getProperty("url");
		String username = prop.getProperty("username");
		String password = prop.getProperty("password");
		
		System.out.println("文件中有如下数据:");
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}
	
	//读取src下的配置文件
	private void test3() throws IOException{
		InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
		Properties prop = new Properties();
		prop.load(in);
		String url = prop.getProperty("url");
		String username = prop.getProperty("username");
		String password = prop.getProperty("password");
		
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request,response);
	}
}

(8)web工程的普通java程序中如何读取资源文件

package cn.lsl.dao;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

//在web工程的普通java程序中如何读取资源文件 
public class StudentDao {
	public String get() throws IOException{
		//test1();
		test2();
		return null;
	}
	
	//以下代码在读文件时,可以读到更新后的文件(该方法找到文件的绝对路径)
	public void test2() throws IOException{
		ClassLoader loader = StudentDao.class.getClassLoader();
		URL url = loader.getResource("cn/lsl/dao/db.properties");
		String filepath = url.getPath();
		FileInputStream in = new FileInputStream(filepath);
		Properties prop = new Properties();
		prop.load(in);
		String dburl = prop.getProperty("url");
		String username = prop.getProperty("username");
		String password = prop.getProperty("password");
		
		System.out.println(dburl);
		System.out.println(username);
		System.out.println(password);
	}
	
	//以下代码在读文件时,读不到更新后的文件
	public void test1() throws IOException{
		ClassLoader loader = StudentDao.class.getClassLoader();
		InputStream in = loader.getResourceAsStream("cn/lsl/dao/db.properties");
		Properties prop = new Properties();
		prop.load(in);
		String url = prop.getProperty("url");
		String username = prop.getProperty("username");
		String password = prop.getProperty("password");
		
		System.out.println(url);
		System.out.println(username);
		System.out.println(password);
	}
}

ServletDemo7.java

package cn.lsl.web.servlet;

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

import cn.lsl.dao.StudentDao;

//在普通java程序中如何读取资源文件的数据
public class ServletDemo7 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		StudentDao dao = new StudentDao();
		String student = dao.get();
		
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request,response);
	}
}

类装载器读文件,适用于小文件,大文件不适合用类装载器去读

(9)获取web.xml文件中配置的web应用的显示名称

package cn.lsl.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo8 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = this.getServletContext().getServletContextName();
		response.getWriter().write("<a href='/"+name+"/aa.html'>点点</a>");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request,response);
	}
}


web.xml

<display-name>ServletContext</display-name>

(10)在客户端缓存Servlet的输出
对于不经常变化的数据,在servlet中可以为其设置合理的缓存时间值,以避免浏览器频繁向服务器发送请求,提升服务器的性能。

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
    <title>My JSP 'index.jsp' starting page</title>
  </head>
  
  <body>
    <a href="/ServletContext/servlet/ServletDemo9">ServletDemo9</a>
  </body>
</html>

ServletDemo9.java

package cn.lsl.web.servlet;

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

//设置浏览器的缓存
public class ServletDemo9 extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		long expriestime = System.currentTimeMillis()+1*24*60*60*1000;
		response.setDateHeader("expires", expriestime);
		String data = "adsdfdfghhhj";
		response.getWriter().write(data);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request,response);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值