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);
}
}