Topic: 原创:URI是如何解释的 (翻译Oreilly.Java.Server.Pages.3rd.Edition的17.8小节)

  Print this page

1.原创:URI是如何解释的 (翻译Oreilly.Java.Server.Pages.3rd.Edition的17.8小节) Copy to clipboard
Posted by: chengbd
Posted on: 2005-04-06 00:48

这是一个经常被忽视的问题,我想值得翻译一下Oreilly.Java.Server.Pages.3rd.Edition的17.8小节的内容,非常的精彩与重要,请大家多提相关的经验。

  在基于JSP的应用程序中经常会混淆HTML和JSP元素中使用的不同种类的URI。这种混淆源于在HTTP,servlet和JSP规范中用来描述URI的一些相互冲突的术语,以及一些种类的URI会在HTML和sevlet范畴中会有不同的解释。
  在HTML中,URI用于元素的属性值,如<a><img><form>。使用URI属性值的JSP元素有pageincluedtaglib指令符和<jsp:forward><jsp:include>操作符。JSTL和自定制的操作符也可以定义使用URI值的属性。
HTTP/1.1规范将URI定义为一个遵循一定规则的字符串,以唯一的标明某种资源。URL只是一种特殊的URI,它包括了一个位置描述(如HTTP URL中的服务器名)。绝对URI是这样一种URL,它以一个模式(schema)名开始,后面接一个冒号,其余部分是资源描述符。一个用于描述通过HTTP协议访问的资源的绝对URI的例子是:

http://localhost:8080/ora/ch12/login.jsp

这里,http是模式(schema),localhost:8080是位置(location)(一个服务器名和一个商品号), /ora/ch12/login.jsp 是路径(path)。
  HTML元素中的URI是由浏览器解释的。 浏览器需要绝对URI来决定如何发送对HTML元素引用的资源的请求。 它使用模式来选择正确的协议,使用位置来决定将请求发送到哪里。路径作为请求的一部分被发送到服务器,这样服务器可以知道哪些资源受到请求。但是,当你在HTML文档中写URI时,如form元素的 action 或image元素的 src,如果这些资源位于和页面同样的服务器上,你不必说明这些资源的绝对URI。你可以只使用URI路径:

<img src="/images/hello.gif">

  这种类型的URI被称为绝对路径(absolute path),也就是说它包含了服务器中相关资源的完整路径;和绝对URI相比,唯一的不同之处是没有说明模式名和位置。浏览器会将一个绝对路径URI解释为对生成响应的相同服务器上的资源的引用,所以它会自动加上模式和位置名来生成请求。这样浏览器使用绝对URI来生成对引用资源的请求。
  另一种URI是相对路径(relative path),因为它被解释为相对于当前页面的路径。相对路径不以斜杠(\)开始:

<form action="authenticate.jsp">
<img src="../images/hello.gif">

  这里 action 属性引用的JSP文件位于和包含这个引用的页面的路径结构中相同的级别。src 属性使用 ../ 符号记法来引用路径结构中上一级的资源。浏览器将相对路径URI解释为相对于生成这个页面的请求的路径。如果使用这个例子中的两个相对路径的页面是由http://localhost:8080/ora/ch13/login.jsp 请求生成的,浏览器将它们解释为下面的绝对URIs:

http://localhost:8080/ora/ch13/authenticate.jsp
http://localhost:8080/ora/images/hello.gif

  相对URI提供了很多灵活性。如果一个应用程序中web资源间的引用都是相对的,你就可以将这个应用程序移动到路径结构地方,而不用修改任何URIs。例如,你将页面从 /ora/ch13 移动到 /billboard,这些相对路径仍然引用相同的资源。
  目前为止,一切正常。现在我们研究一下当一个Java web 容器收到一个请求时会发生什么。对一个servlet或JSP页面请求的URI的第一部分有其特殊的含意。它被称为环境路径(context path),例如这本书的所有例子使用 /ora 作为环境路径。正如第二章描述的,一个 servlet 容器可以通过相应的servlet context 来包含多个web应用程序。当安装应用程序时,每个web应用程序和一个唯一的context 路径相关联。当web容器收到一个请求时,它使用环境路径来选择负责处理这个请求的servlet环境。容器会将请求传递给所选择的context,这个servlet context再将URI减去 context路径来定位请求的资源(一个servlet或一个JSP页面)。例如,绝对URI http://localhost:8080/ora/ch13/login.jsp 由容器解释为请求环境路径为/ora 的环境中的名称为/ch13/login.jsp的这个JSP页面。
   因为在安装应用程序时可以为应用程序分配任意的环境路径,所以在JSP元素(以及servlet方法)中一定不能用环境路径来引用相同应用程序中的其它部分。你可以总是使用一个相对路径URI,就像在HTML元素中那样,例如,在一个<jsp:inclued>操作中引用另一个页面:

<jsp:include page="navigation.jsp" />

  这种URI在JSP规范中被称为相对页面的路径(page-relative path)。容器会将其解释为相对于它所使用的页面。换句话说,它与HTTP规范中的相对路径完全一样。
  有时需要可以方便地引用应用程序内部的一个资源,而不是被解释为相对于包含引用的页面。这样的一个例子是引用一个自定制的错误页,这个页面可以被应用程序中的所有页面使用,独立于它们位于的路径结构:

<%@ page errorPage="/errorMsg.jsp" %>

  当JSP元素属性中的URI以一个斜杠(/)开始时,容器将其解释为相对于应用程序的环境路径。JSP规范称这种类型的URI为相对于环境的路径(context-relative path)。这种URI可以用于所有在应用程序路径结构中有固定URI的常见的应用程序资源,如错误页面和图片文件。

  总之,HTML元素中的URI可以是:
   一个绝对URI(一个模式和服务器名称,以及资源路径);
  一个绝对路径URI(以斜杠开始的路径),被解释为到位于发送包含这个URI响应的服务器上的资源的绝对路径;
  一个相对路径URI(不以斜杠开始的路径),被解释为相对于请求包含它的资源所使用的绝对路径。

  一个JSP元素(或者servlet方法中)中的URI可以是:
  一个相对于环境的路径(以斜杠开始的路径),被解释为相对于应用程序的context环境路径;
  一个相对于页面的路径(不以斜杠开始的路径),被解释为相对于它所使用的页面的路径。
  
  只要你记住在HTML元素中使用的URIs是被浏览器解释的,在JSP元素中使用的URIs是被web容器解释的,就不难判断在特定情况下应该使用哪种URI了。

  

2.Re:URI是如何解释的 (翻译Oreilly.Java.Server.Pages.3rd.Edition的17.8小节) [Re: chengbd] Copy to clipboard
Posted by: chengbd
Posted on: 2005-04-06 03:08

总之,就是要区分在HTML和JSP元素,以及web.xml这些配置文件中,以"/"开始的URI的区别。

如果想在HTML中使用"/",也就是引用绝对路径,但为了程序的可移动性,又最好别把web app的context路径写出来,我记得可以使用下面的方法,
<form action="<c:url value="/ch19/authenticate.do" />

<c:url />可以完成由JSP中相对于context路径到HTML中的绝对路径的转换。
请大家看看还有什么好办法。

3.Re:原创:URI是如何解释的 (翻译Oreilly.Java.Server.Pages.3rd.Edition的17.8小节) [Re: chengbd] Copy to clipboard
Posted by: jigsaw
Posted on: 2005-04-07 10:49

就是c:url了
request.getContextPath() + "/ora" 也是一样的
看自己习惯了

4.Re:原创:URI是如何解释的 (翻译Oreilly.Java.Server.Pages.3rd.Edition的17.8小节) [Re: chengbd] Copy to clipboard
Posted by: xinlan
Posted on: 2005-05-21 20:12

哈哈 ,我正看到那里
这本书电子版有英文的,推荐去看看

5.Re:原创:URI是如何解释的 (翻译Oreilly.Java.Server.Pages.3rd.Edition的17.8小节) [Re: chengbd] Copy to clipboard
Posted by: javadd
Posted on: 2005-06-30 00:02

谢谢,我正在修改服务器上url bug呢,谢谢.

6.Re:原创:URI是如何解释的 (翻译Oreilly.Java.Server.Pages.3rd.Edition的17.8小节) [Re: chengbd] Copy to clipboard
Posted by: fantasyE
Posted on: 2005-07-27 12:37

非常非常不错~~
谢谢

7.Re:原创:URI是如何解释的 (翻译Oreilly.Java.Server.Pages.3rd.Edition的17.8小节) [Re: chengbd] Copy to clipboard
Posted by: sothis
Posted on: 2005-07-31 15:21

一般情况下好区分

想问一下:
WebApp中的html网页中的URI呢?假若一个html网页被放进了WAR文件之中,那么其中书写的/路径又指的是什么呢?
JSP若用/路径引用WebApp中的图片呢?

8.Re:原创:URI是如何解释的 (翻译Oreilly.Java.Server.Pages.3rd.Edition的17.8小节) [Re: chengbd] Copy to clipboard
Posted by: sothis
Posted on: 2005-07-31 15:35

还有一个JSP1 include 子目录中的JSP2, 偏偏JSP2用../xxx引用了第三个目录中的图片,那么..路径是基于JSP1还是JSP2呢?
给大家出点难题,呵呵

9.Re:原创:URI是如何解释的 (翻译Oreilly.Java.Server.Pages.3rd.Edition的17.8小节) [Re: chengbd] Copy to clipboard
Posted by: inyoung
Posted on: 2005-09-08 21:17

我认为SERVLET-MAPPING给初学者对路径的理解造成了级大的混乱!


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923