本章目标
掌握application对象的主要操作;
掌握application和getServletContext()方法的联系;
可以通过application完成一个网站计数器的操作;
application对象
application对象是javax.servlet.ServletContext接口的实例化对象,从单词上翻译表示的是整个Servlet的上下文,ServletContext代表了整个容器的操作
取得虚拟目录对应的绝对路径
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<html>
<head>
<title>测试getRealPath()方法</title>
</head>
<body>
<%
String path=application.getRealPath("/");
%>
<h3>真实路径:<%=path %></h3>
</body>
</html>
效果图:
使用 getServletContext() 方法
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<html>
<head>
<title>使用 getServletContext() 方法</title>
</head>
<body>
<%
String path=this.getServletContext().getRealPath("/");
%>
<h3>真实路径:<%=path %></h3>
</body>
</html>
效果图:
注意
对于application对象而言,在WEB中也可以使用getServletContext()方法进行替代。
String path = this.getServletContext().getRealPath("/") ;
文件操作 —— 输入表单
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<html>
<head>
<title>输入文件名称及内容</title>
</head>
<body>
<form action="demo3Post.jsp" method="post">
输入文件名称:<input type="text" name="filename"><br />
输入文件内容:<textarea rows="3" cols="30" name="filecontent"></textarea><br/>
<input type="submit" value="保存">
<input type="reset" value="重置">
</form>
</body>
</html>
效果图:
文件操作 —— 保存内容
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.io.*" %><%-- 由于要使用IO操作,必须导入java.io包 --%>
<%@ page import="java.util.*"%><%-- Scanner在java.util包中定义 --%>
<html>
<head>
<title>接收内容并保存文件及内容</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");//解决中文乱码
String name=request.getParameter("filename");//接收保存的文件名称
String content=request.getParameter("filecontent");//接收保存的文件内容
String fileName=this.getServletContext().getRealPath("/")+"note"+File.separator+name;//拼凑文件名称
File file=new File(fileName);//实例化File类对象
if(!file.getParentFile().exists()){//判断父文件夹是否存在
file.getParentFile().mkdir();//创建文件夹
}
PrintStream ps=null;//定义打印流对象
ps=new PrintStream(new FileOutputStream(file));//准备向文件中保存
ps.print(content);//输出内容
ps.close();//关闭输出流
%>
<%
Scanner scan=new Scanner(new FileInputStream(file));//使用Scanner读取文件
scan.useDelimiter("\n");//设置读取分割符
StringBuffer buf=new StringBuffer();//要将所有内容都读取进来
while(scan.hasNext()){//取出所有数据
buf.append(scan.next()).append("<br/>");//保存在StringBuffer类中
}
scan.close();//关闭输入流
%>
<%=buf %>
</body>
</html>
效果图:
案例讲解:网站计数器
在一些站点中,读者经常会看见网站计数器这样的操作,那么这种操作现在就完全可以利用已经学习过的知识完成,但是在进行代码的开发之前,读者必须注意以下三个问题:
1、 网站的来访人数可能会有很多,有可能超过20位整数,所以必须使用大整数类 —— BigInteger完成;
2、 用户每次在第一次访问的时候才需要进行计数的操作,在执行计算之前必须使用isNew()判断;
3、 在进行更改、保存的时候需要进行同步操作。
查看application范围的属性
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ page import="java.util.*"%><%-- Scanner在java.util包中定义 --%>
<html>
<head>
<title>列出全部的属性名称及内容</title>
</head>
<body>
<%// 得到全部的属性名称
Enumeration enu = this.getServletContext().getAttributeNames();
while (enu.hasMoreElements()) { // 循环输出
String name = (String) enu.nextElement(); // 得到属性名称
%>
<h4><%=name%>--><%=this.getServletContext().getAttribute(name)%></h4>
<%
}
%>
</body>
</html>
效果图:
小结
application表示的是整个上下文的资源环境;
在实际中可以通过this.getServletContext()方法来代替application的使用;
通过getRealPath()方法可以取得一个虚拟目录对应的真实路径。