在javaweb開發中我們可能經常會用到basePath這個參數,沒錯,當我們建立一個jsp頁面的時候,myeclipse會自動幫我們生成下面這段代碼:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
起初也許你看他不爽,後來發現這個東西确實很有用哦,但是我們仔細數了數這代碼行數有點多,而且還是jsp頁面嵌套Java代碼實作的,看起來有些不倫不類(話又說回來,這個用肯定是沒有問題的)。
現在我們想把這段代碼抽離出來,用更簡潔的方式實作同樣的功能,即提供basePath參數。我們知道jsp頁面中的jstl标簽庫功能強大,我們隻需要在jsp頁面引入這麼一條代碼就可以使用功能如此強大的标簽。
同樣的,我們打算也用這種方式實作,不過jstl标簽庫中并沒有提供basePath參數,不然也不用我們在這大費周章自定義Tag了。好了廢話不多說。我們來實際操作吧:
建立一個WebProject,名字自己定,這裡我用Tag
然後我們建立一個檔案夾用來存放自定義标簽檔案(.tld檔案),名字自己定,這裡我就用WEB-TAG了
建立一個tld檔案,名字自己定,這裡我就用tools.tld了
taglib标簽的内容如下:
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>base</short-name>
<tag>
<name>basePath</name>
<tag-class>com.xy.tag.BasePathTag</tag-class>
<body-content>jsp</body-content>
</tag>
</taglib>
建立一個類BasePathTag 繼承自TagSupport
package com.xy.tag;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class BasePathTag extends TagSupport{
private static final long serialVersionUID = L;
@Override
public int doEndTag() throws JspException {
return ;
}
@Override
public int doStartTag() throws JspException {
HttpServletRequest request = (HttpServletRequest)this.pageContext.getRequest();
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
JspWriter jspw = this.pageContext.getOut();
try {
jspw.print(basePath);
} catch (IOException e) {
e.printStackTrace();
}
return ;
}
}
是不是在這裡看到了這兩行熟悉的語句:
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
沒錯,我們在這裡擷取到了basePath參數,并借助JspWriter寫到jsp頁面,以什麼方式寫呢?當然是标簽的形式,看看我們的tools.tdl檔案,不能猜出是其中的basePath這個标簽吧,畢竟我在裡面就寫了一個tag。。。。。。
ok,準備工作基本上做好了,下面我們開始在jsp頁面中測試效果,打開項目的index.jsp頁面,在最上面加入下面這行語句(就和引入jstl标簽庫一樣)
簡單說一下裡面的兩個參數,prefix指的是字首,也就是我們使用标簽的時候的字首,uri指的是我們的标簽庫檔案路徑。具體說我們如何使用就是下面這段代碼了:
你沒有看錯,就是這麼簡單!現在我們可以删除jsp檔案中的那五行代碼了。運作後即可正确顯示:
