版权声明:未经博主允许,不得转载

首先我们要限定一个范围,是一个项目,或是以个访问地址。。就先以一个项目为限定的范围

前述:

学过物理学的都知道相对运动和绝对运动, 虽然是相似的概念,但这里的要简单得多,首先没有运动的概念。

其实要理解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 编程中路径的更多相关文章

  1. 在 Java EE 组件中使用 Camel Routes

    摘要:你可以通过集成 Camel 和 WildFly 应用服务器(使用 WildFly-Camel 子系统)在 Java EE 组件中开始使用 Apache Camel Routes. [编者按]作者 ...

  2. Java多线程编程中Future模式的详解

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  3. Java并发编程中的相关注解

    引自:http://www.cnblogs.com/phoebus0501/archive/2011/02/21/1960077.html Java并发编程中,用到了一些专门为并发编程准备的 Anno ...

  4. Java多线程编程中Future模式的详解<转>

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  5. Java并发编程中的设计模式解析(二)一个单例的七种写法

    Java单例模式是最常见的设计模式之一,广泛应用于各种框架.中间件和应用开发中.单例模式实现起来比较简单,基本是每个Java工程师都能信手拈来的,本文将结合多线程.类的加载等知识,系统地介绍一下单例模 ...

  6. 用java网络编程中的TCP方式上传文本文件及出现的小问题

    自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...

  7. Java Web 开发中路径相关问题小结

    Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概 ...

  8. Java并发编程中的若干核心技术,向高手进阶!

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

  9. 对Java Web项目中路径的理解

    第一个:文件分隔符 坑比Window.window分隔符 用\;unix采用/.于是用File.separator来跨平台 请注意:这是文件路径.在File f = new File(“c:\\hah ...

随机推荐

  1. FZU 2150 Fire Game

    Fire Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  2. BlackBerry 9900刷机

    1.安装BlackBerry Desktop Software: 2.安装ROM,双击9900Asia_PBr7.1.0_rel2807_PL5.1.0.692_A7.1.0.1033_China_M ...

  3. 【 2013 Multi-University Training Contest 5 】

    HDU 4647 Another Graph Game 如果没有边的作用,显然轮流拿当前的最大值即可. 加上边的作用,将边权平均分给两个点,如果一个人选走一条边的两个点,就获得了边的权值:如果分别被两 ...

  4. Spring Shedule Task之注解实现 (两次启动Schedule Task 的解决方案)

    在spring 中的新引入的task 命名空间.可以部分取代 quartz 功能,配置和API更加简单,并且支持注解方式. 第一步: 在Spring的相关配置文件中(applicationContex ...

  5. 认识WCF

    WCF 一.什么是WCF? 1.Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口.它是.NET框 ...

  6. DataStructure——红黑树学习笔记

    1.前言 本文伪码和解释参考: http://blog.csdn.net/v_JULY_v/article/details/6105630 C实现的源码本文未贴出,请见: http://blog.cs ...

  7. uboot mmc烧写命令

    mmc write addr blk# cnt 这个命令的作用是将内存上的数据写入mmc中 参数: addr: 从内存读取的位置 blk: 写入到mmc中block位置,这个位置是mmc的0地址的偏移 ...

  8. RASPBERRY PI wifi配置

    Raspberry Pi 手把手教你在树莓派上安装USB无线网卡支持WIFI 树莓派虽然已经有了有线网卡,但是并未配置无线网卡,移动性不够强,好在机器配备了2个USB口,当然要分一个出来给WIFI无线 ...

  9. XPath

    XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力. XPath的需要理解的相关概念 ...

  10. Object.notifyAll()

    void java.lang.Object.notifyAll() Causes all threads which are waiting on this object's monitor (by ...