jsp的相对路径问题

test2.js  与index.jsp 放在同一文件夹下,比如: web应用/home/下面.

 

要把test2.js 引入到 index.jsp中,  针对三种情况,分析如下:

 

----------------------------------------------------------

 

第一种情况 
一般在学习时, 一个tomcat上都跑多个工程, 用工程名来区分
因为我的的URL是 :http://localhost/工程名 /home/index.jsp
多了一个工程名,所以要加 <%=request.getContextPath() %>
如下:
<script src="<%=request.getContextPath() %> /home/test.js"></script>

 

---------------------------------------------------------------------------------

第二,  访问JSP文件时, 用相对路径引入JS,CSS文件是OK的

 

真实项目中,  一个tomcat上要是也跑了多个工程, 并用IP来区分
url 是这样的:  http://localhost/home/index.jsp     注意这里,是直接访问JSP文件,不是servlet,不是struts .
test2.js  与index.jsp 放在同一文件夹下
下面用相对路径来引入 JS文件 是OK 的:
<script src=test2.js></script>

 

index.jsp可以找到test2.js文件

 

 

------------------------------------------------------------------------------


第三种情况:

 

在第二情况的基础上, 我们访问的是 servlet 或是struts的action  , 再转发到 index.jsp 


url 是:  http://localhost/***.do  这里不是访问JSP文件了

 

下面是OK 的.
<script src=home/test2.js></script>

test2.js  前面一定要有home/

实际项目中, 访问 servlet或是struts的action最多, 所以这里要注意 了.

 

 

下面是错误的, index.jsp找不到test2.js文件

<script src=test2.js></script>

 本来在 "第二种情况"中, 上面是OK的, 但现在情况有点不同了,不是访问JSP文件了,访问的是 servlet或是struts的action了.

 

 

-------------------------------------------------------------------------------

 

        对上面现象的分析: (源自网络)

 

一. 我们平常 说的 "相对路径 ": 适用于"第二种情况"

 

有个html文件:a.html,其中有<link href="one.css" rel="stylesheet" type="text/css">,其中href属性表示引用的css文件的路径。 

one.css:表示one.css和a.hmtl处于同一个目录 

user/one.css:表示one.css处于a.html所在目录的子目录user中。 

../one.css:表示one.css位于a.hmtl上一级目录下, 

http://www.cnblogs.com/one.css:表示one.css位于a.hmtl上一级目录的上一级目录下, 

./:表示和a.hmtl同一目录 

我们称上述相对路径为html相对路径

 

 

 

 

二. 服务器端的相对路径  ,  适用 于"第三种情况"

 

服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的(不同于html和javascript中的相对地址,他们是由客户端 浏览器解析的)也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http://192.168.0.1 /webapp/的。

 

 

 假设Web应用road中,应用的根路径下有一个dir1文件夹和dir2文件夹。c.jsp在dir1中,a.jsp和b.jsp在dir2中。Web应用的结构如图所示。 

       + root 
           -dir1 
               c.jsp 
           -dir2 
               a.jsp 
               b.jsp 

    1. JSP页面中正确的路径表示 假设在a.jsp页面中有两个链接,分别链接到b.jsp和c.jsp页面。 

 

  • 直接写路径表示和页面在同一个文件夹下面,如<a href="b.jsp">b.jsp</a>
  • "../"表示当前文件夹的上一级文件夹(相对路径),如:      <a href="../dir2/b.jsp">b.jsp</a>, 

 

  •      <a href="../dir1/c.jsp">c.jsp</a>
  • "/"表示 http://机器IP:8080(绝对路径),如:      <a href="/road/dir2/b.jsp">b.jsp</a> 

 

  •      <a href="/road/dir1/c.jsp">c.jsp</a> 



    1. Servlet中正确的路径表示
  • 转发请求时:"/"表示“http://服务器IP:8080/Web应用名”,例如:     String forward = "/dir1/c.jsp"; 

 

  •     RequestDispatcher rd = request.getQRequestDispatcher(forward);
  • 重定向时:“/”  表示“http://机器IP:8080”,而通过request.getContextPath()得到的是:“http://机器IP:8080/Web应用名”,例如:      String str =  request.getContextPath(); 

 

  •      response.sendRedirect(str + "/dir1/c.jsp"); 

 

    1. 配置文件web.xml中    url-mapping中,"/"表示“http://IP地址:8080/Web应用名” 




××总结×× 

    • 在浏览器端:“/”表示的是一台WEB服务器,“http://机器IP:8080”
    • 在服务器端(请求转发):“/”表示的是一个WEB服务器端的应用,“http://机器IP:8080/Web应用”
    • 在服务器端(重定向):“/”表示的是一个WEB服务器,“http://机器IP:8080”
    • 要在/jsp/index.jsp文件使用图片,如何计算相对路径? 经过Servlet,struts转发后又如何计算相对路径?    

           

      目录结构:

       

         

       

      ------------------------------------------------------------------------------

       

      第一种情况 :直接访问JSP文件

      URL是 http://localhost/Context path/jsp/index.jsp

       

      要在index.jsp引用go.gif文件:

      1、使用决对路径

      <img src='<%=request.getContextPath() %>/images/go.gif'/>

      浏览器寻找方式: 域名+/Context path/images/go.gif   ,可找到。

       

        

      2、使用相对路径

      <img src='../images/go.gif'/>

      浏览器寻找方式:通过地址栏分析,index.jsp所在目录(jsp)的上一层目录(WebRoot)下的images/go.gif文件 。

       

       

      3、使用base href

      写<%=request.getContextPath() %>太麻烦,可以在每一个jsp文件顶部加入以下代码

      <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <base href="<%=basePath%>">

       

       

       <img src='images/go.gif'/>

      浏览器寻找方式: basePath的值http://localhost/Context path/再加上images/go.gif,可找到。

       

       

      ------------------------------------------------------------------------------


      第二种情况: servlet转发到jsp

       

      1、使用相对路径 

      URL是http://localhost/Context path/servlet_2   (转发到/jsp/index.jsp)

       

      错误:

      根据/jsp/index.jsp路径计算,得到 <img src='../images/go.gif'/>

       

       

      正确:

      <img src='images/go.gif'/>

       

      原因:

      index.jsp是保存在服务器端的/jsp/index.jsp目录下面,但通过转发后浏览器并不知道/jsp/目录的存在,因为地址栏中没有体现出来。所以服务器端/jsp/目录并不会对相对路径产生影响

      浏览器寻找方式:通过地址栏分析http://localhost/Context path/servlet_2 ,相对于servlet_2所在目录(/)下面找到images/go.gif文件

       

       

      2、使用相对路径

      URL是http://localhost/Context path/servlet/ser/ser/servlet_1 (转发到/jsp/index.jsp)

       

      “/servlet/ser/ser/servlet_1 是在web.xml文件配置的

       

      错误:

      根据/jsp/index.jsp路径计算,得到 <img src='../images/go.gif'/>

       

      正确: 

      <img src='../../../images/go.gif'/>

       

      原因:

      index.jsp是保存在服务器端的/jsp/index.jsp目录下面,但通过转发后浏览器并不知道/jsp/目录的存在,因为地址栏中没有体现出来。所以服务器端/jsp/目录并不会对相对路径产生影响

      浏览器寻找方式:通过地址栏分析http://localhost/Context path/servlet/ser/ser/servlet_1,相对于servlet_1所在目录(ser)的上一层目录的上一层目录的上一层目录(/)下的images/go.gif文件

       

       

       

       

      3、使用决对路径

      <img src='<%=request.getContextPath() %>/images/go.gif'/>

       

       

      ------------------------------------------------------------------------------

       

      总结:相对路径是由浏览器通过地址栏分析出来的,与服务器端文件的存放路径没有关系,由其是使用Servlet,struts转发到某jsp文件后,某jsp在服务器端存放的位置是/a/b/c/d/f/g.jsp , 但经过Servlet,struts转发后,浏览器的地址栏可不一定是/a/b/c/d/f/这样的层次。所以相对路径的计算以浏览器地址栏为准。原创地址:http://elf8848.iteye.com/

       

       

       

      struts2中可以使用命名空间,来保证浏览器地址栏中的目录层次与服务器端目录层次的一致性,这样程序员通过服务器端的目录层次计算相对路径,在浏览器中也是正常的。

转载于:https://www.cnblogs.com/aijindi/p/4671004.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值