>>分享Java Web开发技术,并且对孙卫琴的《Tomcat与Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 24053 个阅读者 刷新本主题
 * 贴子主题:  理解JavaWeb应用中的绝对URI和相对URI 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2017-06-29 20:48:17     消息  查看  搜索  好友  邮件  复制  引用

这是一个经常被忽视的问题,请大家多提相关的经验。

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

http://www.javathinker.net/java/book.htm

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

<img src="/java/book.htm">

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

<img src="../java/book.htm">

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

http://www.javathinker.net/main/java/book.htm

  相对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://www.javathinker.net/main/java/book.htm 由容器解释为请求环境路径为/main 的环境中的名称为/java/book.htm的这个HTML页面。
   因为在安装应用程序时可以为应用程序分配任意的环境路径,所以在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了。

  



程序猿的技术大观园:www.javathinker.net

网站系统异常


系统异常信息
Request URL: http://www.javathinker.net/WEB-INF/lybbs/jsp/topic.jsp?postID=223

java.lang.NullPointerException

如果你不知道错误发生的原因,请把上面完整的信息提交给本站管理人员