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

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

前述:

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

其实要理解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. sql sever跨数据库复制数据的方法【转】

    1,用Opendatasource系统函数 详细的用法已经注释在sql代码中了.这个是在sqlserver到sqlserver之间的倒数据.2005,2008,2012应该都是适用的. --从远程服务 ...

  2. [转]搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  3. 常用的web功能测试方法

    功能测试就是对产品各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求功能,即是否满足需求.常用的测试方法如下: 1.页面连接检查:每一个连接是否都有对应的页面,并且页面之间切换正确. ...

  4. ionic单页面应用中微信分享的问题总结

    首先说一下 ionic 是单页面应用,也就是说整个项目就有一个index.html, 那么问题就就来了, 如果我们不同的页面要分享给大家的是不同的链接和图片,应该怎么去做呢? 这就是我们今天要总结的东 ...

  5. vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理

    一.前言 三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学习. 图片的上传之前都是用的插件(ajaxupload), ...

  6. page object

    http://www.51testing.com/html/76/316176-849962.html

  7. 多个radiobutton选定一个

    asp.net中怎么判断其中一个radiobutton被选中后登录的是一个窗体,另一个被选中后登录的是另一个窗体. 页面设置两按钮的GroupName为同一组值: <asp:RadioButto ...

  8. 一个简单的游戏开发框架(五.对象Object)

    前面提到我们把行为Action从对象Object中分离了出来,用各种不同的行为组合出对象的功能.大家都知道,面向对象的一个类,就是数据和操作的集合.操作(行为)被分离出来了,数据怎么办呢?操作依赖的数 ...

  9. 第三章:Git使用入门

    本文主要讲git的使用,其实网上这种教程已经很多了,但是还是要说一下,在这里先把基础的东西跟大家讲一下,然后再附上一个彩蛋,将一些别人不会提到的git技术,不要错过 哦! First: Git概念 1 ...

  10. PHP初步(上)

    一.php语法 PHP是一种嵌入式脚本语言,所以,我们需要标记出哪些是PHP代码,哪些是html代码.当html和php代码进行混编的时候,文件必须要以php结尾(否则Apache不会将这个文件交给p ...