J2EE开发技巧之相对路径
文章目录
前言
在进行WEB开发时,如果一个项目比较大,分了很多的模块,那么必定项目的url也很多,如果url没有统一的规范,极易容易造成混乱,本文就是为了解决这个问题。主要思路要做到所有的视图页面内的连接都是相对于类似这种链接: https://host:88/projectName/
,其中的host就是域名,projectName就是你的项目名。如果我们能够做到所有的视图内的链接都是基于这个路径,一是有了一个统一的规范不容易出错,二是能够保证视图内的链接的点击不会出现死链接。
开发思路
- 写一个自定义标签类,作用就是在html的
<head/>
标签内输出网站的basePath(例如<base href='http://localhost:8080/TheSecondLab_war_exploded/'/>
)。 - 在jsp页面中调用这个自定义标签(需要一个HttpServletRequst对象作为参数传进去),就可以做到输出basePath了,这样页面内的所有链接都是相对于这个basePath。
创建自定义标签类
我写的一个自定义标签类代码如下:
public class BaseUrlTag extends SimpleTagSupport {
//为了得到basePath,需要一个HttpServletRequest对象
HttpServletRequest request;
//打印网站的basePath
@Override
public void doTag() throws JspException, IOException{
String path = request.getContextPath();
String basePath = "<base href='"+request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/'/>";
getJspContext().getOut().write(basePath);
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
}
创建tld文件
在项目的WEB-INF下创建与上面自定义标签类相关的tld文件,我写得tld文件如下:
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>bp</short-name>
<uri>/setBasePath</uri>
<tag>
<!-- 标签名 -->
<name>basePath</name>
<!-- 标签助手类(自定义的标签类) 放入类的全限定名 -->
<tag-class>com.mybatis.web.tag.BaseUrlTag</tag-class>
<!-- 标签的内容类型:empty表示空标签(使用空标签会报错),jsp表示可以为任何合法的JSP元素 -->
<!--SimpleTagSupport不支持设置为JSP-->
<body-content>empty</body-content>
<attribute>
<!-- 属性名 -->
<name>request</name>
<!-- 是否为必填项 -->
<required>true</required>
<!--是否可以填jsp表达式 el表达式 -->
<rtexprvalue>true</rtexprvalue>
<type>javax.servlet.http.HttpServletRequest</type>
</attribute>
</tag>
</taglib>
手动配置tld的位置
在项目的web.xml中配置上一步创建的tld的位置,防止系统提示找不到tld,配置的主要代码如下(上一步我创建的tld文件名为BasePathTag.tld):
<!--手动配置tld的位置(用于basePath的tld),不然提示找不到-->
<jsp-config>
<taglib>
<taglib-uri>/setBasePath</taglib-uri>
<taglib-location>/WEB-INF/tags/BasePathTag.tld</taglib-location>
</taglib>
</jsp-config>
在jsp中调用自定义标签
- 首先jsp引入刚才自定义的标签,引入方式为:
<%@taglib prefix="bp" uri="/setBasePath" %>
。 - 其次在jsp页面的
<head/>
(这是html的标记)标签内通过<bp:basePath request="<%=request%>"/>
调用刚才引入的自定义标签。 - 明白本jsp页面内的所有超链接都是基于basePath来设计,比如
<a href="test.do">
(test.do前没有/
,因为我设计输出的basePath以/
结尾)的物理路径为basePath/test.do
。 - 重启项目,访问jsp,查看渲染后的html代码,观察是否输出了basePath。
测试
访问调用了自定义标签的jsp页面,通过浏览器,按ctr+u可以查看渲染后的html源码,观察结果如下(输出了basePath):
文章作者 P1n93r
上次更新 2019-12-03