JSP内置对象---application
来源:互联网 发布:微信域名解封 编辑:程序博客网 时间:2024/05/06 07:26
Application
Application是javax.servlet.ServletContext接口的实例化对象,表示的是整个Servlet的上下文,ServletContext代表了整个容器的操作。
除了以上的三个方法之外,对于属性的增加、取得和删除也是有其应用的,setAttribute()、
getAttribute()、removeAttribute()。
取得绝对路径(重点)
如果要想取得一个虚拟目录对应的绝对路径要使用getRealPath()方法。
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head><title>application</title></head>
<body>
<% //http://localhost/skewrain/
String path = application.getRealPath("/");
//参数是可以访问虚拟目录的路径的最后一个字符。
%>
<h3>真实路径:<%=path%></h3>
</body>
</html>
执行此段代码的结果如下所示:
这个真实路径就是在server.xml文件之中配置完成的。
但是,在这里需要注意的是,application的操作本身是ServletContext接口的实例,但是在JSP之中有一个方法的功能可以完全与之对应:getServletContext()方法。
使用的方法为:String path = getServletContext().getRealPath("/");
这两个操作的效果完全一样,但是有的同学该问了,在正常情况下所有的方法不是应该由一个对象调用吗?为什么这里面没有对象,实际上如果现在非要在这个地方加上一个对象的话,那么这个对象就可以使用this,this表示的是当前容器。
一定要记住的是:this.getServletContext()方法一定要重点使用。
如果现在取得了绝对路径,那么就意味着在JSP之中可以进行文件操作了。
如果要想进行文件操作,首先一定需要通过File类找到一个指定的路径。这个路径最好是绝对路径,所以这个时候getRealPath()方法就起了作用了,因为所有的WEB目录都是活的。
保存及读取文件的源代码如下所示:【input_content.jsp】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.io.*"%>
<html>
<head><title>application</title></head>
<body>
<%
request.setCharacterEncoding("GBK"); //解决乱码问题
String name = request.getParameter("filename");
String content = request.getParameter("filecontent");
//要想操作文件必须有绝对路径,那么这个时候就使用getRealPath()
String fileName = this.getServletContext().getRealPath("/") +
"note" + File.separator + name ;//保存在note文件夹之中。
File file = new File(fileName); //实例化File类对象
if(!file.getParentFile().exists()){
file.getParentFile().mkdir(); //建立一个文件夹
}
PrintStream ps = null;
ps = new PrintStream(new FileOutputStream(file));
ps.println(content);
ps.close();
%>
</body>
</html>
【input_content.htm的内容如下:】
<html>
<head><title>application</title></head>
<body>
<form action="input_content.jsp" method="post">
输入文件名称:<input type="text" name="filename"><br>
输入文件内容:<textarea name="filecontent" cols="30"
rows="3"></textarea><br>
<input type="submit" value="保存">
<input type="reset" value="重置">
</form>
</body>
</html>
执行input_content.htm的结果如下:
点击“保存”之后,我们在虚拟目录org目录下发现了“note”文件夹:
内部有一个skewrain.txt的文件:
文件的内容如下:
下面把程序简单修改一下,当文件保存完毕之后让其再显示出来,这个时候就可以通过Scanner类完成。在原来的代码中加入如下的内容:
<%
Scanner scan = new Scanner(new FileInputStream(file));
scan.useDelimiter("\n");
StringBuffer buf = new StringBuffer();
while(scan.hasNext()){
buf.append(scan.next()).append("<br>");
}
scan.close();
%>
<%=buf%>
再次运行程序,可以看到输出:
网站计数器
在一些站点中,读者经常会看见网站计数器这样的操作,那么这种操作现在就完全可以利用已经学习过的知识完成,但是在进行代码的开发之前,读者必须注意以下三个问题:
1、网站的来访人数可能会有很多,有可能超过20位整数,所以必须使用大整数类—BigInteger完成;
2、用户每次在第一次访问的时候才需要进行计数的操作,在执行计算之前必须使用isNew()判断;
3、在进行更改、保存的时候需要进行同步操作。
BigInteger是java.math类中的类。
计数器操作的源码如下所示:【count.jsp】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.math.*"%>
<html>
<head><title>application</title></head>
<body>
<%!
BigInteger count = null;
%>
<%! //为了开发简便,将所有的操作定义在方法之中,所有的异常直接抛出。
public BigInteger load(File file){
BigInteger count = null;//接收数据
try{
if(file.exists()){
Scanner scan = new Scanner(new FileInputStream(file));
if(scan.hasNext()){
count = new BigInteger(scan.next());
}
}else { //应该保存一个新的,从0开始。
count = new BigInteger("0");
save(file,count); //保存一个新的文件
}
}catch(Exception e){
e.printStackTrace();
}
return count;
}
public void save(File file,BigInteger count){
try{
PrintStream ps = null;
ps = new PrintStream(new FileOutputStream(file));
ps.println(count);
ps.close();
}catch(Exception e){
e.printStackTrace();
}
}
%>
<%
String fileName = this.getServletContext().getRealPath("/") +
"count.txt"; //这里面保存所有的计数的结果
File file = new File(fileName);
if(session.isNew()){
synchronized(this){
count = load(file); //读取
count = count.add(new BigInteger("1"));//在原来的基础上 增加1。
save(file,count);
}
}
%>
<h2>您是第<%=count==null?0:count%>位访客!
</body>
</html>
执行此段程序的结果如下:
而且,此时,在skewrain目录下存在了一个count.txt的文件,里面保存了访客的数量。
查看属性
在application中也是存在属性操作的,但是在application里面有一个方法,可以取得全部的属性。查看application属性的代码如下所示:【all_attribute.jsp】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>application</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>
执行此段代码的结果如下所示:
这里只截取了部分的结果。
可以发现所有的通过tomcat配置的第三方的jar文件都是通过application属性设置到服务器上去的,所以在每次配置了一个新的开发包的时候,服务器必须重新启动。
小结:
1.Application表示的是整个上下文的资源环境;
2.在实际中可以通过this.getServletContext()方法来代替application的使用;
3.通过getRealPath()方法可以取得一个虚拟目录对应的真实路径。
- JSP内置对象----application
- application jsp内置对象
- JSP内置对象---application
- JSP内置对象---application
- jsp内置对象application
- JSP内置对象application
- JSP application内置对象
- jsp内置对象application
- JSP内置对象-application对象
- JSP内置对象-application对象
- JSP的内置对象application
- jsp内置对象之application
- 08JSP内置对象application
- ch6.JSP内置对象--application对象
- jsp内置对象值application对象
- JSP内置对象之-application对象
- jsp内置对象之Application对象
- JSP内置对象——application对象
- Bone Collector
- C++Primer 学习笔记 第二章(变量和基本数据类型)
- git问题
- 绘一场流年锦瑟,听一曲清扬花落
- 搭建Spring、Spring MVC、Mybatis和Freemarker
- JSP内置对象---application
- 邪门的Received lower prio advert, forcing new election
- 3.编程序实现求1-1000之间的所有奇数的和并输出。
- MySQL基础知识---------列类型存储需求
- linux debug工具总结
- pthread 系列函数 和 简单多线程服务器端程序
- 命令行操作github
- Android四大基本组件介绍与生命周期
- CSS文件编码对Jsp页面样式的影响