1、域对象了解(四种)
PageContext(jsp页面) :当前页面与标签 之间共享数据。
ServletRequest(一次请求)
HttpSession(一次会话)
ServletContext(整个web应用)
其中后三个又称Servlet三大域
域对象功能:存数据,取数据,删数据等
功能原理:域对象内部有一个 map 用来存储数据
域对象都有的三个方法:
1)void setAttribute(String name ,Object value): 存数据
用来存储一个域属性,name为属性名 value为属性值
2)Object getAttribute(String name):取数据
eg: 获取名为xxx的域属性 需要将Object类型强转为String类型
String value = (String)servletContext.getAttribute("xxx");
3)void removeAttribute(String name): 删除数据
2、ServletContext域对象概述
是JavaWeb四大域对象之一
作用:在整个web应用的动态资源之间共享数据
--使用ServletContext对象给N多个servlet传递数据。
特性:
唯一性:一个项目只有一个ServletContext对象
生命周期:ServletContext对象在服务器启动时创建,服务器关闭时销毁。
获取ServletContext对象的方法:
1)Servlet类中
在init(ServletConfig config)中,
ServletContext context = config.getServletContext();
2)GenericeServlet或HttpServlet类中
this.getServletContext();
3)HttpSession类 .getServletContext();
4)ServletContextEvent类 .getServletContext();
3、ServletContext对象操作数据的方法:
1)void setAttribute(String name ,Object value): 存数据
用来存储一个域属性,name为属性名 value为属性值
2)Object getAttribute(String name):取数据
eg: 获取名为xxx的域属性 需要将Object类型强转为String类型
String value = (String)servletContext.getAttribute("xxx");
3)void removeAttribute(String name): 删除数据
4)Enumeration getAttribute(): 获取所有域属性的名称、
演示一: 在ServletContext中保存数据
步骤:
1. 获取ServletContext对象
2. 调用setAttribute()方法完成保存数据
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1. 获取ServletContext对象
ServletContext application = this.getServletContext();
//2. 调用setAttribute()方法完成保存数据
application.setAttribute("name", "张三");
}
演示二: 在ServletContext中获取数据
步骤:
1. 获取ServletContext对象
2. 调用getAttribute()方法完成获取数据
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1. 获取ServletContext对象
ServletContext application = this.getServletContext();
//2. 调用getAttribute()方法完成获取数据,并输出
String name = (String)application.getAttribute("name");
System.out.println(name);
}
4、ServletContext获取应用初始化参数。
背景:每个Servlet只能获取自己的初始化参数
--配置的公共初始化参数,需要通过ServletContext使用
配置:在web.xml文件中使用<context-param>标签
配置示例: <context-param>
<param-name> name1 </param-name> //参数名
<param-value> value1 </param-value> //参数值
</context-param>
调用步骤:
1)继承HttpServlet
2)得到ServletContext对象
3)调用getInitParameter(String name) //传参为参数名
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//2. 获取ServletContext对象
ServletContext application = this.getServletContext();
//3. 调用setAttribute()方法完成保存数据
String value1 = application.getInitParameter("name1");
}
5、ServletContext获取真实路径(重点)
背景介绍:当项目发布后,地址被改动时。则需要动态得到真实路径
演示:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
获取真实路径:
方式1:
//用this获取ServletContext对象 并调用.getRealPath("");方法
String path = this.getServletContext().getRealPath("index.jsp");
//得到的是盘符路径。
//E:\apache-tomcat-7.0.88\webapps\day09_2\index.jsp
System.out.println(path);
//得到资源流
InputStream input = new FileInputStream(path);
方式二:以上三条语句合并
//获取路径后,直接创建输入流对象
InputStream input2 = this.getServletContext().getResourceAsStream(path);
获取所有文件路径:
//使用context.getResourcePaths("/文件路径"); 路径前必须有"/"
Set<String> paths = this.getServletContext().getResourcePaths("/WEB-INF");
//输出内容:[/WEB-INF/lib/, /WEB-INF/classes/, /WEB-INF/web.xml]
System.out.println(paths);
}
6、案例: 访问量统计
原理:使统计值被所有Servlet共享。
思路:最初时,ServletContext中没有保存访问量相关的属性
当本站第一次被访问时,创建一个保存访问数的变量,初值为一;保存到ServletContext中
以后访问时,从ServletContext中获取变量,对变量+1
步骤:
1)获取ServletContext对象
2)查看获取是否存在count属性
不存在:存数据,设初值为一 .setAttribute("count",1);
存在:设置原有数值加一 .setAttribute("count",count+1);
//1)获取ServletContext对象
ServletContext app = this.getServletContext();
//2)获取是否存在count属性 方法返回值为Object 则强转为count
Integer count = (Integer) app.getAttribute("count");
if(count == null){
app.setAttribute("count", 1); //bug--初值为null
}else{
app.setAttribute("count", count+1);
}
//3)向浏览器输出 需要使用响应对象
PrintWriter out = response.getWriter();
out.print("<h1>"+ count +"</h1>");
7、获取类路径下的资源
类路径: 对于javaweb项目而言;
是/WEB-INF/classes 和/WEB-INF/lib/*.jar (lib下每一个jar包)
理解:
src下内容会在/WEB-INF/classes中出现,,同时.java会编译成.class
class
Classloader:类加载器 从的WEB-INF\class文件夹下找.class文件来加载类
步骤:
//相对于/classes目录
1)得到class 再得到ClassLoader
ClassLoader cl = this.getClass().getclassLoader();
2)调用getResourceAsStream() 得到InputStream
InputStream input = cl.getResourceAsStream("a.text");
3)导入jar包
commons-io-1.4.jar
//读取输入流内容,转成字符串输出
4)String s = IOUtils.toString(input);
//相对于.class文件所在目录(包内)
1)步骤替换为
ClassLoader cl = this.getClass()