讲给Android程序员看的前端系列教程(40集免费视频教程+源码)
版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl
ServletContext接口概述
ServletContext接口是Servlet程序与Servlet容器之间进行通信的接口。Servlet容器在启动 Web应用时,会为其创建与之对应的ServletContext对象。每个Web应用都有一个唯一的ServletContext对象,它代表了当前Web应用。当Servlet容器初始化Servlet对象时,ServletContext对象随着ServletConfig对象提供给了Servlet。我们可通过ServletConfig对象的getServletContext( )方法获取ServletContext对象;除此以外,在HttpServlet中还可通过getServletContext( )方法直接获取ServletContext。
为了便于理解,我们可把ServletContext对象形象地理解为Web应用的管家。同一个Web应用中的所有Servlet对象都共享同一个管家,Servlet对象们也可通过这个管家来访问容器中的各种资源。
接下来,我们通过示例的方式介绍ServletContext接口的常见应用场景及其使用方式。
利用ServletContext接口获取Web应用参数
在web.xml文件中,不仅可以配置Servlet的初始化信息,还可配置整个Web应用的参数信息。
接下来,我们来通过示例获取Web应用参数。
web.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ServletContext1</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>testServletContext</servlet-name>
<servlet-class>cn.com.TestServletContext</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServletContext</servlet-name>
<url-pattern>/testServletContext</url-pattern>
</servlet-mapping>
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
<context-param>
<param-name>size</param-name>
<param-value>200</param-value>
</context-param>
</web-app>
在该示例中使用context-param标签配置整个Web应用的参数信息。
TestServletContext如下:
package cn.com;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*
* 利用ServletContext获取Web应用初始化参数
*/
public class TestServletContext extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
System.out.println("deGet()");
ServletContext servletContext = this.getServletContext();
// 获取所有的初始化参数名
Enumeration<String> parameterNames = servletContext.getInitParameterNames();
while (parameterNames.hasMoreElements()) {
String parameterName = parameterNames.nextElement();
// 获取参数对应的值
String parameterValue = servletContext.getInitParameter(parameterName);
System.out.println(parameterName + "=" + parameterValue);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
System.out.println("dePost()");
this.doGet(request, response);
}
}
index.html如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Servlet</title>
</head>
<body>
<h1>本文作者:谷哥的小弟</h1>
<h1>博客地址:http://blog.csdn.net/lfdfhl</h1>
</body>
</html>
页面如下:
访问Servlet其url为 http://localhost:8080/ServletContext1/testServletContext ,结果如下:
利用ServletContext接口实现多个Servlet共享数据
在Web应用中所有Servlet共享同一个ServletContext对象。所以,我们可将数据存放在ServletContext域(范围)中,从而实现多个Servlet共享数据。ServletContext接口中与域属性相关常用方法如下:
Enumeration< String > getAttributeNames( )
该方法返回一个Enumeration对象,该对象包含所有存放在 ServletContext中的所有域属性名
public Object getAttribute(String name)
该方法根据参数指定的属性名返回一个与之匹配的域属性值
public void setAttribute(String name, Object object)
该方法用于设置ServletContext的域属性。其中,name是域属性名, obj是域属性值
public void removeAttribute(String name)
该方法根据参数指定的域属性名从ServletContext中删除匹配的域属性
接下来,我们来通过示例实现多个Servlet共享数据。
web.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ServletContext2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>testServletContext1</servlet-name>
<servlet-class>cn.com.TestServletContext1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServletContext1</servlet-name>
<url-pattern>/testServletContext1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>testServletContext2</servlet-name>
<servlet-class>cn.com.TestServletContext2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServletContext2</servlet-name>
<url-pattern>/testServletContext2</url-pattern>
</servlet-mapping>
</web-app>
在该web.xml文件中共配置了两个Servlet。
TestServletContext1如下:
package cn.com;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*
* 利用ServletContext保存数据
*/
public class TestServletContext1 extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("deGet()");
//获取ServletContext
ServletContext servletContext = this.getServletContext();
//向ServletContext中保存数据
servletContext.setAttribute("username", "lucy");
response.getWriter().write("This response come from the fisrt HttpServlet");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("dePost()");
this.doGet(request, response);
}
}
TestServletContext2如下:
package cn.com;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*
* 利用ServletContext获取数据
*/
public class TestServletContext2 extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("deGet()");
//获取ServletContext
ServletContext servletContext = this.getServletContext();
//从ServletContext中获取数据
String username = (String)servletContext.getAttribute("username");
response.getWriter().write("This response come from the second HttpServlet <br/>");
response.getWriter().write("username="+username);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("dePost()");
this.doGet(request, response);
}
}
index.html如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Servlet</title>
</head>
<body>
<h1>本文作者:谷哥的小弟</h1>
<h1>博客地址:http://blog.csdn.net/lfdfhl</h1>
</body>
</html>
页面如下:
我们先来访问TestServletContext1,其url为 http://localhost:8080/ServletContext2/testServletContext1
结果如下:
我们再来访问TestServletContext2,其url为 http://localhost:8080/ServletContext2/testServletContext2
结果如下:
利用ServletContext接口读取Web应用的资源文件
我们可利用ServletContext读取Web应用的资源,例如:图片,配置文件等等。ServletContext接口与资源文件读取相关常用方法如下:
public Set< String > getResourcePaths(String path)
该方法返回一个Set集合,集合中包含资源目录中子目录和文件的路径名称。请注意:参数path必须以正斜线/开始,指定资源的部分路径
public String getRealPath(String path)
该方法返回资源文件在服务器文件系统上的真实路径(绝对路径)。参数path代表资源文件的虚拟路径,该参数应该以正斜线/开始,/表示当前Web应用的根目录。
public URL getResource(String path) throws MalformedURLException
该方法返回资源文件对应的URL对象。参数path必须以正斜线/开始,/表示当前Web应用的根目录。
public InputStream getResourceAsStream(String path)
该方法返回某个资源文件对应的InputStream输入流对象。参数path必须以正斜线/开始,/表示当前Web应用的根目录。
我们来看一个例子,项目结构如下:
- 在WEB-INF目录下创建city.txt
- 在WebContent目录下创建name.txt
- 在WebContent目录下创建test.properties
web.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ServletContext4</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>testServletContext</servlet-name>
<servlet-class>cn.com.TestServletContext</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServletContext</servlet-name>
<url-pattern>/testServletContext</url-pattern>
</servlet-mapping>
</web-app>
TestServletContext如下:
package cn.com;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*
* 利用ServletContext操作资源
* 1、获取资源真实路径
* 2、获取资源流
* 3、获取指定目录下所有资源路径
* 4、读取属性文件中的内容
*/
public class TestServletContext extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("deGet()");
ServletContext servletContext = this.getServletContext();
PrintWriter writer = response.getWriter();
writer.write("<!DOCTYPE html>");
writer.write("<html>");
writer.write("<head>");
writer.write("<meta charset=\"UTF-8\">");
writer.write("<title>Servlet</title>");
writer.write("</head>");
writer.write("<body>");
getResourceRealPath(servletContext, response);
getResourceStream(servletContext, response);
getAllResourcePath(servletContext, response);
getPropertyFileContent(servletContext,response);
writer.write("</body>");
writer.write("</html>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("dePost()");
this.doGet(request, response);
}
//获取资源真实路径
public void getResourceRealPath(ServletContext servletContext,HttpServletResponse response) {
try {
PrintWriter writer = response.getWriter();
String namePath = servletContext.getRealPath("/name.txt");
String cityPath = servletContext.getRealPath("/WEB-INF/city.txt");
writer.write("namePath="+namePath+"<br/><br/>");
writer.write("cityPath="+cityPath+"<br/><br/>");
writer.write("---------------------<br/><br/>");
} catch (Exception e) {
// TODO: handle exception
}
}
//获取资源输入流
public void getResourceStream(ServletContext servletContext,HttpServletResponse response) {
try {
PrintWriter writer = response.getWriter();
InputStream nameInputStream = servletContext.getResourceAsStream("/name.txt");
InputStream cityInputStream = servletContext.getResourceAsStream("/WEB-INF/city.txt");
byte[] nameByteArray=new byte[1024*1];
int nameLen = nameInputStream.read(nameByteArray);
String nameContent=new String(nameByteArray,0,nameLen);
byte[] cityByteArray=new byte[1024*1];
int cityLen = cityInputStream.read(cityByteArray);
String cityContent=new String(cityByteArray,0,cityLen);
writer.write("nameContent="+nameContent+" , cityContent="+cityContent+"<br/><br/>");
writer.write("---------------------<br/><br/>");
} catch (Exception e) {
// TODO: handle exception
}
}
//获取指定目录下所有资源路径
public void getAllResourcePath(ServletContext servletContext,HttpServletResponse response) {
try {
PrintWriter writer = response.getWriter();
Set<String> pathSet = servletContext.getResourcePaths("/WEB-INF");
Iterator<String> iterator = pathSet.iterator();
while(iterator.hasNext()) {
String path = iterator.next();
writer.write(path+"<br/>");
}
writer.write("---------------------<br/><br/>");
} catch (Exception e) {
// TODO: handle exception
}
}
//读取属性文件中的内容
public void getPropertyFileContent(ServletContext servletContext,HttpServletResponse response) {
try {
PrintWriter writer = response.getWriter();
String path=servletContext.getRealPath("/test.properties");
Properties properties=new Properties();
properties.load(new FileInputStream(path));
String username=(String) properties.getProperty("username");
writer.write("username="+username+"<br/><br/>");
writer.write("---------------------<br/><br/>");
} catch (Exception e) {
// TODO: handle exception
}
}
}
结果如下:
转载:https://blog.csdn.net/lfdfhl/article/details/101398899