jsp中超链接路径的写法
主题
超链接不就是一个地址字符串吗?这能有什么花头? 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中超链接路径的写法的更多相关文章
- 关于在jsp中的路径问题
前言: jsp作为javaweb开发中常见的视图技术,我们平时在开发项目使用的过程中,经常会导入一些静态资源,比如css\js\jpg.png等图片格式的文件,这些文件的路径成了问题,经常会出现索引不 ...
- JavaWeb中Servlet和Jsp跳转路径的写法
最近学习时,常常要写一些页面之间的跳转或者前台和后端之间的跳转 下面总结一下自己对于这些跳转路径的写法 声明:以下讲到的jsp文件都默认在WebRoot目录下 1.表单(Jsp)->Servle ...
- 关于jsp中超链接的相对路径
前提:新建了一个名为MyProject的web工程.在WebContent目录下新建一个jsp目录,在jsp目录中新建一个index.jsp文件. 实验:在index.jsp里写了4个链接,如下: & ...
- jsp中的路径与跳转
在jsp(serlvet)中,页面的"变换"有两种方式,第一重定向,第二转发: 先说重定向,它的调用方式是这样的 response.sendredirect("uri&q ...
- jsp中的路径问题
在学jsp的时候我每次都遇到路径的问题,每次都不能够说100%的把这搞定,这让我很烦恼,今天下午花了点时间来把路径问题整理了下. 一:首先我们在加载项目(我的项目名称是FinalExam)是的路径是h ...
- Struts2学习-jsp中超链接传参问题
今天在学习过程中对struts2中超链接的传参问题产生了一些疑惑,不明白jsp中的超链接如何将参数传到Action方法中去的. <s:iterator value="categorys ...
- JSP中的路径
我的原则 所有路径一律使用绝对路径,就是以"/"开头的或者带host的路径.形如: /imgs/1.jpg <%= request.getContextPath()%> ...
- javaweb项目中绝对路径的写法理解
Tomcat的默认访问路径为http://localhost:8080,后需添加项目路径. 请求转发,是转发到本项目中的其他文件,所以在默认访问路径中添加了本项目的项目路径,故可以省略项目名称: re ...
- jsp中获取路径信息的方法
今天在看代码时,发现程序使用了 request.getScheme() .不明白是什么意思,查了一下.结果整理如下: 1.request.getScheme() 返回当前链接使用的协议:一般应用返回h ...
随机推荐
- shell 脚本之循环使用 for while 详解
任何一种编程语言中循环是比不可少的,当然 shell 脚本也少不了循环语句,包括 for 语句. while 语句.文中主要以实际用例来说明 for while 都有哪些常见的使用方法和技巧. 一.f ...
- stm32 usb error : identifier "bool" is undefined
.\usb\USB\usb_pwr.h(54): error: #20: identifier "bool" is undefinedusb\USB\usb_pwr.h(54): ...
- [AR]Vumark(下一代条形码)
VuMark 准备知识 Vumark的说明: https://library.vuforia.com/articles/Training/VuMark https://library.vuforia. ...
- [No00008C]图解SQL的各种连接join让你对SQL的连接一目了然
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...
- Linux下的C Socket编程 -- 获取对方IP地址
Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...
- ngx_http_uwsgi_module模块.md
ngx_http_uwsgi_module ngx_http_uwsgi_module模块允许将请求传递到uwsgi服务器. 示例配置: location / { include uwsgi_para ...
- java socket收发http协议内容
来自:https://www.oschina.net/code/snippet_2009881_48232 import java.io.BufferedReader; import java.io. ...
- 项目vue2.0仿外卖APP(七)
ratings评价列表页实现 在ratings.vue组件里开发 首先先引入seller数据: 书写模板结构: 由于评价页又有之前写过的star.vue组件,所以又要在ratings.vue组件引入: ...
- [LeetCode] Queue Reconstruction by Height 根据高度重建队列
Suppose you have a random list of people standing in a queue. Each person is described by a pair of ...
- [LeetCode] Kth Smallest Element in a BST 二叉搜索树中的第K小的元素
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...