问题描述:

入门网站开发时,我们会在相对URL问题上有疑惑。例如,在一个jsp页面中引入css外部文件,
<link rel="stylesheet"
         href="my-styles.css"
         type="text/css" >
当我们直接访问时,页面正常显示,而有时候跳转到此页面,则出现css缺失的情况,这就是我想说的问题。
 
在分析问题之前,需要引入jsp中的两个知识点:跳转(forward)和重定向(redirect),如果你已了解相关知识,请直接阅读解决方案。
引入:
JSP或Servlet之间有两种相互调用方法,即跳转(forward)和重定向(redirect).
它们的实现方式分别是:
通过RequestDispatcher的forward方法实现跳转(你可以通过HttpServletRequest的getRequestDispatcher方法获得RequestDispatcher);
通过HttpServletRequest的sendRequest方法实现重定向;
区别:
  1. 重定向要求客户端(或浏览器)重新连接服务器,获取新资源(或页面),而跳转不需要;
  2. 重定向不会保存HttpServletRequest的信息,跳转保存;
  3. 重定向会使浏览器地址栏地址发生改变,而跳转保持原来的地址。
说白了,重定向是浏览器从服务器从新获取资源的过程,跳转是服务器内部页面之间相互调用的过程,与浏览器无关。
正因为此,页面中相对URL的相对起始目录会发生变化,举例来说,page_one.jsp调用page_two.jsp时,
  1. 重定向调用,页面的相对URL起始目录为page_two.jsp所在目录;
  2. 跳转调用,页面的相对URL起始目录为page_one.jsp所在目录;
 
如果页面中的相对URL如以上例子中的写法(href="my-style.css",表示css文件存在页面的起始目录中),因为页面的起始目录会发生变化,所以不管css文件放在何处,均可能出现资源不存在的情况。
 
解决方案:
这样的相对URL写法(href="my-style.css")表示css文件与
因为无法判断页面的访问方式是跳转还是重定向,所以我们应该以不变应万变,使不同的访问方式均能成功获取资源。
最简单的解决方案是:
  1. 将所有的jsp页面放在只有服务器才能访问的WEB-INF文件夹中;
  2. 使用起始目录为网站应用的相对URL,如下:
    <link rel=stylesheet
             <!-- 以斜杠"/"开始表示相对URL以网站应用为起始目录 -->
             href="/path/my-styles.css"
             type="text/css">
即可解决问题。
希望对你有所帮助!

网站开发中的相对URL问题--JSP的更多相关文章

  1. 网站开发中很实用的 HTML5 & jQuery 插件

    这篇文章挑选了15款在网站开发中很实用的 HTML5 & jQuery 插件,如果你正在寻找能优化网站,使其更具创造力和视觉冲击,那么本文正是你需要的.这些优秀的 jQuery 插件能为你的网 ...

  2. 整合Spring.net到asp.net网站开发中初探

    整合Spring.net到asp.net网站开发中初探 http://www.veryhuo.com 2009-10-21 烈火网 投递稿件 我有话说   Spring提供了一个轻量级的用于构建企业级 ...

  3. 网站开发中使用javascript获取浏览器滚动条宽度

    在网站开发中,有时候需要获取浏览器滚动条的宽度,在武汉蚂蹄软件服务中心的技术人员指导之下,我实现了该需求.记录如下: 首先说明一下原理: ①生成一个div,设置滚动条不可见,记录其宽度: ②将上面的d ...

  4. ASP.NET网站开发中的配置文件

    来源:微信公众号CodeL 1.配置文件层次分类 Machine.config:  对.netframework整体的配置 web.config(framework目录下):  对所有项目所公有的应用 ...

  5. 我在网站开发中经常用到的几个js函数01

    这是我在最近的一个网站项目中频繁用到的几个js函数,非常实用.包括:1.js获取地址栏参数:2.返回cookies字符串中指定键对应的值:3.json格式的日期转换为正常格式4.清除cookie. / ...

  6. 浅析网站开发中的 meta 标签的作用

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  7. 在网站开发中很有用的8个 jQuery 效果【附源码】

    jQuery 作为最优秀 JavaScript 库之一,改变了很多人编写 JavaScript 的方式.它简化了 HTML 文档遍历,事件处理,动画和 Ajax 交互,而且有成千上万的成熟 jQuer ...

  8. 在access中如何创建数据库。你认为数据库在网站开发中所扮演的角色是什么。使用数据库和使用文件,两者的优缺点各是什么。

    首先在access里面填写所用的信息,将数据库创建,在导入程序设计里进行完成代码. 首先打开我们的access程序,打开方法是单击开始——所有程序. 所有程序中找到microsoft office文件 ...

  9. 在网站开发中经常用到的javaScript技术

     1>屏蔽功能类 1.1 屏蔽键盘所有键<script language="javascript"><!--function document.onkeyd ...

随机推荐

  1. 纯JS焦点图特效(可一个页面多用)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. android SDK Manager更新不了,出现错误提示:"Failed to fetch URL..."!

    可以用以下办法解决: 使用SDK Manager更新时出现问题 Failed to fetch URL https://dl-ssl.google.com/android/repository/rep ...

  3. javascript 面向对象技术

    面向对象术语 对象 ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值.对象或函数”.严格来说,这意味着对象是无特定顺序的值的数组. 尽管 ECMAScript 如 ...

  4. jQuery ui 中文日历

    jQuery ui 中文日历 <link href="css/jquery-ui-1.10.4.custom.min.css" rel="stylesheet&qu ...

  5. angularJs--<ui-select>

    显示: ng-model里面的变量 如果为1,会去 ui-select-choices 里找这个idea数组,然后把数组对应name字段的值,交给 ui-select-match里面显示,$selec ...

  6. angularJs--$apply和$watch,$digest方法的意思

    这个视图对应的控制器是 这样的话,这个date变量,是不会发生改变的,没有触发脏检查,所以这时候要$apply方法,所有自定义的方法都要用$apply来触发脏检查 这样那个日期就会变化了 $diges ...

  7. maven项目转eclipse工程的命令:eclipse.bat

    call mvn clean:clean call mvn eclipse:eclipse -DdownloadSources=true @pause 复制以上内容,保存为eclipse.bat 以后 ...

  8. Delphi Idhttp Post提交 Aspx/Asp.net 时 500错误的解决办法。

    一直使用Delphi写程序,因为习惯了,用起来方便. 但是有一个问题困扰了我半年了.就是使用Idhttp Post提交时候总会有莫名其妙的错误,大部分网站没问题,但是一遇到Asp.net就报错500. ...

  9. python学习笔记14(多态、封装、继承)

    创建自已的对象(尤其是类型或者被称为类的对象)是python非常核心的概念. 多态: 可对不同类的对象使用同样的操作. 封装:对外部世界隐藏对象的工作细节. 继承:以普通的类为基础建立专门的类对象. ...

  10. JS创建类和对象

    JavaScript 创建类/对象的几种方式 在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活 ...