Java EE 编程中路径
版权声明:未经博主允许,不得转载
首先我们要限定一个范围,是一个项目,或是以个访问地址。。就先以一个项目为限定的范围
前述:
学过物理学的都知道相对运动和绝对运动, 虽然是相似的概念,但这里的要简单得多,首先没有运动的概念。
其实要理解java EE编程中的相对路径和绝对路径还是挺容易的(虽然有点大言不惭,但遇到的问题都理清了,未遇到的问题,遇到了在解决!)
首先很好的了解相关的概念是必须的。
其次还需要解决两件事情:一、确定访问者(这一点在相对路径中极其重要), 二、建立清晰的 目录树结构
概念:
相对路径: 顾名思义,相对而言,必有参考。但是参考归参考,在相对路径中没有绝对的概念,如果分不清,你晕是必然的。
请记住几个关键点:当前界面——可以是你正在编辑的界面,或者访问者所在的文件(例如,request 请求了你的userServlet之后并没有路径的跳转,则request的所在路径即是你的userServlet在web.xml中配置的路径)——当前界面可以是你任意选定的, 我们把它记为A。
父级:当前界面的上一级。
子级:当前界面的下一级
兄弟级:与当前界面同一级,路径位置相同,文件名不同。
目标资源:从当前界面出发要去的地方。比如,在界面A中引入了B文件,A是当前界面,B就是目标资源。
然后不管你要找你的项目中的哪一个文件,只要他存在,你都可以通过相对路径的方式访问到。当然项目文件夹是访问不到的,否则就违反了我们的约定!
最后送你一句最关键的话:相对路径的寻址是从当前界面为起点的;
绝对路径
绝对路径中也有相对的含义,那就是根路径的选定,只要根路径一旦被选定,那么根路径下的任何文件只要他存在,都可以通过绝对路径的寻址方式访问到。
绝对路径中没有当前界面的概念,只有一个概念:根。
绝对路径的寻址是从根开始的;
虚拟路径:我们知道,有时 浏览器的地址栏中显示的访问文件是php, 而在后台,可能是jsp文件,或者servlet。这是tomcat的路径管理,如果tomcat将你的资源所在的工作目录提供到地址栏中是不是有点。。。。。通过配置文件管理的访问路径,即是虚拟路径。
实际路径:这个就不用说了。
浏览器行为:一般浏览器端发起请求,加载资源,工作开始在浏览器端的。比如,a标签的超链接, servlet 中的重定向就是。
服务器行为:一般直接在服务器端进行页面跳转的行为。 servlet中的请求转发就是。
了解这些概念之后,就让我们来一举解决此问题!!!
绝对路径的访问很简单,只要确定是浏览器行为还是服务器行为,然后以 '/' 开始寻址就可以;一般,浏览器行为,'/'表示端口号为根路径,后面要跟项目名; 服务器行为,'/' 表示项目根路径:
//web路径为:http://ip:port/project_name/file <!-- 浏览器行为:-->
<a href="/project_name/file">我是jsp中的a标签</a> //服务器行为
request.getRequestDispather("/file");
这两种寻址方式访问到的是同一个文件。
而相对寻址就略微复杂一点:
首先要说明
相对寻址,指的是为了让服务器 访问到你的目标资源,你在当前界面对目标资源的位置的一种描述。
当前访问者的所在路径,这个路径却是要用绝对路径来描述。比如 当 访问者 request 从后台的一个servlet文件中跳转到jsp文件中,request本身就携带有这个servlet的绝对路径-----这个路径描述或许是你告诉它的(比如 用绝对路径重定向),或者是tomcat解析后的(比如你用的是相对寻址),如果这时 你的jsp文件中还有资源加载,那么你对地址就要很精确的管理。否则,有些资源可能一会儿能加载到,一会儿又加载不到。这就是你每次访问同一个界面的时候request本身携带的地址不同。
example:
你在web.xml中为name_one_Serlvet.java 配置路径:
<url-pattern>/middle/controll/name</url-pattern>
当请求到达这个servlet中的时候,request(还有response)中携带的地址就会变成:"http://IP:8080/project_name/middle/controll/name",这个位置定位的文件就是你的当前界面。
如果在该servlet中有相对寻址(不以‘/’ 为开始的地址)的请求转发或重定向,那么tomcat就会以上面这个地址为基础进行解析新的地址。假设你用以下正确的方式跳转到了nema.jsp文件。request将会向上寻一级到达controll所在的目录然后进入ui,找到nema.jsp文件。
request.getRequestDispatcher("../ui/nema.jsp").forwared(request,response);
<url-pattern>/middle/ui/nema.jsp</url-pattern>
现在request和response所在的路径就会是"http://IP:8080/project_name/middle/ui/nema.jsp";
如果你在编辑jsp文件的时候还引入了资源:
<script type="text/javascript" src="jsfile.js">
这个地址说明,jsfile与nema.jsp文件在同级目录中,所以当你直接在浏览器的地址栏中访问该文件,不会有404错误,但是通过上面的方式跳转过来时,你的资源文件基本上是找不到的。因为,request的地址值改变是从一个servlet进入另一个servlet之后,而tomcat也不会智能到像你告诉浏览器你的文件的具体位置那样告诉jsp引擎你的文件的实际路径(实际路径不是真实路径,而是tomcat解析后产生的能访问到你的文件的路径),它会携带着它原有的路径来解析你的jsp以及jsp中引入的资源,而不是拿到你新给的地址(请求转发)后再解析其中的资源文件,只要是相对寻址方式,都会被它重新解析,然后将解析的结果写入转移后的servlet。这时的路径值才是浏览器和服务器工作是访问你的资源的路径。
说的可能有点绕,不过请记住两点:
1. request的url或uri 的改变是访问到servlet之后,jsp实质是servlet,但还不是,要经过jsp引擎解析之后才是servlet
2. request会携带着它原有的uri值去你指定的地方解析jsp;
所以,当发生404错误的时候,要么你就干脆全部采用绝对寻址,要么就检查一下request的原有uri与当前你所编辑的界面和你的资源文件的之间的关系。
有一个很好又很彻底的解决方法——引入 base 标签:即 在每一个jsp文件的 <%@ %> 命令后加入代码如下:
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"+request.getServerName() + ":" + request.getServerPort()+path + "/";
%>
然后在<head> 标签中一开始就加入 <base> 标签:
<base href="<%=basePath%>">
从代码可知,href 超链接始终指向的是当前 jsp 文件,这样当请求跳转到该页面时便会被 base 标签强行重新解析当前路径。这样,请求对页面中引入的资源都是以该路径为基础进行解析访问的,而不再是跳转前的(来自的)页面。这样,不管你是相对路径还是绝对路径,只要配置的正确就不会再有资源丢失了!
完!
如文中有不对的地方,请大家多给批评!
Java EE 编程中路径的更多相关文章
- 在 Java EE 组件中使用 Camel Routes
摘要:你可以通过集成 Camel 和 WildFly 应用服务器(使用 WildFly-Camel 子系统)在 Java EE 组件中开始使用 Apache Camel Routes. [编者按]作者 ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java并发编程中的相关注解
引自:http://www.cnblogs.com/phoebus0501/archive/2011/02/21/1960077.html Java并发编程中,用到了一些专门为并发编程准备的 Anno ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java并发编程中的设计模式解析(二)一个单例的七种写法
Java单例模式是最常见的设计模式之一,广泛应用于各种框架.中间件和应用开发中.单例模式实现起来比较简单,基本是每个Java工程师都能信手拈来的,本文将结合多线程.类的加载等知识,系统地介绍一下单例模 ...
- 用java网络编程中的TCP方式上传文本文件及出现的小问题
自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...
- Java Web 开发中路径相关问题小结
Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概 ...
- Java并发编程中的若干核心技术,向高手进阶!
来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...
- 对Java Web项目中路径的理解
第一个:文件分隔符 坑比Window.window分隔符 用\;unix采用/.于是用File.separator来跨平台 请注意:这是文件路径.在File f = new File(“c:\\hah ...
随机推荐
- js调用.net后台事件、后台调用前台以及js调用服务器控件
1. javaScript函数中执行C#代码中的函数: 方法一:间接触发后台代码 1.首先建立一个服务端控件按钮命名为btn1,双击进入后台将调用或处理的内容写入btn1_click中; 2.在前台写 ...
- 关于C++构造函数初始化顺序
这里主要是说序列初始化成员变量时,存在这样的规则: 1. 先进行序列初始化,再进行构造函数函数体内的赋值等操作. 2. 序列初始化,不是简单的自左至右或自右至左,而是根据成员变量的定义顺序来初始化. ...
- JavaScript拼图游戏
今天是2016年最后一天上班了.最近几天都比较休闲,有时间空闲下来写写文档之类的. 2016过得真是快.感觉没做什么就过去了.想到之前想坚持每个月写一写博客都没坚持到.希望2017年可以吧. 无聊之余 ...
- CSS表达式
一直以来我们被教育说CSS Expression是个坏东西,很影响性能,应该禁止使用,但是如果仔细想想CSS表达式影响性能的原因,规避掉影响性能的写法,CSS表达式还是能给我们带来一些惊喜的.CSS表 ...
- redis清空缓存
进入redis命令行 首先启动redis服务 redis-server /home/redis/redis_7901.conf redis-cli -p 7901(指定进入端口号为7901的redis ...
- 杭电ACM1003
原题: Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- C++与Java的语法区别
C++与Java的语法区别 首先,两个大的不同是主函数和怎样编译的不同,接下来是许多小的区别. main 函数C++//自由浮动的函数int main( int argc, char* argv[]) ...
- LR一个简单的流程
1.录制脚本 2.回放脚本 :回放前的运行时设置:run_time_seting F4 关联设置(动态值) 日志分析 3.脚本的增强: 添加事物(计时) 参数化(模拟真实的用户行为) 内容检查.回 ...
- 开发板远程操作SQL SERVER解决方案
环境: 开发板:freescale 2.6 armv71,系统只读,唯一可以读写的路径是/tmp/sd(这是一个sd卡).程序放在/tmp/sd/transfer下(下文以运行路径代替),sql语句以 ...
- Bpmx实施经验
Bpmx是一个较大的平台,直接发布的话会有内存问题,经查阅一些资料,java1.5没有解决好之前版本的历史问题,所以在垃圾处理gc上有很多配置需要手动完成,之后的版本同上. Bpmx平台自带的文档中部 ...