java web 资源地址写法
前提:假设web应用test(工程名) webapps下面有一资源文件test.html
规则:在获取资源时一般使用的是相对路径,以符号/开头,而 / 代表什么取决于这个地址给谁使用。服务器使用时,/ 表示web应用;浏览器使用时,/ 表示地址,需要指出web应用
例:
1. request.getRequestDispatcher("/test.html").forward(request, response);
2. response.sendRedirect("/test/test.html");
3. getServletContext.getRealPath("/test.html");
4. getServletContext.getResourceAsStream("/test.html");
5. html 内容
<a href = "/test/test.html">clicked me
先从工程结构中截一张图出来(这张图是在其他地方复制过来的),从结构中可以看出,分别在三个地方都放了三个配置文件
1、 直接获取文件流读取文件的方式
先来读取上图中src目录下的第一个资源文件,看到的第一眼我们很容易写成这样
ServletContext sc=getServletContext();
InputStream out=sc.getResourceAsStream("/src/db.properties");
Properties props=new Properties();//读取文件类型创建对象。
其实那是错误的,因为在编译打包后,配置文件会被复制到/WEB-INF/classes目录下,也就是说src/目录对应的编译后对应的目录是/WEB-INF/classes.因此正确的写法如下
ServletContext sc=getServletContext();
InputStream in=sc.getResourceAsStream("/WEB-INF/classes/db.properties");
第二个资源文件,它放在/src目录下的包里,包名直接转化成目录,它的路径如下
ServletContext sc=getServletContext();
InputStream in=sc.getResourceAsStream("/WEB-INF/classes/cn/itcast/db.properties");
第三个资源文件直接放在web应用目录WebRoot目录下
ServletContext sc=getServletContext();
InputStream in=sc.getResourceAsStream("/db.properties");
2、获取文件路径的方式
同样地,从第一个资源文件开始,先来一个容易出错的方式
FileInputStream in = new FileInputStream("src/db.properties");
在启动服务器后,访问页面报错后,很多同学肯定会想,肯定要像上面说到的一样,正确路径是/WEB-INF/classes/db.properties。其实不是这样的,正如在文中开头提到的一样,此时用到的相对路径,最关键的问题是以哪个目录为相对?很显然,我们眼睛看到的文件地址并不是真正的位置,而真正的相对路径是启动tomcat服务的startup.bat所在的目录。不过我们可以通过另一种方式去获取它的绝对路径,如下
ServletContext sc=getServletContext();
String path=sc.getRealPath("/WEB-INF/classes/db.properties");
Properties props=new Properties();//读取文件类型创建对象。
props.load(new FileInputStream(path));
String value=props.getProperty("name1");
注意:在web应用中,不能以传统方式去获取文件路径,可以通过ServletContext的getRealPath的接口来得到
第二,第三个资源文件的文件路径方式在此就不再一一列举了,他们的路径与上面第1种方式说的完全一样。
3、类加载的方式
这种方式不同于ServletContext方式,它与动态界面servlet完全解耦
InputStream in = XXX.class.getClassLoader().getResourceAsStream("/db.properties");
//在此的路径我是随便写的一个,这里只讨论加载方式
由于类在整个程序中只加载一次,通过getResourceAsStream读取文件时,在更改配置文件后,改动的内容不能及时被重新加载。这个时候可以改成这样
String path = XXX.class.getClassLoader().getResource("/db.properties").getPath();
getResource()将路径当作URL来处理,每次改动都会被重新读取到。
总结:在web应用中读取资源文件时,必须要用到ServletContext的getRealPath,getResourceAsStream才能得到,除了这两种方法,还可以通过类加载的方式取到文件路径,再以传统的方式去读流。
java web 资源地址写法的更多相关文章
- java web 资源文件读取
前提:假设web应用test(工程名) webapps下面有一资源文件test.html 规则:在获取资源时一般使用的是相对路径,以符号/开头,而 / 代表什么取决于这个地址给谁使用.服务器使用时,/ ...
- Java中用ClassLoader载入各种资源(类、文件、web资源)的方法
lassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象. ClassLoader负责载入系 ...
- JavaWeb学习笔记——开发动态WEB资源(一)Java程序向浏览器输出数据
开发一个动态web资源,即开发一个Java程序向浏览器输出数据,需要完成以下2个步骤: 1.编写一个Java类,实现Servlet接口 开发一个动态web资源必须实现javax.servlet.Ser ...
- [原创]java WEB学习笔记55:Struts2学习之路---详解struts2 中 Action,如何访问web 资源,解耦方式(使用 ActionContext,实现 XxxAware 接口),耦合方式(通过ServletActionContext,通过实现 ServletRequestAware, ServletContextAware 等接口的方式)
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- java web项目中打开资源文件中文乱码
1 java web项目中经常使用多模块管理.在某一个模块中添加了一些资源文件.但不是启动项目.有时候需要在程序中读取资源文件内容,打包后放到容器中就不能正常运行了.需要将所有资源文件放到启动项目的 ...
- JAVA WEB开发中的资源国际化
为什么要国际化? 不同国家与地区语言,文化,生活习惯等差异.在数字,时间,语言,货币,日期,百分数等的不同. 两个名词: I18N:即资源国际化,全称为Internationalization,因为首 ...
- 【Java Web】入门资源整理
[网站] 1.Java Web Application Tutorial for Beginners - JournalDev Google top1 除Java Web还有很多其他教程 2.Intr ...
- java Web程序使用wro4j合并、压缩js、css等静态资源
在Web项目中,js.css合并压缩,不仅有利于减少Http请求数量.减少宽带资源占用,还能有效的管理各种js.css的引入,使整个项目更加有序.而对于访问用户来说,其更大的好处是增加了页面的打开速度 ...
- java web课程设计截图和服务器地址
企业办公测试截图和服务器地址 本篇博客主要围绕以下几个部分展开,登录.系统管理.工作流.个人事务管理.内部邮件.公共信息共六个部分.主要有界面截图和简要介绍. 一.登录.更改密码界面 登录界面包括以管 ...
随机推荐
- [CF442C] Artem and Array (贪心+单调栈优化)
题目链接:http://codeforces.com/problemset/problem/442/C 题目大意:一个数列,有n个元素.你可以做n-2次操作,每次操作去除一个数字,并且得到这个数字两边 ...
- 移动端自动化环境搭建-Appium for Windows的安装
安装Appium for Windows版 A.安装依赖 appium就是我们做移动端自动化测试主要的软件 B.安装过程
- JAVA的Random类[转]
在实际的项目开发过程中,经常需要产生一些随机数值,例如网站登录中的校验数字等,或者需要以一定的几率实现某种效果,例如游戏程序中的物品掉落等. 在Java API中,在java.util包中专门提供了一 ...
- Spark MLlib之协同过滤
原文:http://blog.selfup.cn/1001.html 什么是协同过滤 协同过滤(Collaborative Filtering, 简称CF),wiki上的定义是:简单来说是利用某兴趣相 ...
- MySQL_财务统计各产品品类各城市上周收入毛利表_20161202
注:财务需要统计各产品品类各城市上周毛利情况 下面这样的表是沟通后展现的形式.数据展现形式我认为的大都是行列转 列转行的转置 从财务角度这样展现形式比较适合. 由于黄色部分为汇总项目,因此我拆分成9个 ...
- Hibernate对象的状态
站在持久化的角度, Hibernate 把对象分为 4 种状态: 1. 持久化状态 2. 临时状态 3. 游离状态 4. 删除状态 Session 的特定方法能使对象从一个状态转换到另一个状态. 下面 ...
- Web前端之html_day1
1.html结构 1 2 3 4 5 6 7 8 9 10 <!DOCTYPE html> <html lang="en"> <head> ...
- eclipse颜色 字体
字体 之前也想过搜个字体,但是看了别人的推荐也没什么太大感觉.今天我自己选择了一款字体,发现看着单词中的i等瘦型的字母会比较费力,现在我知道自己想要什么样的字体了.网上推荐Inconsolata.pf ...
- HDU 5183 Negative and Positive (NP) ——(后缀和+手写hash表)
根据奇偶开两个hash表来记录后缀和.注意set会被卡,要手写hash表. 具体见代码: #include <stdio.h> #include <algorithm> #in ...
- HDU 2222 Keywords Search(AC自动机入门)
题意:给出若干个单词和一段文本,问有多少个单词出现在其中.如果两个单词是相同的,得算两个单词的贡献. 分析:直接就是AC自动机的模板了. 具体见代码: #include <stdio.h> ...