在javaweb中通过servlet类和普通类读取资源文件

javaweb有两种方式读取资源文件

在Servlet中读取,可以使用servletContextservletContext可以拿到web所有的资源文件,然后随便读,但是这种方法不常用,尽量少在Servlet中读取资源文件

在普通Java类中(DAO中),使用类加载器来读  和 绝对路径来读取

      类装载器可以访问的范围是classes文件夹下的文件

 

src文件夹下面的文件在发布之后都会在classes文件夹下,也就是整个类加载器,都可以通过类加载器来操作

 

 

1. 使用servletContext

 

软件开发中,用作资源文件(配置文件)的文件类型有两种:xml文件和properties文件 

比如新建一个properties文件,用作数据库的配置

url=jdbc\:mysql\://localhost\:3006/test
username=test
password=123

 

然后在Servlet中读取文件

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
InputStream instream
= this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.propertites"); Properties pro = new Properties(); //map pro.load(instream);String url = pro.getProperty("url");String username = pro.getProperty("username");System.out.println(url);System.out.println(username);}

 

其中路径不能写成"/src/db.propertites", / 表示当前web程序

因为最终读取的是发布在服务器中的文件。都是在classes文件夹下面

 

对于properties文件的操作都可以使用properties这个类

这个类是把文件中的数据以map形式存储,

有几行就会有几个元素

 

注意:

我们在写Java的时候常用下面这种方式读取文件,但是在javaweb中是不行的

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {FileInputStream  instream = new FileInputStream("/WEB-INF/classes/db.propertites");    Properties pro = new Properties(); //map
      pro.load(instream);String url = pro.getProperty("url");String username = pro.getProperty("username");System.out.println(url);System.out.println(username);}

 

  FileInputStream  instream = new FileInputStream("/WEB-INF/classes/db.propertites");    

考虑清楚这个相对路径是相对谁的。

这句话是由服务器来调用,服务器由Java虚拟机来运行,所以这个是相对Java虚拟机的启动目录

Java虚拟机的目录是?

 

我们启动服务器都是在C:\tomcat\bin目录下的startup.bat,启动的时候同时启动虚拟机

所以是相对的是这个目录。。

 

所以,在javaweb中读取文件,用Servlet不能使用这种方式,这种方式必须把文件放在Java虚拟机目录下

 

传统方式也不是不可行,必须要知道文件的绝对路径 

使用servletContext先得到文件在磁盘的绝对路径。

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.propertites")FileInputStream  instream = new FileInputStream(path);    Properties pro = new Properties(); //map
      pro.load(instream);String url = pro.getProperty("url");String username = pro.getProperty("username");System.out.println(url);System.out.println(username);}

 

这中方式可以得到该文件的名称。

因为有时间文件名称是客户机传过来的,开发者需要知道

就需要截取path字符串了。

path.substring(path.lastIndexOf("\\") +1)

 

 2. 使用类装载器

对数据库配置文件的读取,一般是不放在servlet中的,一般是放在DAO类中

这样才能把web层和数据层分开来

 

类装载器:

  Java虚拟机使用每一个类的第一件事情就是将该类的字节码装载近来,装载类字节码的功能是由类装载器完成的,类装载器负责根据一个类的名称来定位和生成类的字节码数据后返回给Java虚拟机。最常见的类装载器是将要加载的类名转换成一个.class文件名,然后从文件系统中找到该文件并读取其中的内容,这种类装载器也不是直接将.class文件中的内容原封不动地返回给Java虚拟机,它需要将.class文件中的内容转换成Java虚拟机使用的类字节码。不管类装载器采用什么方式,只要能够在内存中制造出给Java虚拟机调用类字节码即可,所以把类装载器描述为类字节码的制造器更容易让人理解。 

 

    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {userDAO dao= new userDAO();dao.update();}

 

 

public class userDAO {public void update() throws IOException {InputStream instream =userDAO.class.getClassLoader().getResourceAsStream("db.propertites");        Properties pro = new Properties(); //map
      pro.load(instream);String url = pro.getProperty("url");String username = pro.getProperty("username");System.out.println(url);System.out.println(username);}}

 

 

其中userDAO.class.getClassLoader

得到类装载器

 

因为他们都是在Classes文件夹下面,所以可以访问到该文件

 

由于对数据库的操作方法有很多,不能每个方法里面都写这种,所以可以使用静态代码块的方式。

public class userDAO {private static Properties dbconfig =new Properties();static{try {InputStream instream =userDAO.class.getClassLoader().getResourceAsStream("db.propertites");dbconfig.load(instream);} catch (Exception e) {throw new ExceptionInInitializerError(e);}}public void update() throws IOException {        System.out.println(dbconfig.getProperty("url"));        }public void find() throws IOException {        }public void delete() throws IOException {        }}

 

 使用类装载器读取文件的弊端:

1.文件不能太大,因为它是以装载类的方式一次性加入内存中

2.类装载器只会加载一次,就是说不能显示文件的更新操作

 

3.使用绝对路径读取

如果需要读到实时数据,就不能通过类装载器来读文件,需要通过普通的文件路径的方式

还是要通过类装载的方式来得到文件的位置

public class DAO {public void update() throws IOException{String path = DAO.class.getClassLoader().getResource("db.properties").getPath();FileInputStream in= new FileInputStream(path);Properties pros = new Properties();pros.load(in);String url = pros.getProperty("url");    }}

 

 

 

转载于:https://www.cnblogs.com/tech-bird/p/3843832.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学图形(1.43)贝壳形曲线与鱼形曲线

贝壳形曲线 #http://curvebank.calstatela.edu/naturalcurves/slide7.jpgvertices 12000t from 0 to (2*PI)r 10*(0.7 2.6*cos(t) 1.3*pow(sin(90*t), 3))x r*sin(t) y r*cos(t) 鱼形曲线 #http://www.2dcurves.com/quartic/quarticfi.html vertices 1000 t from 0 to…

linux下编译ios,为iOS安装OpenCV

一,要求CMake 2.8.8 或者更高Xcode 4.2 或者更新二,从Git库取得最新的 OpenCV使用 git 客户端从 http://github.com/itseez/opencv clone Open 库。在 max os x 下,可以通过以下命令行完成cd ~/git clone https://github.com/Itseez/opencv…

学习使用资源文件[11] - DLL 中的资源文件

本例将把一张 bmp 图片, 以资源文件的方式嵌入 dll, 然后再调用.第一步: 建一个 DLL 工程, 如图:然后保存, 我这里使用的名称都是默认的.第二步: 建一个资源原文件, 如图:编辑内容如下(路径中的文件一定要存在):img1 BITMAP "c:\temp\test.bmp"然后, 取个名(后缀须是…

linux 自动安装 yum,LINUX6安装YUM仓库和实现开机自动挂载

# LINUX6安装YUM仓库和实现开机自动挂载---------------------------------安装环境-------------------------------Redhat6镜像文件:链接:https://pan.baidu.com/s/1DKH6adbrsipM-cTzH-wBgA 百度网盘 密码是hxcbVmware Workstation虚拟机工具&#x…

.NET Framework 4.0源代码

原文出处:http://blogs.microsoft.co.il/blogs/arik/archive/2010/07/12/step-into-net-framework-4-0-source-code.aspx 本文将向你展示如何配置Visual Studio 2010逐语句执行.NET Framework 4.0源代码。 为啥? 因为很酷。 因为能帮助调试。 你不仅能看到源代码…

linux blender骨骼绑定,在Linux系统中安装开源3D创建套件Blender的方法

Blender是免费的开源3D创建套件,它可在Linux系统中安装,可使用snap或flatpak命令安装Blender。简介Blender也称为开源3D建模软件,支持整个3D管道,建模,装配,动画,模拟,渲染&#xff…

配置源码管理工具(2)

源码管理是开发中最重要的事情之一,在vs.net里我们通常采用vss进行版本控制,在Eclipse里看帖子说用svn的比例很大,和IDE的集成性也很好。 1:服务器部署 下载地址是:http://subversion.apache.org/packages.html 下载的…

编写下载服务器。 第六部分:描述您发送的内容(内容类型等)

就HTTP而言,客户端下载的只是一堆字节。 但是,客户真的很想知道如何解释这些字节。 它是图像吗? 或者也许是ZIP文件? 本系列的最后一部分描述了如何向客户端提示她下载的内容。 设置 内容类型描述了要返回的资源的MIME类型 。 此…

ruby中的self

self,自己,在ruby中表示当前对象或默认对象。程序执行的任一时刻,有且仅有一个self。 1.谁成为self,在什么位置成为self? 要知道哪个对象是self,就必须知道当前的上下文。上下文主要有顶层上下文&#xff0…

二手宏碁上网本装linux,Acer国内20日首发“上网本” 放弃Linux使用XP

据相关媒体报道 8月20日将在国内正式推出XP系统版的8.9英寸超便携笔记本电脑Aspire One,放弃使用Linux系统,硬件配置方面,除了依然采用英特尔Atom处理器之外,推出120GB传统硬盘和SSD两个版本。其中,XP系统 120G传统硬盘…

免费WiFi,仅仅为好久没联系的你们

昨日,认识五年的朋友搬来与我一起住了,说不上来,没有激动,仅仅是突然感觉生活又多了一点生机。兴致上来,晚上立马联系了已经近四个月没有联系的好友,才知道他们的生活也因这几个月发生了翻天覆地的变化。究…

五猴分桃c语言课程设计,c语言程序设计五猴分桃问题实验报告.doc

c语言程序设计五猴分桃问题实验报告.doc 课程设计报告学院、系:吉林大学珠海学院计算机科学与技术系专业名称:软件工程课程设计科目C语言程序课程设计所在班级:10班学生学号:04121010学生姓名:赵学文指导教师&#xff…

c语言100以内奇数的和为多少,编写C#程序,计算100以内所有奇数的和。谢谢了,大神帮忙啊...

编写C#程序,计算100以内所有奇数的和。谢谢了,大神帮忙啊以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!编写C#程序,计算100以内所有奇数的和。谢谢了&am…

监控系统的多协议直播(RTSP RTMP HTTP Live Streaming)

监控系统的多协议直播(RTSP RTMP HTTP Live Streaming) 转载于:https://www.cnblogs.com/cl1024cl/p/6204791.html

阿里媒体转码公共参数_Xuggler教程:转码和媒体修改

阿里媒体转码公共参数注意:这是我们的“ Xuggler开发教程 ”系列的一部分。 在上一教程中,我对视频处理Xuggler进行了简短介绍 。 在这一部分中,我们将看到Xuggler和FFmpeg提供的一些更令人兴奋的功能,例如视频转码和媒体修改。 别…

52单片机iic读写c语言,如何52单片机的I2C读写24C08程序问题排查修改

------波形在一楼isoimg2130老师提供在单片机正常运行的程序:#include "reg52.h"#include "intrins.h"typedef unsigned char u8;sbit SCLP2^1; //I2C 时钟sbit SDAP2^2; …

qfp封装能够linux,QFP、PQFP、LQFP、TQFP封装形式及PCB详解

问题:画PCB时,会发现很多的集成电路都是QFP封装,比如很多的单片机都有这种封装。各个器件商会在自己的数据手册中说明他的器件是QFP,LQFP或TQFP,然后,有的给出封装尺寸图,有的则不给。那么&…

dede文章列表加上序号效果

dede文章列表加上序号效果 css代码部分 <style type"text/css"> <!-- .downtop { FLOAT: left; OVERFLOW: hidden; WIDTH: 218px; HEIGHT: 278px } .downtop UL.text { MARGIN: 0px 10px; WIDTH: 198px; PADDING-TOP: 5px } .downtop UL.text LI { WIDTH: 1…

HDU 2845 Beans

本来是很简单的一道题&#xff0c;却想了好长时间 由于数据量比较大&#xff0c;所以逐行读入&#xff0c;逐行处理 先处理每一行的不相邻元素和的最大值&#xff0c;记录在数组b中 最后计算不相邻行的和的最大值 二者的状态转移方程都类似&#xff1a;dp[j] max(dp[j - 1], d…

ASP.NET MVC IOC 之AutoFac攻略

一、为什么使用AutoFac&#xff1f; 之前介绍了Unity和Ninject两个IOC容器&#xff0c;但是发现园子里用AutoFac的貌似更为普遍&#xff0c;于是捯饬了两天&#xff0c;发现这个东东确实是个高大上的IOC容器~ Autofac是.NET领域最为流行的IOC框架之一&#xff0c;传说是速度最快…