自定义JSTL标签和函数库

一、自定义JSTL标签

1.编写标签处理类:

(1)实现 SimpleTag 接口,通过 setJspContext()方法可以获取到 jspContext 对象,实际上也是 pageContext 对象。

在 doTag() 方法中完成逻辑,通过 JspWriter out = jspContext.getOut(); 获取到的 out 对象,可以输出到页面。如:

/**
 * MyTag2
 *
 * @author solverpeng
 * @create 2016-07-03-10:20
 */
public class MyTag2 implements SimpleTag {
    private JspContext jspContext = null;
    @Override
    public void doTag() throws JspException, IOException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String dataStr = simpleDateFormat.format(new Date());
        JspWriter out = jspContext.getOut();
        out.write(dataStr);
    }

    @Override
    public void setParent(JspTag jspTag) {

    }

    @Override
    public JspTag getParent() {
        return null;
    }

    @Override
    public void setJspContext(JspContext jspContext) {
        this.jspContext = jspContext;
    }

    @Override
    public void setJspBody(JspFragment jspFragment) {

    }
}

MyTag2

(2)在 WEB-INF 下新建自定义 tld 文件,可以参考 JSTL 本身一些标签的的实现,如 c.tld。然后注册标签。如:

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">

    <display-name>solverpeng core</display-name>
    <tlib-version>1.1</tlib-version>
    <short-name>solverpeng</short-name>
    <uri>http://solverpeng.com/tags</uri>

    <tag>
        <name>showDate</name>
        <tag-class>com.nucsoft.myservlet.tag.MyTag2</tag-class>
        <body-content>empty</body-content>
    </tag>

</taglib>

solverpeng core tag

(3)在页面中导入自定义的标签库,然后使用。如:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="http://solverpeng.com/tags" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <s:showDate/>
</body>
</html>

tag.jsp

2.继承 SimpleTagSupport。其中在 SimpleTagSupport 类中已经完成了对 JspTag、JspContext,JspFragment 的注入操作,可以直接使用。

3.需要注意的地方

在自定义标签tld文件中,tag 节点里的 body-content 节点内容有四个可选值,分别介绍一下:

(1)tagdependent:将标签体的内容不经过任何修改和处理原封不动的交个标签处理类

(2)empty:没有任何标签体

(3)scriptless:表示标签体支持纯文本、EL表达式、JSTL等标签,不支持JSP脚本片段和JSP表达式

(4)JSP:在 SimpleTag 标签体系下不可用

可以通过 jspContext 获取到其他8大 JSP 隐含对象。

如果为带属性的自定义标签,在目标处理类中通过提供 setXxx() 方法来获取,在 tld 文件中,需要在 tag 元素中添加子节点 attribute 。

其中对 attribute 节点下的三个子节点进行说明:

(1)name:属性名称,和目标处理类中通过 setXxx() 方法定义的属性名一致

(2)required:是否是必须输入的

(3)rtexprvalue:是否支持 EL 表达式

如果需要对标签体处理,需要在目标处理类中进行一系列的处理:

(1)在 doTag() 方法中通过 this.getJspBody() 可以获取到 JspFragment 对象

(2)执行 JspFragment 对象的 invoke() 方法,若不需要对执行后的标签体进行处理,而是直接输出的话,invoke() 方法的参数传入 null就 ok。

若是需要对执行后的标签体进行处理,则需要传入一个 Write 对象,在调用 invoke() 方法之后,然后对 Write 对象进行处理。如:

JspFragment jspBody = this.getJspBody();
StringWriter out = new StringWriter();
jspBody.invoke(out);
String content = out.toString();
String result = content.toUpperCase();
JspWriter writer = this.getJspContext().getOut();
writer.print(result);

二、自定义JSTL函数库

1.定义函数处理类,要求类和方法必须为 public ,且方法必须为 static 。如:

/**
 * @author solverpeng
 * @create 2016-07-03-10:34
 */
public class MyFunction {
    public static String hello() {
        return new Date().toString();
    }
}

MyFunction

2.在 WEB-INF 下新建自定义 tld 文件,可以参考 JSTL 本身一些标签的的实现,如 c.tld。然后注册函数。如:

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">

    <display-name>solverpeng core</display-name>
    <tlib-version>1.1</tlib-version>
    <short-name>solverpeng</short-name>
    <uri>http://solverpeng.com/tags</uri>

    <function>
        <name>hello</name>
        <function-class>com.nucsoft.myservlet.function.MyFunction</function-class>
        <function-signature>java.lang.String hello()</function-signature>
    </function>
</taglib>

solverpeng tag tld

3.在JSP页面中导入自定义的函数库,然后在页面中使用,如:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="http://solverpeng.com/tags" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${s:hello()}
</body>
</html>

tag.jsp

三、JSTL中一个不常用的标签 c:forTokens

<% pageContext.setAttribute("str", "aa,bb,ee,mm,tt"); %>
<c:forTokens items="${str }" delims="," var="item">
${item }
</c:forTokens>

c:forTokens

时间: 2024-08-08 04:57:48

自定义JSTL标签和函数库的相关文章

自定义JSTl标签-----满足自身需求(JSTL标签库无法满足需求时)

一.JSTL是: apache开发的一套jsp标签,后来捐献给了sun,sun将其命名为jstl 二.JSTL的使用(ideal中) 1.导入jar包到pom文件中: <!--jstl的jar--><dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <scope

自定义jstl标签库

自定义函数库: 1.定义类和方法(方法必须是public static)  2.编写自定义tld文件,并且将此文件放到WEB-INF或WEB-INF任意子目录下 3.在jsp中采用taglib指令引入自定义函数库 4.采用 前缀+冒号(:)+函数名 调用即可 MyFunctions.java 代码: [java] view plain copy public class MyFunctions { public static String sayHello(String name) { retu

自定义jstl标签

JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库. JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:forEach.forTokens 4.URL操作标签:import.url.redirect 使用时需要在项目中加入jstl-1.2.jar,同时在jsp中加入以下代码来使用 <

自定义jstl标签开发

从jsp1.1开始就可以在jsp页面中使用自定义标签了,使用自定义标签不但可以实现代码重用,而且可以使jsp代码更简洁.Jsp2.0的标签扩展API中又增加了SimpleTag接口和其实现类SimpleTagSupport. 标签扩展API层次结构: TLD文件元素详解: 每个自定义标签都必须在TLD文件中声明,TLD文件只不过是一个XML文件.根元素是<taglib>,它包含一个或者多个<tag>标签,该元素用来声明定制标签.<taglib>元素中只有<tlib

Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库

前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. JSTL标签库,是由一些Java类组成的. JSTL组成: JSTL –Core 核心标签库. 重点 JSTL – I18N - 国际化标签库.Internationalization- I18N JSTL – SQL – 数据库操作标签(有悖于MVC设计模式),现在都不用这个. JSTL - Fu

jsp之jstl标签

常用jstl标签 一.<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 核心标签 1.符合条件就输出,没有对应的else <c:if test="条件">  输出内容  </c:if> 2.符合某个条件后就不再执行后面的条件,没有条件适合就执行otherwise <c:choose> <c:when test=&q

Django模板之自定义过滤器/标签/组件

自定义步骤: 1.     在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 2.     在app应用中创建templatetags模块包(模块名只能是templatetags) 3.     创建任意 .py 文件,如:my_tags.py ·   导入模块:from django import template ·   实例化注册器:register = template.Library()   #register的名

学会怎样使用Jsp 内置标签、jstl标签库及自定义标签

学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签. jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签 1.内置标签(动作标签): <jsp:forward />转发标签: 语法:<jsp:forward page="

12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例

EL应用 自定义一个标签,实现两个字符串的相加 1回顾 1.1servlet生命周期 init(ServletConfig) service(ServletRequest,ServletResponse) destory() 1.2回话技术 cookie:浏览器端 (服务器需要浏览器保存少量的数据) 服务器创建对象:new Cookie(name,value) cookie.setMaxage(秒);  有效时间 cookie.setMaxage(0)  删除cookie cookie.setP