java web相对路径_java(Web)中相对路径,绝对路径问题总结
1.基本概念的理解
绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:
C:\xyz\test.txt 代表了test.txt文件的绝对路径。http://www.sun.com/index.htm也代表了一个
URL绝对路径。
相对路径:相对与某个基准目录的路径。包含Web的相对路径(HTML中的相对目录),例如:在
Servlet中,"/"代表Web应用的跟目录。和物理路径的相对表示。例如:"./" 代表当前目录,
"../"代表上级目录。这种类似的表示,也是属于相对路径。
另外关于URI,URL,URN等内容,请参考RFC相关文档标准。
RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,
(http://www.ietf.org/rfc/rfc2396.txt)
2.关于JSP/Servlet中的相对路径和绝对路径。
2.1服务器端的地址
服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的
(不同于html和javascript中的相对地址,他们是由客户端浏览器解析的)也就是说这时候
在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http://192.168.0.1/webapp/的。
其用到的地方有:
forward:servlet中的request.getRequestDispatcher(address);这个address是
在服务器端解析的,所以,你要forward到a.jsp应该这么写:
request.getRequestDispatcher(“/user/a.jsp”)这个/相对于当前的web应用webapp,
其绝对地址就是:http://192.168.0.1/webapp/user/a.jsp。
sendRedirect:在jsp中
2.22、客户端的地址
所有的html页面中的相对地址都是相对于服务器根目录(http://192.168.0.1/)的,
而不是(跟目录下的该Web应用的目录)http://192.168.0.1/webapp/的。
Html中的form表单的action属性的地址应该是相对于服务器根目录(http://192.168.0.1/)的,
所以,如果提交到a.jsp为:action="/webapp/user/a.jsp"或action=""/user/a.jsp;
提交到servlet为actiom="/webapp/handleservlet"
Javascript也是在客户端解析的,所以其相对路径和form表单一样。
因此,一般情况下,在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上
,以确保所引用的文件都属于Web应用中的目录。
另外,应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径,这样
当文件移动时,很容易出问题。
站点根目录和css路径问题(jsp是服务器端程序,地址是变化的,引用时一般用站点根目录的相对路径)我们称类似这样的相对路径/test/….为相对于站点根目录的相对路径。当在jsp中引入css时,如果其相对路径相对于当前jsp文件的,而在一个和这个jsp的路径不一样的servlet中forward这个jsp时,就会发现这个css样式根本没有起作用。这是因为在servlet中转发时css的路径就是相对于这个servlet的相对路径而非jsp的路径了。所以这时候不能在jsp中用这样的路径:或者类似href="one.css"和../../one.css的html相对路径是相对于引用这个css的文件(a.jsp)的相对路径。而在servlet中转发时就是相对于这个servlet的相对路径了,因为jsp路径和servlet路径是不一样的,所以这样的引用肯定是出错的。所以这个时候,要用站点根目录,就是相对于http://192.168.0.1/的目录,以“/”开头。因此上述错误应更正为href=”/test/one.css”类似的站点根目录的相对目录。这样在servlet转发后和jsp中都是相对于站点根目录的相对路径,就能正确使用所定义的css样式了。
3. JSP/Servlet中获得当前应用的相对路径和绝对路径
3.1 JSP中获得当前应用的相对路径和绝对路径
根目录所对应的绝对路径:request.getRequestURI()
文件的绝对路径 :application.getRealPath(request.getRequestURI());
当前web应用的绝对路径 :application.getRealPath("/");
取得请求文件的上层目录:new File(application.getRealPath(request.getRequestURI())).getParent()
3.2 Servlet中获得当前应用的相对路径和绝对路径
根目录所对应的绝对路径:request.getServletPath();
文件的绝对路径 :request.getSession().getServletContext().getRealPath
(request.getRequestURI())
当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");
(ServletContext对象获得几种方式:
javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()
)
4.java 的Class中获得相对路径,绝对路径的方法
4.1单独的Java类中获得绝对路径
根据java.io.File的Doc文挡,可知:
默认情况下new File("/")代表的目录为:System.getProperty("user.dir")。
一下程序获得执行类的当前路径
package org.cheng.file;
import java.io.File;
public class FileTest {
public static void main(String[] args) throws Exception {
System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));
System.out.println(FileTest.class.getClassLoader().getResource(""));
System.out.println(ClassLoader.getSystemResource(""));
System.out.println(FileTest.class.getResource(""));
System.out.println(FileTest.class.getResource("/")); //Class文件所在路径
System.out.println(new File("/").getAbsolutePath());
System.out.println(System.getProperty("user.dir"));
}
}
4.2服务器中的Java类获得当前路径(来自网络)
(1).Weblogic
WebApplication的系统文件根目录是你的weblogic安装所在根目录。
例如:如果你的weblogic安装在c:\bea\weblogic700.....
那么,你的文件根路径就是c:\.
所以,有两种方式能够让你访问你的服务器端的文件:
a.使用绝对路径:
比如将你的参数文件放在c:\yourconfig\yourconf.properties,
直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相对路径:
相对路径的根目录就是你的webapplication的根路径,即WEB-INF的上一级目录,将你的参数文件放
在yourwebapp\yourconfig\yourconf.properties,
这样使用:
new FileInputStream("./yourconfig/yourconf.properties");
这两种方式均可,自己选择。
(2).Tomcat
在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin
(3).Resin
不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成SERVLET
的路径为根.比如用新建文件法测试File f = new File("a.htm");
这个a.htm在resin的安装目录下
(4).如何读相对路径哪?
在Java文件中getResource或getResourceAsStream均可
例:getClass().getResourceAsStream(filePath);//filePath可以是"/filename",这里的/代表web
发布根路径下WEB-INF/classes
默认使用该方法的路径是:WEB-INF/classes。已经在Tomcat中测试。
页面跳转问题:
Forward高, Redirect低, 因为Redirect的流程是这样的, request1 sent to server, server return back to client, 然后
request2 then sent to server. 但是Forward仅在server side处理, 对client side 是透明的. 由于Redirect有两次传输, 所以效率低.
范围:
由于对request.setAttribute() 来说, 它携带的对象生存范围只在request内, 所以Redirect方式会导致request携带的对象丢失.
使用说明:
1.sendRedirect
servlet和jsp里面一样
response.sendRedirect();
2.include 这种也是上面提到的forward形式,request的值会保存
1) servlet里面
request.getRequestDispatcher("jsp2.jsp").include(request, response);
2) jsp里面
说明
页面会同时包含页面1和页面2的内容,地址栏不变。
使用request.setAttribute的内容,可以正常使用
3.forword
1) servlet里面
request.getRequestDispatcher("jsp2.jsp").forward(request, response);
2) jsp里面
说明
页面会是页面2的内容,地址栏不变
使用request.setAttribute的内容,可以正常使用
3.JSP中用相对路径引用JS,CSS文件的三种情况
第一种情况最常见的情况
一个tomcat上都跑多个工程, 用工程名来区分
因为我的的URL是 :http://localhost/工程名/home/index.jsp
多了一个工程名,所以要加
如:
写太麻烦,可以在每一个jsp文件顶部加入以下内容后,
Java代码
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
就可直接使用了
第二, 直接访问jsp文件
真实项目中, 一个tomcat上要是也跑了多个工程, 并用IP来区分
url 是这样的:http://localhost/home/index.jsp 注意这里,是直接访问JSP文件(jsp文件不在web-inf下,可以直接访问),不是servlet也不是struts。
test2.js 与index.jsp 放在同一文件夹下,下面用相对路径来引入JS文件 是OK 的:
index.jsp可以找到test2.js文件
第三种情况: servlet转发到jsp(jsp在web-inf下,必须用servlet或action访问)
在第二情况的基础上,一个tomcat上要是也跑了多个工程, 并用IP来区分。
我们访问的是servlet或是struts的action ,再转发到index.jsp
url 是:http://localhost/***.do
这里不是访问JSP文件了
下面是OK 的.
test2.js 前面一定要有/home/
实际项目中, 访问 servlet或是struts的action最多, 所以这里要使用。
java web相对路径_java(Web)中相对路径,绝对路径问题总结相关推荐
- java css路径_java web开发中CSS路径有问题吗,运行jsp文件为什么找不到css文件?...
---------------------------------------------------------------------------------------------------- ...
- java web项目测试_java web项目怎么测试?
慕仰1329654 java web项目测试用Web的测试工具,如HtmlUnit,JWebUnit等.main()方法就可以测试,在main方法中获得connection对象将他输出就可以了.如果正 ...
- java web 监听器 例子_Java web技术应用---监听器
监听器的定义 (专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生变化时,立即采取相应的行动) 定义:Servlet规范中定义的一种特殊的类,用于监听Servlet ...
- java web 许令波_Java Web——Web概述
已经很久没有更新博客了,过年忙着吃喝玩乐,就怠惰了一小下下?幸好这学期新开的课程都比较有趣--Java Web和Android.至少对于我自己来说,既充满挑战,又富有趣味. --[1.Web概述]-- ...
- java file的相对路径_JAVA File的建立及相对路径绝对路径
File f = new File("D:/test/mytest.txt");//当执行这句话后在内存的栈空间存在一个f的应用,在堆空间里存在一个mytest.txt对象.注意j ...
- java当前类路径_java获取当前类的绝对路径
另,Class类还有一个getResourceAsStream方法,记得以前有个项目要读取在同一个包内的一个xml,就用的这个. 1.如何获得当前文件路径 常用: (1).Test.class.get ...
- java 多线程bean 注入_java多线程中注入Spring对象问题
信息加密之Base64 Base64是一种最简单的简单的加密形式,经常被使用,记录一下,以便日后可以深入了解. jdk格式: //获得密钥Base64Encoder encoder = new Bas ...
- java resources 路径_Java工程读取resources中资源文件路径问题
正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径,即相对于当前类的路径.在本地工程和服务器中读取文件的方式有所不同,以下图配置文件为例. 本地读取资 ...
- java log输出到文件路径_Java - 配置log4j的日志文件路径 (附-获取当前类路径的多种方法)...
1 日志路径带来的痛点 Java 项目中少不了要和log4j等日志框架打交道, 开发环境和生产环境下日志文件的输出路径总是不一致, 设置为绝对路径的方式缺少了灵活性, 每次变更项目路径都要修改文件, ...
- Java私有方法解释_java接口中 定义 private 私有方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
最新文章
- rpm 安装 忽略依赖_解决RPM包依赖关系
- 微软企业库5.0学习笔记(四)配置企业库
- mysql导出document_Mysql导入导出
- 关于tornado中session的总结
- 面试官让你用C语言实现大数相乘,慌吗?
- android 弹窗ui,Android 弹出窗口与对话框 UI设计
- 凭什么老程序员被裁,应届生却能月薪 1.3 万?
- BGP 13条选路规则
- Linux统计进程网络,查看磁盘io、内存free、系统进程ps、网络状态netstat、Linux抓包tcpdump...
- 改用MyAnalyzer的KMeans聚类算法
- mac下HTTP与HTTPS抓包
- 选择SEO服务时要注意的问题
- 高中计算机期末工作总结,高中信息技术期末教学工作总结
- 22.11.16 IO day 8
- 你一事无成,还在那里傻乐
- CTGU实验6_2-创建还书存储过程
- WebGL默认全屏显示
- InstanceNorm1d
- 计算机网络的各层协议知识总结
- MySQL学习记录(11.9更新)
热门文章
- java中堆和栈的区别_java中堆和栈的区别
- 计算机集成技术的研究和应用,信息系统集成技术研究
- 51cto shell mysql备份数据库_shell脚本备份MYSQL数据库
- android界面编程内部类,Android精讲--界面编程1(界面编程与视图的组件)
- c语言 入字符要中文状态吗,常见的HTTP状态码深入理解
- 【算法笔记】求长度为n的序列的全排列包含的总逆序对数目(树状数组求解)
- 【CF-Round-458:D】Bash and a Tough Math Puzzle(判断是否可以通过修改区间内的一个数使区间gcd=x)
- 图像空域增强:卷积运算法
- 价值过亿的架构师面试试题大全和答案、架构大全、代码大全
- 利用Python连接MySQL将表单转化为DataFrame