写了个导出excel,因为界面风格的原因,“导出”按钮改成超链接的形式去提交form,结果问题来了,报socket error,错不怕,就怕这样错的无厘头,郁闷了好久。快要崩溃的时候发现是
<base href="<%=basePath%>"/> 的原因。
看代码:出错时
修改后的代码:
分析原因:
如果有<base href="">,界面上所有相对路径的链接的url都会加上base指定的路径变成绝对路径,导致点击“导出”时,先访问了<%=basePath%>#,然后提交form,后台导出的数据要写到response.getOutputStream()时,由于页面请求的url已改变(这里说的不知道对否,请指正),所以报socket错误。
知识点:<base href=""/>用法:
base标记是一个基链接标记,是一个单标记。用以改变文件中所有连结标记的参数内定值。它只能应用于标记<head>与</head>之间。
你网页上的所有相对路径在链接时都将在前面加上基链接指向的地址。
重要属性:
1.href
设定前缀的链接地址
2.target
设定文件显示的窗口,同a标记中的target
注意:
还用于解决编程时候的相对路径问题,比如有的cms,因为每页路径不一样,他就给你生成<a href="/sdsd/dsd.html">sddsds</a>之类的,如果我在本地调试,肯定会在本地开一个目录的,这样就乱了,你可以把它生成相对路径,如
<a href="sdsd/dsd.html">sddsds</a>,只要在head部分加上
<base href=http://localhost/abc/>即可。
base还有一个用法,如在head部分加上这么一行: <base href="_blank"> ,就是默认所有链接在新窗口打开。
常在框架结构中用,如左右两个框架,把左边的框架中文件里的连接都显示在右边的框架里。只要用base标记,把其target属性值写为右框架名称,这就不用再为左框架里的文件中的每一个连接都指定target属性。
当使用时,BASE 元素必须出现在文档的 HEAD 内,在任何对外部源的引用之前。