html base 又一重大发现

base 一个曾经不记得的标签,虽然接触Javaweb这么久了,但是还有很多基础性的东西都被我忽略掉了,还有很多基础但实用的技巧应该没有被我发现,虽然不使用这些技巧对功能实现没有多大影响。但是,发现这些技巧的时候还是有一种醍醐灌顶的感觉的,这也许是我之前的无知造成的,若你已知,不好意思浪费了你的时间,若从我这里得知的,那我不胜荣幸!

<base> 标签为页面上的所有链接规定默认地址或默认目标。
通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白。
使用 <base> 标签可以改变这一点。浏览器随后将不再使用当前文档的 URL,而使用指定的基本 URL 来解析所有的相对 URL。这其中包括 <a>、<img>、<link>、<form> <script>等标签中的 URL。

在jsp开发中,为了页面的复用,更健壮,更加的可移植,经常会在写img、form、script、link等这些标签的时候使用绝对路径,以降低之后目录改变等带来的影响:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
	<link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/styles.css">
	<script type="text/javascript" src="<%=request.getContextPath() %>/jquery-1.8.0.js"></script>

而使用base标签同样可以实现同样的功能,而不用去改变之前的相对地址:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=path+"/"%>">
	<link rel="stylesheet" type="text/css" href="styles.css">
	<script type="text/javascript" src="jquery-1.8.0.js"></script>


!注意

新建jsp的时候,会默认有base这个标签,但是路径中包含了实际的端口等完整路径

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

,这样有时候会有问题(路径是通过交换机虚拟映射的时候),我今天就在这里摔了跟头。更好的是要自己改写在html中base标签
<base href="<%=path+"/"%>">不使用原来的basePath

今天上线的时候遇到一个问题,就是端口是虚拟映射的;

但是页面上使用了<base href="">,href中指出的是实际的端口号,所以就造成这个页面中加载js、css、image等时出错;
不使用base或者base指向正确的路径;
原文地址:https://www.cnblogs.com/vvch/p/4027568.html