天天看點

JAVAWEB之自定義TAG開發

在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檔案中的那五行代碼了。運作後即可正确顯示:

JAVAWEB之自定義TAG開發