ServletContext中getRealPath()读取文件、观察servlet运行过程

本文介绍了ServletContext的getRealPath()方法,用于获取项目运行目录的路径,并通过实例展示了如何利用该方法读取服务器上的文件数据。同时,文章详细描述了Servlet的运行过程,包括启动、刷新、不同浏览器访问以及服务关闭时的方法调用情况。

1.getRealPath()

getServletContext()中的方法getRealPath()其作用是获取项目运行目录的路径

该方法继承自父类HttpServlet

//声明上下文对象
ServletContext sc; 

//获得ServletContext对象
sc = this.getServletContext();
		
//测试一:获取项目中文件的绝对路径
String path = sc.getRealPath("WEB-INF/count.txt");

//测试二:获取项目在服务器的绝对路径
String path = sc.getRealPath("/");

//在控制台输出路径
System.out.println(path);

测试一运行结果:

测试二运行结果:

简单总结为:

servletContext.getRealPath("");   -->列: E:\apache-tomcat项目名

servletContext.getRealPath("/");   -->列: E:\apache-tomcat\项目名\

servletContext.getRealPath("/文件名");   -->列: E:\apache-tomcat\项目名\文件名


2.利用上下文对象获取服务器上的文件里的数据实例以及观察servle运行过程

源代码:

package servlet;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * @author fhzheng
 * <li>演示Servlet的生命周期
 */
@WebServlet("/LifeServlet")
public class LifeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	// 声明计数器,上下文对象,路径
	int count;
	ServletContext sc;
	String path;
    
	/**
	 * <li> 做一些准备工作
	 * <li> 1获取上下文环境
	 * <li> 2从上下文对象获取文件路径
	 * <li> 3读取文件中的信息
	 * <li> 
	 * <li> 注意,首次读取时,因为没有文件,可能会有异常Null
	 * <li> 然后用不同的浏览器来访问时,就可以看到共享的计数了
	 */
	public void init() throws ServletException{
		//count = 0;
		System.out.println("在init中完成计数器的初始化begin");
		sc = this.getServletContext();
		path = sc.getRealPath("WEB-INF/count.txt");
		System.out.println(path);
		try {
			InputStream is = LifeServlet.class.getResourceAsStream("count.txt");
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String string = br.readLine();
			System.out.println("读到的字符串是:"+string);
			count = Integer.parseInt(string);
			br.close();
			is.close();
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
		System.out.println("在init中完成计数器的初始化end");
	}
	
	/**
	 * <li> 销毁
	 */
	public void destroy() {
		System.out.println("Servlet已经释放");
	}
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LifeServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * <li> 处理输出到响应中的信息
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
        // 设置输出类型和编码字符集
		response.setContentType("text/html;charset=utf-8");
        // 获取out对象
		PrintWriter out = response.getWriter();
        // 计数器自增1
		count++;
        // 插旗
		out.println("这个Servlet历史上已经被访问了"+count+"次了!");
        // 写到文件的组合动作
		// 1 获取输出流对象
		OutputStream fw = new FileOutputStream(path);
        // 2 得到写缓存
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fw));
        // 3 准备好数据格式:字符串,由整数转换得到
		String string = String.valueOf(count);
        // 4 写回到文件
		bw.write(string);
        // 5 关闭文件相关资源
		bw.close();
		fw.close();
		
		System.out.println("该Servlet的doGet方法被执行了一次");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
		System.out.println("该Servlet的doPost方法被执行了一次");
	}

}

注:访问index.html文件后使用dopost方法调用源代码。

1.启动servlet

1)console输出:

 可以看到调用init初始化完成,doget和dopost方法也成功调用。

2)网页显示:

 2.刷新网页

1)console输出:

 由于已经初始化完成,所以不调用init方法

2)网页显示:

 

 3.换用浏览器

由于使用ServletContext中getRealPath()方法读取访问次数所在文件count.txt,即利用上下文对象获取服务器上的文件里的数据,所以用不同的浏览器来访问时,就可以看到共享的计数

谷歌浏览器网页显示:

 4.关闭服务

 成功调用destroy方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值