jsp中超链接路径的写法

摘要:
没关系,但很快我就发现了一个问题,如果一个视图有多个映射地址,例如,localhost:所以我开始使用绝对路径。使用绝对路径可以避免上述相对路径遇到的问题。首先编写一个jsp,它将在每个页面头中导入。在此jsp中:%Stringpath=request。getContextPath();2.当您想要引用每个jsp中的其他URL资源时,请直接<
主题

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

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

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

相对路径

  最早以前我用的就是相对路径,刚开始感觉用起来很爽...很简单...比如当前路径是localhost:8080/projectName/a.jsp 我想超链接到localhost:8080/projectName/b.jsp 我只需要写<a href="http://t.zoukankan.com/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="http://t.zoukankan.com/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="http://t.zoukankan.com/<c:url value="/" /> ">这样就不需要在每个URL前面都使用c:url标签了...

总结

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

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

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

免责声明:文章转载自《jsp中超链接路径的写法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux jna调用so动态库SQL Server已提交读快照隔离级别的设置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

chrome 49 版本bug: flex父元素设置flex:1 , 子元素用height:100%无法充满父元素

1 <div class="container"> 2 <div class="item"> 3 <div class="item-inner"> 4 <a> 5 Botón 6 &l...

pom文件

1.父子pom 如果在一个工程中分多个模块,那么会有父子pom。一般子pom中会有配置,指示其依赖的父pom: <parent>    <groupId>com.xxx</groupId>    <artifactId>xxx</artifactId>    <version>1.1....

页面元素添加提示(tooltip)

在html页面中我们如果需要给页面元素添加提示(tooltip),可以考虑使用三种方式:title,alt,popup。1.使用title属性   语法<element title="value"> . . . </element>   例子:<a title="这是一个链接" href="http://t.zoukankan...

三层架构+存储过程实现分页

首先在项目下加入BLL,DAL,DataAccess,MODEL类库 -------前台界面--------- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="原始刷新分页.aspx.cs" Inherits="分页.原始刷新分页" %> <!DOCTYPE html P...

centos+mono+nginx+jexus 搭建linux下c#运行环境测试

从零开始搭建Linux测试环境之dk+apache+jboss +mod_jk+openssl软件介绍1.JDK(Java DevelopmentKit)。Java开发工具包。大家都知道Java程序可以在绝大多数的机器上运行,不需要安装任何额外的软件,为什么我们要安装JDK呢?这是因为Java程序在开发过程中,需要将源代码转换为中间代码形式,也即class...

C++文件路径的写法

转自:http://blog.csdn.net/chengonghao/article/details/51057780 文件路径的表示可以分为绝对路径和相对路径: c++中\是一种转义字符,他表示一个,就像 表示回车一样。 绝对路径表示相对容易,例如: pDummyFile = fopen("D:\vctest\glTexture\texture\dum...