关于javaweb中的绝对路径和相对路径(关于引用外部资源时的路径问题)

相信大家在写web项目时,对于外间资源的引用多多少少都会用到,而此时引用的路径就显得十分重要!(在跳转或者其它请求后页面样式得丢失便就是路径得问题)

在开始之前大家需要明白一点就是web项目创建的时候会有一个Web-Content,但是在项目发布后这个就不存在了,所以再访问的时候路径不许要考虑Web-Content


关于路径得解释:

关于绝地路径相信大家都会,我这里就说一下概念:

绝对路径:不可改变的路径

本地绝对路径:增加盘符的路径(e:/test/css01.css)(在引入时,直接找自己得电脑盘符中得指定位置,但是一般都不会使用)

网络绝对路径:增加协议,IP地址,端口号的路径(http://localhost:8080/css01.css)

说明在你当前项目根路径下创建一个css01.css文件(就是右击Web-Content项目名创建文件,为什么不是右击项目名,是因为,当项目发布后,是没有Web-Content这个目录的


我相信大家都在找关于相对路径,所以我这里先说明一下概念,在用实际项目阐述(项目很简单)

概念:

相对路径:可以改变的路径,但是以基准路径为参考,查找其他路径

默认情况下,相对路径的基准路径是以当前资源的访问路径为基准(重点)

说明准备:

我先建立一个简单web项目,层次如下图

 

AServlet是一个跳转页面,跳转到/WEB-INF/jsps/jsp01.jsp(访问得路径就是/AServlet)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
		request.getRequestDispatcher("/WEB-INF/jsps/jsp01.jsp").forward(request, response);
	
	}

css01.css页面样式:

#btn1{
	color: red;
}

js01.js页面


function testBtn() {
		alert("enter")
	};

jsp01.jsp页面

<button id="btn1" onclick="testBtn()" >test</button>

好接下来就是重头戏:在jsp01.jsp页面引入css01.css和js01.js(请参考上面得项目目录结构层次)

(1)在jsp01.jsp页面中加上这两句引用(../表示上一层目录)

<link rel="stylesheet" type="text/css" href="../../css/css01.css">
<script type="text/javascript" src="../../js/js01.js"></script>

错误思想:

按照上面得写法一个(../)就是到了WEB-INF目录下,再来一个(../)就到了项目根目录(Testpath)(不是Web-Content目录吗??是因为,当项目发布后,是没有Web-Content这个目录的,前面我说过了!!),那此时正好啊,根目录再加上直接写的那个目录,对啊,莫得问题啊!!我只能说小伙子还是年轻!!(hh)

正确思想:

这是的路径确实是相对路径,不过相对的位置大家弄错了,此时相对的是当前的访问路径,此时的访问路径是

http://localhost:8080/TestPath/AServlet(因为我这里使用的是转发,如果是重定向以重定向到该页面后的网页路径为准!!不过大家注意WEB-INF下的资源是不可以被直接访问的!因此使用重定向好像会出现一些问题,大家可以先使用转发参考本片文章)

基础路径就是http://localhost:8080/TestPath/(/AServlet去掉,以后都是的去掉最后一个)

即此时使用的两个(../)后路径就会变成http://localhost:8080/,虽然使用了两个(../)但是效果只是一个,因为只能上一个目录了,在前面就是网络路径的根路径,无法更改!!

最总的路径就变成了http://localhost:8080/css/css01.css(这样访问的路径肯定会出错!)

解决:

所以你需要将两个(../)都去掉!!这样就变为基础路径加上自己写的路径

<link rel="stylesheet" type="text/css" href="css/css01.css">
<script type="text/javascript" src="js/js01.js"></script>

http://localhost:8080/TestPath/css/css01.css

http://localhost:8080/TestPath/js/js01.js

(关于在css/css01.css与js/js01.js前加不加 / 的问题我下面会说到)

这样路径就对了!!页面的css格式与js脚本也可以使用了!!(效果我就不展示了!!)

 

 

 


但是大家也看到了,这样去写不是很好,因为,一个大的项目文件会很多,样式以及文件的位置都会很多,你在这个jsp01.jsp页面这样写,其它的页面其它文件夹下,又是另一种相对路径,非常的麻烦!!

所以大家可以把css与js的样式文件路径写完整(其它资源文件同理)

<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/css/css01.css">
<script type="text/javascript" src="${pageContext.request.contextPath }/js/js01.js"></script>

对就是使用EL表达式,${pageContext.request.contextPath }表示当前的项目名,如果还是觉得这样不好,大家可以给${pageContext.request.contextPath }器一个别名,以后使用该别名即可

例如:写一个Listener去继承ServletContextListener,实现相应的方法,将项目名获取后保存到application域即可,以后,所有的页面都可以使用别名(具体的实现我就不说了,文章重点不再这里,感兴趣的可以去上网查找,或者直接慢慢写!)


 

路径以斜杠开头,表示的特殊的相对路径,在不同的场景中,相对的位置会发生变化。

    url : http://localhost:8080/TestPath/css/css01.css

 

前台路径:<a href=”/css/css01.css”><img src=”/css/css01.css”>(由浏览器解析的)

相对服务器的根 : http://localhost:8080/

即最后的路径就是: http://localhost:8080/css/css01.css(所以之前的那个地方是不能加 / 的)

后台路径:forward(”/user.jsp”), xml(由服务器解析的)

相对web应用的根:http://localhost:8080/TestPath/

最后的路径:http://localhost:8080/TestPath/user.jsp

猜你喜欢

转载自blog.csdn.net/qq_38263083/article/details/82924281
今日推荐