JAVAWEB之自定义TAG开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014424628/article/details/50119031

在javaweb开发中我们可能经常会用到basePath这个参数,没错,当我们新建一个jsp页面的时候,myeclipse会自动帮我们生成下面这段代码:

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

起初也许你看他不爽,后来发现这个东西确实很有用哦,但是我们仔细数了数这代码行数有点多,而且还是jsp页面嵌套Java代码实现的,看起来有些不伦不类(话又说回来,这个用肯定是没有问题的)。

现在我们想把这段代码抽离出来,用更简洁的方式实现同样的功能,即提供basePath参数。我们知道jsp页面中的jstl标签库功能强大,我们只需要在jsp页面引入这么一条代码就可以使用功能如此强大的标签。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

同样的,我们打算也用这种方式实现,不过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 = 1L;
    @Override
    public int doEndTag() throws JspException {
        return 0;
    }
    @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 0;
    }
}

是不是在这里看到了这两行熟悉的语句:

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标签库一样)

<%@ taglib prefix="Cfg" uri="/WEB-TAG/tools.tld" %>

简单说一下里面的两个参数,prefix指的是前缀,也就是我们使用标签的时候的前缀,uri指的是我们的标签库文件路径。具体说我们如何使用就是下面这段代码了:

<Cfg:basePath/>

你没有看错,就是这么简单!现在我们可以删除jsp文件中的那五行代码了。运行后即可正确显示:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u014424628/article/details/50119031