• 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/

  • 相关阅读:
    BZOJ 1088 模拟(扫雷经验…)
    BZOJ 1529
    BZOJ 3224
    BZOJ 1192
    BZOJ 1012
    博客搬家说明
    BZOJ 2423 DP
    BZOJ 1789&1830 推式子 乱搞
    BZOJ 1588
    拆点:虫洞
  • 原文地址:https://www.cnblogs.com/woshimrf/p/5779918.html
Copyright © 2020-2023  润新知