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);
    }
}
复制代码

 本文转自Ryan.Miao博客园博客,原文链接:http://www.cnblogs.com/woshimrf/p/5779918.html,如需转载请自行联系原作者

相关文章
|
设计模式 前端开发 Java
EL(Express Lanuage)表达式 与 JSTL(JSP Standard Tag Library),JSP标准标签库
EL(Express Lanuage)表达式 与 JSTL(JSP Standard Tag Library),JSP标准标签库
115 0
EL(Express Lanuage)表达式 与 JSTL(JSP Standard Tag Library),JSP标准标签库
SAP Hybris Commerce的JSP tag和SAP BSP tag的比较
SAP Hybris Commerce的JSP tag和SAP BSP tag的比较
100 0
SAP Hybris Commerce的JSP tag和SAP BSP tag的比较
SAP Hybris Commerce的JSP tag和SAP BSP tag的比较
SAP Hybris Commerce的JSP tag和SAP BSP tag的比较
105 0
SAP Hybris Commerce的JSP tag和SAP BSP tag的比较
|
Java 移动开发 数据格式
|
Java 应用服务中间件 数据格式
完成你的自定义JSP Tag标签-Basic Coustom Tag
说明:基于Eclipse 3.2 + Tomcat 4.0编译完成 1.完成你自己的Tag Class,javax.servlet.jsp中提供一个Tag接口类 TagSupport 和 BodyTagSupport两个类,你自己的Tag Class必须 extends其中一个。
854 0
|
Web App开发 Java
JSP Tag Files 技术总结
最新完整的源码在: http://code.taobao.org/p/bigfoot_v2/src/tags/。 首先声明 Tag File 是门老技术,好用之余知道的人却不多! 简介 以前我们抽取一段JSP代码,整合到完整的页面中,一般使用 include 指令(例如),这比较简单的说。
826 0
|
18天前
|
Java
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
19 1
|
18天前
|
Java
人事管理系统【JSP+Servlet+JavaBean】(Java课设)
人事管理系统【JSP+Servlet+JavaBean】(Java课设)
16 0
|
18天前
|
Java
排课系统【JSP+Servlet+JavaBean】(Java课设)
排课系统【JSP+Servlet+JavaBean】(Java课设)
7 0
|
18天前
|
Java
仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
12 0