在Java Web中相对路径和绝对路径区别及应用方法

闲来无事,研究了一下bootstrap框架,并把这个框架融入到我开发的一个项目中,在应用过程中发现了一些问题,经过潜心研究这个问题终于解决了,下面我就把整个过程分享给大家。

一、开发环境介绍

开发语言     JDK1.8  
IDE   ECLIPSE platform 4.6.0  
WEB容器   

tomcat9

 
后端框架   Spring+Spring MVC+Spring Data  
前端框架   bootstrap3.3.7  

二、问题回顾

1、项目说明

2、static.html文件(改成jsp文件也可以)

注意:红色框内容<link href="https://www.linuxidc.com/css/bootstrap.min.css"/>,采用了相对路径

运行效果:

现象一:

现象二:

CSS样式表文件没有起作用。查看源代码,点击CSS连接,如下图:

三、解决方案

1、针对“现象一”的解决方案

在/OutSourcingManage/WebContent/WEB-INF/dispatcherServlet-servlet.xml文件中加入如下语句:

<mvc:default-servlet-handler/>

2、针对“现象二”的解决方案

方法一、在/OutSourcingManage/WebContent/WEB-INF/dispatcherServlet-servlet.xml文件中加入如下语句:

<mvc:resources mapping="/css/**" location="/bootstrap/css/"/>

方法二、修改static.html,将“<link href="https://www.linuxidc.com/css/bootstrap.min.css"/>”修改为:

<link href="https://www.linuxidc.com/OutSourcingManage/bootstrap/css/bootstrap.min.css"/>

方法三、将static.html修改static.jsp,并增加如下语句:

<%@ page language="Java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<head>

<base href="https://www.linuxidc.com/<%=basePath%>">

....

四、原理剖析

1、目标效果

2、内部原理剖析

(1)静态资源的处理

Spring MVC的拦截器DispatcherServlet默认是拦截所有请求,包括*.js、*.css、*.html、*.jpg、*.jsp等静态资源和动态资源,但是静态资源没有对应的handler,所以会出现上述警告。为了解决这个问题,需要为*.js、*.css、*.html、*.jpg等静态资源配置tomcat默认的拦截器。而<mvc:default-servlet-handler/>就是为此目的而生。

(2)绝对路径、相对路径

关于绝对路径、相对路径对于很多初学者感到迷惑,即使写出了可以运行的程序,也没有真正搞清楚原理,甚至对某些老手,也偶尔会犯迷糊。我总结了一些认识规则,与各位分享。

URL的一般语法格式为:

URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。

(带方括号[]的为可选项):protocol:// hostname[:port] / path / [;parameters][?query]#fragment

protocol(协议):一般是ftp、file、http(https)、mailto、thunder等协议。

hostname(主机名):是指存放资源的服务器的DNS(域名服务器)主机名或IP地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。

port(端口号):各种传输协议都有默认的端口号,如http的默认端口为80,我们在开发过程中一般采用8080。

path(路径):由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。

parameters(参数):这是用于指定特殊参数的可选项。

query(查询):用于传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。

fragment(信息片段):用于指定网络资源中的片段。

以http请求为例,URL地址是:8080/OutSourcingManage/login?username=gaodianhua&password=123456

URL格式细分含义

http:/主机名:[端口号]/web应用根目录/资源名称[?query]。

下面以:8080/OutSourcingManage/login?username=gaodianhua&password=123456为例

①服务器根地址(或称为tomcat服务器地址)规范为:

http:/主机名:[端口号]/,例如::8080/

②web应用根地址规范为:

http:/主机名:[端口号]/web应用根目录/,例如::8080/OutSourcingManage/

③资源根地址规范为:

http:/主机名:[端口号]/web应用根目录/资源名称,例如::8080/OutSourcingManage/login

请记住:上面三个概念,即:tomcat服务器根地址、web应用根地址、资源根地址 

服务器端(tomcat)和客户端(浏览器)对URL地址的解析规则

对于请求的任何资源,均需要转化为绝对URL地址。

服务器端对URL地址的解析一般使用web应用根地址作为相对路径。例如页面跳转和重定向时使用的地址:

request.getRequestDispatcher("/WEB-INF/views/success.jsp").forward(request, res);//页面跳转,跳转成功

request.getRequestDispatcher("WEB-INF/views/success.jsp").forward(request, res);//页面跳转,跳转成功

response.sendRedirect("/hello.html");//重定向,重定向失败

response.sendRedirect("hello.html");//重定向,重定向成功

"/"在服务器端和客户端的处理规则是不同的,即:

在服务器端解析时,被认为是以web应用根地址为基准地址的相对路径。

在客户端解析时,被认为是tomcat服务器根地址。

相对路径即不带"/"时,在服务器端和客户端的处理规则则是相同的,即:

在服务器端解析时,被认为是web应用根的地址。

在客户端解析时,被认为是父页面请求时web应用根地址为基准地址的相对地址。

下面以hello.html测试可得:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ea053475d3b5f09d4e18af60be3fe628.html