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()方法可以取得一个虚拟目录对应的真实路径。

 

0 0