接上篇:JavaWeb-Servlet(三)Servlet的一些细节
在正文之前,补充一点。
服务器会为每个应用创建一个ServletContext 对象::
一个项目只有一个ServletContext对象!
ServletContext对象的作用是在整个Web应用的动态资源之间共享数据!例如在AServlet 中向ServletContext对象中保存一个值, 然后在BServlet中就可以获取这个值,这就是共享数据了。
在Servlet中获取ServletContext 对象:
ServletContext context =config.getServletContext()
,getServletContext()
方法可以用来获取ServletContext 对象。在GenericServlet或HttpServlet中获取ServletContext对象:
getServletContext()
方法 ,所以可以直接使用this.getServletContext()
来获取。ServletContext是JavaWeb四大域对象之一。
所有域对象都有存取数据的功能,因为域对象内部有一个Map,用来存储数据,下面是ServletContext对象用来操作数据的方法:
void setAttribute(String name, Object value)
:用来存储一个对象,也可以称之为存储一个域属性,例如: servletContetxtAttribute("xxx", “XXX")
,在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同。
Object gettribute(String name)
:用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如: String value = (String)servletContextAttribute("xxx");
,获取名为xxx的域属性;
void removeAttribute(String name)
:用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
Enumeration getAttributeNames()
:获取所有域属性的名称。
Servlet也可以获取初始化参数,但它是局部的参数;也就是说,一个servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备。
还可以使用ServletContext来获取在web.xml文件中配置的应用初始化参数,即配置公共的初始化参数,为所有Servlet而用。
配置格式
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
......
<context-param>
<param-name>name1param-name>
<param-value>value1param-value>
context-param>
<context-param>
<param-name>name2param-name>
<param-value>value2param-value>
context-param>
......
web-app>
示例
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/*
* 1.得到ServletContext
* 2.调用它的getInitParameter(String name)方法得到初始化参数
*/
ServletContext context = this.getServletContext();
String initParameter = context.getInitParameter("name1");
System.out.println(initParameter);
}
}
还可以使用ServletContext对象来获取Web应用下的资源,例如在应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。
获取a.txt的真实路径: String realPath = servletContext.getRealPath("/a.txt");
, realPath的值为a.txt文件的绝对路径: F:\tomcat7\webapps\hello\a.txt
获取b.txt的真实路径: String realPath= servletContext.getRealPath("/WEB-INF/b.txt");
不只可以获取资源的路径,还可以通过ServletContext获取资源流,即把资源以输入流的方式获取:
InputStream in= servletContext.getResourceAsStream("a.txt");
InputStream in= servletContext.getResourceAsStream("/WEB-INF/b.txt");
还可以使用ServletContext 获取指定目录下所有资源路径,例如获取/WEB-INF下所有资源的路径:
ServletContext context = this.getServletContext();
Set set = context.getResourcePaths("/WEB-INF");
System.out.println(set);
一个项目中所有的资源访问都要对访问量进行了累加!
创建一个int类型的变量,用来保存访问量,然后保存到ServletContext的域中,这样可以让所有的Servlet都可以访问到。
public class AServlet extends HttpServlet {
/**
* 统计网站访问量
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = this.getServletContext();
// 从ServletContext对象中获取名为count的属性
Integer count = (Integer) servletContext.getAttribute("count");
// 如果存在,给访问量加1,然后保存回去
// 如果不存在,说明是第一次访问。向ServletContext中保存名为count的属性,值为1
if (count == null) {
servletContext.setAttribute("count", 1);
} else {
servletContext.setAttribute("count", count + 1);
}
// 向浏览器输出:需要使用响应对象
PrintWriter pw = response.getWriter();
pw.print(""
+ servletContext.getAttribute("count") + "");
}
}
不过服务器重启的话,计数就会被重置。