原文:http://blog.csdn.net/mingxunzh/article/details/4627185

在JSP中的如果使用 "相对路径"  则有可能会出现问题.

因为 网页中的 "相对路径" , 他是相对于 "URL请求的地址" 去寻找资源.

上面这句话是什么意思呢 ? 
举个例子: 
假如我们有一个项目: MyApp 
在该项目下, 有一个jsp文件夹 
该文件夹下包括: 
login.jsp    // 登陆页面 
register.jps  // 注册页面

我们在浏览器中输入地址 (注意: 地址的内容): 
http://localhost:8080/MyApp/jsp/login.jsp 
这时候, 浏览器会链接到 "登陆页面" (login.jsp) 
在login.jsp文件内包含了如下 "部分代码": 
<a href="jsp/register.jsp">注册用户 </a>

那么,如果我们点击这个链接,就会在浏览器地址栏中, 出现如下错误链接: 
http://localhost:8080/MyApp/jsp/jsp/register.jsp

看~~ 
为什么会出现"/jsp/jsp/register.jsp"呢? 
因为, 网页中的"相对链接", 是相对于你所 "请求的URL路径" 所决定的.

即:

因为这里请求路径是:http://localhost:8080/MyApp/jsp/login.jsp

那么, 浏览器 就会在这个路径下(即:http://localhost:8080/MyApp/jsp/)去找 jsp/register.jsp 
所以就会出现如下错误内容: 
http://localhost:8080/MyApp/jsp/jsp/register.jsp

上面的问题,就是调用页面和被调用页面的URL不同所造成的, 
此类错误也常常会出现在2个页面之间进行 "转发"(forward) 操作的时候。 
因为forward是在后台进行的,对客户端来说是透明的。(即: URL不改变,而数据内容却是另一个页面返回来的。。。)

那么如何解决这问题呢?

(一)方法一:直接采用绝对路径 (不推荐) 
在JSP页面端,获得本项目的绝对地址(如果你的项目叫MyApp,那么获得到的地址就是http://localhost:8080/MyApp/): 
代码如下: 
<!-- **************方法一***************** --> 
<%@ page language="Java" pageEncoding="GBK" contentType="text/html;charset=gbk" isELIgnored="false"%>
<% 
String path = request.getContextPath(); 
// 获得本项目的地址(例如: http://localhost:8080/MyApp/)赋值给basePath变量 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
// 将 "项目路径basePath" 放入pageContext中,待以后用EL表达式读出。 
pageContext.setAttribute("basePath",basePath); 
%> 
<html> 
<head> </head> 
<body> 
<a href="${pageScope.basePath}jsp/register.jsp"> 
</body> 
</html> 
<!-- *************************************-->

我们可以看到,在标签 <a>中的href属性内,我们直接采用了 
“本项目路径 ${pageScope.basePath}” 加上 "jsp/register.jsp" , 
从而构成一个绝对路径(即: http://localhost:8080/MyApp/jsp/register.jsp)

但是这样做有一个很不好的地方,那就是我们必须要在每个链接的前面都要加上 “${pageScope.basePath}” 
如果这样做的话,将是一件很可怕的事情。

(二)方法二: 利用html中的 <base>标签(推荐) 
下面是对html中的 <base>的介绍: 
base 元素可规定页面中所有链接的基准 URL 
默认情况下,页面中的链接(包括样式表、脚本和图像的地址)都是相对于当前页面的地址(即:浏览器地址栏里的请求URL)。 
我们可以使用 <base>标签中的href属性来设置,所有的“相对基准 URL”。

上面说的是什么意思呢?我们来看看代码就知道咯~~

这是JSP端的代码 
下面的代码 (十分类似上面 "方法一" 中的JSP代码) 
但是这里我们并没有采用 ${pageScope.basePath}+"相对路径地址" 的方法, 
而是采用了html文件中的 <base>标签: 
代码如下: 
<!-- *************JSP代码******************--> 
<%@ page language="java" pageEncoding="GBK" contentType="text/html;charset=gbk" isELIgnored="false"%> 
<% 
String path = request.getContextPath(); 
// 获得项目完全路径(假设你的项目叫MyApp,那么获得到的地址就是 http://localhost:8080/MyApp/): 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
<html> 
<head> 
<!-- base需要放到head中 --> 
<base href=" <%=basePath%>"> 
</head> 
// 这里我们就可以直接使用相对路径(即: 相对于base标签) 
<a href="jsp/login.jsp">Login </a> 
</html> 
<!-- *************************************-->

大概看完了上面的代码,或许您还是有些疑惑 *_*~~ 
不过当您看到了,下面的代码,可能就豁然开朗了 (*^__^*) 嘻嘻……。

当我们去执行上面的那段JSP代码后,我们可以在浏览器中可以查看,他所返回给客户端的html代码: 
执行完上述JSP后,所返回的html代码如下: 
<html> 
<head> 
<base href="http://localhost:8080/MyApp/"> 
</head> 
// 设置了 <base>后,相对路径,相对于的就是base中的路径,而不再是浏览器地址的请求路径啦~~~ 
<a href="jsp/login.jsp">Login </a> 
</html>

我们可以看到JSP返回的html代码中,包含了 <base href="http://localhost:8080/MyApp/">内容。 
也就是说,在本html文件中,遇到的所有 “相对链接(例如: <a href="jsp/login.jsp">)”,都是相对于base 
的路径(即:http://localhost:8080/MyApp/),所以我们就可以进行的使用 相对链接,而不必担心, 
转发操作(forward)或 请求地址不同不同所造成的页面无法找到的错误啦~(即: HTTP: 404)。。。

解决JSP路径问题的方法(jsp文件开头path, basePath作用)的更多相关文章

  1. (转)解决JSP路径问题的方法(jsp文件开头path, basePath作用)

    在JSP中的如果使用 "相对路径"  则有可能会出现问题. 因为 网页中的 "相对路径" , 他是相对于 "URL请求的地址" 去寻找资源. ...

  2. Hosts文件路径及修改方法

    (转自:http://www.techolics.com/softdev/20111029_100.html) 什么是Hosts文件? 根据百度百科的定义,Hosts文件是一个系统文件,这是一个本地的 ...

  3. (九)显示交易记录 &解决相对路径问题

    UserServlet.java package com.aff.bookstore.servlet; import java.io.IOException; import javax.servlet ...

  4. (转)javabean操作文件正确,但是Jsp调用javabean时文件路径出错问题解决之JavaBean访问本地文件实现路径无关实现方法

        在JSP中,页面链接是使用web路径的,但如果JavaBean要访问本地文件读取配置信息的话,是需要文件的本地路径的.如果你在写 Bean的时候直接将本地路径写进去,那网站的路径就不能变化,丧 ...

  5. 使用Maven构建Java Web项目时,关于jsp中引入js、css文件路径问题。

    今天有点闲,自己动手搭建一个Java Web项目,遇到jsp中引入js.css文件时路径不正确的问题,于是在网上查阅了很多资料,最终都无法解决问题,于是,上stackoverflow找到了解决方法,这 ...

  6. 怎样解决jsp:include标签在包括html文件时遇到的乱码问题

    在一个JSP页面中,经常须要包括还有一个文件,JSP为我们提供了jsp:include标签能够完毕这个功能,比方:<jsp:include page="some.jsp"&g ...

  7. struts/Servlet,action转到jsp后,路径问题(struts2,jsp路径,action路径,action跳转,相对路径,绝对路径)

    问题:使用struts2,如何处理action的路径?还有,在action转到的jsp中,如何写js,css,图 片的路径?(例如访问 http://localhost/project/listUse ...

  8. JSP/Serlet 使用fileupload上传文件

    需要引用的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar index.jsp <body> <center> <h ...

  9. 关于新建JSP文件后,文件开头报错的处理

    新建了一个web工程,之后建立了jsp页面,刚建立完成,文件开头就报错:The superclass "javax.servlet.http.HttpServlet" was no ...

随机推荐

  1. 带你玩转JavaWeb开发之一 - HTML快速入门

    一,html简介 1,html是什么 Html是用来描述网页的一种语言. (1)HTML 指的是超文本标记语言 (Hyper Text Markup Language) (2)HTML 不是一种编程语 ...

  2. MySQL创建数据库并赋予权限

    1.创建一个mysql用户并设置密码create user 'MySql用户名'@'localhost' identified by '密码';2.限制账户资源grant usage on *.* t ...

  3. JS之访问器

    1.在对象中定义get,set访问器属性 <script> var test = { _name:"pmx", _age:18, _born:1990, get nam ...

  4. Spring 源码从github导入源码到idea2016

    步骤 安装git或者github客户端 java环境JDK安装(必须是1.8) gradle下载安装(选择的最新版3.1) git clone github上spring源码 import导入proj ...

  5. The tag 'DataGridTextColumn' does not exist in XML namespace ....

    错误 10 The tag 'DataGridTextColumn' does not exist in XML namespace 'http://schemas.microsoft.com/win ...

  6. 修改easyui中datagrid表头和数据不能分开对齐的BUG。

    easyui的datagrid中表头和列只能同时全部向左对齐,全部向右对齐或者居中对齐. 有时候有需求,数据向左或向右,表头居中对齐. 在不修改源码的情况下.下面的代码可以实现该功能. 把下面代码放在 ...

  7. cocos2dx 3.x(TexturePacker进行图片加密)

    游戏开发过程中要涉及到大量的图片,使用TexturePacker可以把小图合成大图.这是我们使用最多的功能,但是TexturePacker还带有对图片加密的功能.之前还是对加密不慎了解,所以写下来分享 ...

  8. RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.7 版本发布

    历时数月,RDIFramework.NET V2.7 版本发布了,感谢大家的支持. RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,为企业或个人在.NET环境下快速开发系 ...

  9. EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...

  10. C 语言中的指针和内存泄漏

    引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...