Java EE 编程中路径

时间:2023-03-08 22:39:49
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 标签强行重新解析当前路径。这样,请求对页面中引入的资源都是以该路径为基础进行解析访问的,而不再是跳转前的(来自的)页面。这样,不管你是相对路径还是绝对路径,只要配置的正确就不会再有资源丢失了!

完!

如文中有不对的地方,请大家多给批评!