主题

  超链接不就是一个地址字符串吗?这能有什么花头? LZSB! 曾经我也是这么想的....

  最近对apache的学习让我对网页中超链接,CSS,js的路径的写法有了一些新的认识.

  所以这篇文章主要分享一下我的一些想法与发现..

相对路径

  最早以前我用的就是相对路径,刚开始感觉用起来很爽...很简单...比如当前路径是localhost:8080/projectName/a.jsp 我想超链接到localhost:8080/projectName/b.jsp 我只需要写<a href="b.jsp">b.jsp</a>就可以了..但是很快我发现了一个问题...如果一个视图有多个映射地址..比如localhost:8080/projectName/a.jsp 和 localhost:8080/projectName/path1/path2 映射到的是同一个jsp...那里面的超链接是肯定会有问题的.

  因为路径层次都变了...这种情况是可能会发生的,因为会有服务器跳转的存在,所以一个view可能会对应N个URL..而每个URL不同,根据相对路径去找资源,拼接得到资源的URL是肯定不同的..所以这个方法并不好,除非保证一个view只对应一个URL.

  

绝对路径

  因为相对路径不太好,所以我开始使用绝对路径...使用绝对路径可以避免上述相对路径遇到的问题..

  我一般是这么使用的...

1.先写一个每个页面head里都会导入的jsp.在这个jsp里面:

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

2.在每个jsp中要引用其他URL的资源的时候直接<link href="resources/css/index2.css" rel="stylesheet" />

解释和小结:

使用<base>这个标签以后浏览器会把所有相对路径资源前面拼接base标签里面的href值得到完整的URL路径.不写这个标签直接使用相对路径的时候相当于base的href就是当前URL的上一级.

像我这样写以后index2.css的完整URL就是 IP:端口/上下文/resources/css/index2.css

上下文就是项目部署的上下文环境的值,可以在tomcat的server.xml里面context节点里的path里去设置..

开发的时候eclipse部署到tomcat默认上下文环境的值是项目名称.所以项目首页是localhost:8080/项目名称

而项目上线以后直接映射到域名,比如www.test.com那这个上下文环境的值是/

虽然上下文环境变了.但是通过<%=basePath%>可以过滤掉这个细节,保证资源的URL是从IP写起的,一定找得到这个资源..

改进版的相对路径

  绝对路径的方法我一直用了好久,觉得还是蛮好用的,无论环境怎么变,链接URL都不用变..直到我学习了apache的反向代理...

  使用绝对路径的问题在于如果使用了反向代理,比如把www.a.com ProxyPass到了内网IP192.168.X.X...因为apache只是一个空壳,项目并没有部署在apache上.真正的项目部署在192.168.X.X那台tomcat上,所以项目里的jsp里的basePath计算出来的href是192.168.X.X:端口/上下文,而不是www.a.com

  这个时候如果你点了www.a.com对应的jsp上面的超链接的话,会跳转到192.168.X.X:端口/上下文/超链接相对路径...就是说浏览器地址栏从www.a.com变成了192.168.X.X/....

  这样的话相当于apache的反向代理是没法发挥作用的,因为你的资源写的是绝对路径...apache并不知道这个地址是需要代理的...它也没有办法去管理,因为它不会去搜索你返回的html并把连接一个一个替换掉..

  这个时候仍然需要使用相对路径,但是我们可以从根地址写起...

具体做法:

1.删掉<base>标签

2.每个链接从根目录写起,用jstl的c标签,比如<c:url value="/js/jquery.js"/>

解释和小结:

c:url标签会自动计算出上下文环境...所以<c:url value="/js/jquery.js"/>得到的值是/上下文环境/js/jquery.js

这样的话即使上下文环境变了,也能得到正确的值.因为得到的值是从根目录写起的/开头的.所以浏览器会把这个值拼接在IP:端口后面,所以浏览器最终计算得到的jquery.js的值是IP:端口/上下文环境/js/jquery.js

这个值和上述使用绝对路径得到的值是一样的,只是使用绝对路径需要从IP写起,最终路径不需要浏览器计算,直接就能得到,不依赖于当前浏览器地址栏的地址..这里这种相对路径是从/上下文环境 写起(上下文环境由c:url计算得出),最终路径需要浏览器拼接IP和端口计算得到,所以依赖于当前浏览器地址栏的地址.

所以在反向代理的时候拼接的IP和端口是apache服务器上的地址和端口,然后又会被apache正确ProxyPass到内网tomcat上..

当然,使用base标签也是可以的,<base href="<c:url value="/" /> ">这样就不需要在每个URL前面都使用c:url标签了...

总结

就目前我的经验来看可能使用c:url标签 写资源路径是最佳的方法了...既可以屏蔽上下文变动带来的URL路径变化的影响,又可以正确使用反向代理,得到正确的代理路径...

不过c:url只能在jsp中使用,不知道纯html页面怎么办...

说不定以后会有其他理解....

jsp中超链接路径的写法的更多相关文章

  1. 关于在jsp中的路径问题

    前言: jsp作为javaweb开发中常见的视图技术,我们平时在开发项目使用的过程中,经常会导入一些静态资源,比如css\js\jpg.png等图片格式的文件,这些文件的路径成了问题,经常会出现索引不 ...

  2. JavaWeb中Servlet和Jsp跳转路径的写法

    最近学习时,常常要写一些页面之间的跳转或者前台和后端之间的跳转 下面总结一下自己对于这些跳转路径的写法 声明:以下讲到的jsp文件都默认在WebRoot目录下 1.表单(Jsp)->Servle ...

  3. 关于jsp中超链接的相对路径

    前提:新建了一个名为MyProject的web工程.在WebContent目录下新建一个jsp目录,在jsp目录中新建一个index.jsp文件. 实验:在index.jsp里写了4个链接,如下: & ...

  4. jsp中的路径与跳转

    在jsp(serlvet)中,页面的"变换"有两种方式,第一重定向,第二转发: 先说重定向,它的调用方式是这样的 response.sendredirect("uri&q ...

  5. jsp中的路径问题

    在学jsp的时候我每次都遇到路径的问题,每次都不能够说100%的把这搞定,这让我很烦恼,今天下午花了点时间来把路径问题整理了下. 一:首先我们在加载项目(我的项目名称是FinalExam)是的路径是h ...

  6. Struts2学习-jsp中超链接传参问题

    今天在学习过程中对struts2中超链接的传参问题产生了一些疑惑,不明白jsp中的超链接如何将参数传到Action方法中去的. <s:iterator value="categorys ...

  7. JSP中的路径

    我的原则 所有路径一律使用绝对路径,就是以"/"开头的或者带host的路径.形如: /imgs/1.jpg <%= request.getContextPath()%> ...

  8. javaweb项目中绝对路径的写法理解

    Tomcat的默认访问路径为http://localhost:8080,后需添加项目路径. 请求转发,是转发到本项目中的其他文件,所以在默认访问路径中添加了本项目的项目路径,故可以省略项目名称: re ...

  9. jsp中获取路径信息的方法

    今天在看代码时,发现程序使用了 request.getScheme() .不明白是什么意思,查了一下.结果整理如下: 1.request.getScheme() 返回当前链接使用的协议:一般应用返回h ...

随机推荐

  1. lucky 的 时光助理(2)

    lucky小姐说:昨天晚上他喝醉了,发消息说他想我了,说他后悔了. 我很惊讶. 我问lucky:你们很久都没有联系, 突然说... 你怎么想. 没错,'他'就是lucky的前男友. lucky看着我, ...

  2. 理解OVER子句

    简介 Over子句在SQLServer 2005中回归,并且在2012中得到了扩展.这个功能主要结合窗口函数来使用:也可以在序列函数"NEXT VALUE FOR"使用.OVER子 ...

  3. EF里如何定制实体的验证规则和实现IObjectWithState接口进行验证以及多个实体的同时验证

    之前的Code First系列文章已经演示了如何使用Fluent API和Data Annotation的方式配置实体的属性,比如配置Destination类的Name属性长度不大于50等.本文介绍E ...

  4. python 检查内存

    ################################# 测试函数运行内存# coding=utf-8# pip install memory_profiler# pip install p ...

  5. WPF 自定义搜索框

      控件中的搜索图标下载地址:http://www.easyicon.net/1183666-Search_icon.html 搜索框设计过程比较简单: 1.先定义一个Rectangle作为背景 2. ...

  6. spring HttpInvoker相关学习资料

    官方文档 spring支持的几种RPC 用Http Invoker实现RCP客户端与后台的交互 Java HttpInvoker小试 Spring注解发布RMI/HTTPInvoker/Hessian ...

  7. CORS详解

    介绍 由于同源策略的缘故,以往我们跨域请求,会使用诸如JSON-P(不安全)或者代理(设置代理和维护繁琐)的方式.而跨源资源共享(Cross-Origin Resource Sharing)是一个W3 ...

  8. FineUI(专业版)v3.2.0 发布(ASP.NET UI控件库)!

    +2016-08-20 v3.2.0 +表格增强. +表格列RenderField增加属性ClientHtmlEncode,用于在客户端进行HTML编码. -增加示例:单元格编辑->杂项-> ...

  9. quartus和modelsim中使用mif和hex文件

    .mif和.hex文件都是Quartus支持的数据文件格式,常被用作内存初始化文件.可是,M odelSim却不支持.mif文件,只支持.hex文件格式,这意味着如果你的设计采用了.mif文件 ,你的 ...

  10. hihocoder-1453-Rikka with Tree

    #Hihocoder 1453 : Rikka with Tree 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   source: https://hihocoder.co ...