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/

 

posted @   Ryan.Miao  阅读(1540)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示