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 条评论
登录 后参与评论

相关文章

来自专栏SpringBoot

第三节,Springboot@Value和@ConfigurationProperties比较

这里可以看出@value 名称必须跟配置文件一致,但是@ConfigurationProperties支持松散绑定,意思就是可以用"_","-"代表大写

963
来自专栏张善友的专栏

Spacebuilder在Mono上运行修改备忘

Spacebuilder 是一个asp.net mvc3项目,使用到了Combres,Combres依赖于dotless,然后在Spacebuilder的项目没...

1946
来自专栏老码农专栏

Actframework依赖注入 II - 注入对象类型

923
来自专栏cnblogs

Javascript继承,再谈

     说到Javascript的继承,相信只要是前端开发者都有所了解或应用,因为这是太基础的知识了。但不知各位有没有深入去理解其中的玄机与奥秘。今本人不才,...

33011
来自专栏林德熙的博客

WPF 获得触摸精度和触摸点

使用 Tablet.TabletDevices 可以获得所有的触摸设备,获得触摸点数可以通过下面代码

621
来自专栏hbbliyong

.Net下SQLite的DBHelp

怎样获取SqLite请参考初识SqlLite ---.net连接数据库,怎样在SQLite使用Linq请参考在C#中利用Nuget包使用SQLite数据库和Li...

2704
来自专栏技术之路

Linq 和DefaultView两种方法去掉DataTable 里的重复行

在做项目的时候经常会遇到DataTable 里的数据重复,或者合并两个DataTable后有数据重复 一般我们是想把重复的删除掉,还有其它的方式实现比如用Lin...

1816
来自专栏java闲聊

POI之easypoi操作(二)

2835
来自专栏咸鱼不闲

AOP的两种实现方式

个人理解AOP就是拦截器,(可能是我理解不全面,反正我现在就认为它是拦截器,拦截器!拦截器!只不过娶个英文名字而已)。 功能:AOP可以在做某些事情之前或之后强...

885
来自专栏zcqshine's blog

springboot 上传下载图片

3629

扫码关注云+社区