JSP自定义tag

前端需要调用后端的配置,想起velocity-tools。然而jsp的话,目前只能想到tag和EL表达式了。

Tag相当好写,jsp2.0提供了简化写法

编写一个java类:

public class HelloWorldTag extends SimpleTagSupport {

    public void doTag() throws JspException, IOException{
        JspWriter out = getJspContext().getOut();
        out.println("Hello Custom Tag!");
    }
}

然后编写对应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 [url]http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd[/url]"
        version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>Example TLD</short-name>
    <tag>
        <name>hello</name>
        <tag-class>com.test.demo.HelloWorldTag</tag-class>
        <body-content>empty</body-content>
    </tag>
</taglib>

然后就可以在页面上使用了:

<%@ taglib prefix="ex" uri="/WEB-INF/hello.tld" %>
<ex:hello/>

上述是没有body的tag,如果想要输出body的内容:

新写一个java类:

public class BodyTag extends SimpleTagSupport {

    StringWriter sw = new StringWriter();

    public void doTag() throws JspException, IOException{
        getJspBody().invoke(sw);
        JspWriter out = getJspContext().getOut();
        out.println(sw.toString());
    }

}

在原来tld文件里面追加一个tag:

<tag>
    <name>body</name>
    <tag-class>com.test.demo.BodyTag</tag-class>
    <body-content>scriptless</body-content>
</tag>

在页面上:

<ex:body>
    This is message body.
 </ex:body>

如果想要在tag上追加参数:

public class StandardTag extends SimpleTagSupport {

    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    StringWriter sw = new StringWriter();

    public void doTag() throws JspException, IOException{
        JspWriter out = getJspContext().getOut();
        if (message!=null){
            //from filed
            out.println(message);
        }else{
            //from body
            getJspBody().invoke(sw);
            out.println(sw.toString());

        }
    }


}

在tld中添加一个新tag:

<tag>
    <name>msg</name>
    <tag-class>com.test.demo.StandardTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
        <name>message</name>
        <required>false</required>
        <type>java.lang.String</type>
    </attribute>
</tag>

在页面上使用:

<ex:msg message="show message from para">
  </ex:msg>
  ---------------
  <ex:msg>
    if message==null , then show body.
  </ex:msg>

如果想要使用传参,使用EL表达:

在java类中添加一个static方法:

public static String hello(String name){
        return "Welcome: " + name;
}

然后在tld中添加:

<function>
    <name>welcome</name>
    <function-class>com.test.demo.StandardTag</function-class>
    <function-signature>java.lang.String hello(java.lang.String)</function-signature>
    <example>${ex:welcome('Ryan')}</example>
</function>

然后页面上调用:

${ex:welcome('Leslie')}

在spring mvc 中,有个很好用的tag支持类RequestContextAwareTag,下面做一个简单的使用:

public abstract class BaseTag extends RequestContextAwareTag {
    private static final EPCLogger LOGGER = EPCLogger.getLogger(BaseTag.class);
    private static final long serialVersionUID = -6258930875039222435L;
    private BeanUtils beanUtils = new BeanUtils();
    private HandlebarUtils handlebarUtils = new HandlebarUtils();

    public abstract Object getModel();

    public BaseTag() {
    }

    public void renderHandlebarsView(String templateLocation) {
        try {
            Template e = this.handlebarUtils.compile(templateLocation);
            e.apply(this.getModel(), this.pageContext.getOut());
        } catch (Exception var3) {
            LOGGER.error(UITagsSystemEvent.BASE_TAG_ERROR, "Error occurred while rendering handlebars view.", var3);
        }

    }

    public Object getBean(String beanName) {
        Validate.notNull(beanName);
        return this.beanUtils.getBean(this.getRequestContext(), beanName);
    }
}
public class BeanUtils {
    public BeanUtils() {
    }

    public Object getBean(RequestContext requestContext, String beanName) {
        return requestContext.getWebApplicationContext().getBean(beanName);
    }
}

reference:

http://www.runoob.com/jsp/jsp-custom-tags.html

https://www.ibm.com/developerworks/cn/java/j-lo-jsp2tag/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏lgp20151222

Spring使用webjar

这玩意很简单,但是我们第一次搞就是搞不成功,为什么呢?因为我们都用的是idea或者eclipse编译。webjar只能在maven上才能打包,所以在使用时,记得...

401
来自专栏Spring相关

快速创建SpringBoot+SSM解析

此处使用IDEA快速搭建SpringBoot应用,首先用SpringBoot搭建WEB工程:

572
来自专栏西安-晁州

ssh登录实现

工程目录 ? 配置文件详解 Spring的applicationContext.xml文件 <span ><?xml version="1.0" encodin...

2370
来自专栏技术与生活

Annotation 使用案例

Java 的 annotation 自 JDK1.5就拥有了,主要作用就是给代码打标注,这个系列文章将从头到尾进行一个梳理,当然不仅仅是 Annotation,...

511
来自专栏闻道于事

Spring Boot入门

Spring Boot入门: 使用IDEA创建Spring Boot 项目: 选择 ? 勾选Web ? 生成项目结构: ? 例子: package com.ex...

2804
来自专栏Java 技术分享

MVC 小案例 -- 信息管理

2695
来自专栏pangguoming

springboot的Web开发-Web相关配置

一:Spring Boot提供自动配置        通过查看WebMvcAutoConfiguration及WebMvcProperties的源码,可以发现S...

8668
来自专栏玩转JavaEE

Spring常用配置

上篇文章我们简单介绍了Spring的基本配置,算是一个简单的入门,这篇文章我们再一起来看看Spring在使用的过程中一些其他的常见配置。 Bean的Scope ...

3136
来自专栏Java3y

从零开始写项目第一篇【搭建环境】

使用Maven搭建SSM环境 SSM需要的基础jar包有哪些??整理一下: c3p0数据连接池 springMVC的JSON springAOP springC...

37810
来自专栏Ryan Miao

spring-boot - demo

当我发现把最初的一个demo整的面目全非的时候,突然想要找一个简单的demo做测试,发现与其在原来的上面该,还不如新建一个demo。 官方入门:http://p...

33811

扫描关注云+社区