• JSP2.0自定义标签


    JSP1.0中可以通过继承TagSupport或者BodyTagSupport来实现自定义的tag处理方法。

    JSP2.0中也支持另外一种更为简单的自定tag的方法,那就是直接讲JSP代码保存成*.tag或者*.tagx的标签定义文件。tag和tagx文件不仅支持经典jsp代码,各种标签模版代码,还支持xml样式的jsp指令代码。

    按照约定,tag和tagx文件需要放置在WEB-INF/tags目录下。

    下面是一些简单的示例:

    1.简单地显示时间time.tag

    <%@ tag import="java.util.*" import="java.text.*" %>
    <%
      DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);
      Date d = new Date(System.currentTimeMillis());
      out.println(df.format(d));
    %>
    <%@ taglib prefix="util" tagdir="/WEB-INF/tags" %>
    <html>
      <head>
      </head>
      <body>
         Today is <util:time/>.
      </body>
    </html>

    2.复制字符串多少遍repeater.tag

    <%@ attribute name="count" type="java.lang.Integer" required="true" %>
    <%@ attribute name="value" type="java.lang.String" required="true" %>
    <%!
      private String repeater(Integer count, String s) {
        int n = count.intValue();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < n; i++) {
          sb.append(s);
        }
        return sb.toString();
      }
    %>
    <%
      out.println(repeater(count, value));
    %>
    <%@ taglib prefix="util" tagdir="/WEB-INF/tags" %>
    <html>
      <head>
      </head>
      <body>
        Let's get some sleep! <util:repeater count='${3 * 10}' value='zzz'/>
      </body>
    </html>

    3.查找省份lookup.tag

    <%@ tag import="java.util.*" %>
    <%@ attribute name="cityName" required="true" %>
    <%@ variable name-given="province" %>
    <%@ variable name-given="population" variable-class="java.lang.Integer" %>
    <%
      if ("Toronto".equals(cityName)) {
        jspContext.setAttribute("province", "Ontario");
        jspContext.setAttribute("population", new Integer(2553400));
      }
      else if ("Montreal".equals(cityName)) {
        jspContext.setAttribute("province", "Quebec");
        jspContext.setAttribute("population", new Integer(2195800));
      }
      else {
        jspContext.setAttribute("province", "Unknown");
        jspContext.setAttribute("population", new Integer(-1));
      }
    %>
    <jsp:doBody/>
    <%@ taglib prefix="util" tagdir="/WEB-INF/tags" %>
    <html>
      <head>
      </head>
      <body>
        <% pageContext.setAttribute("cityName", "Montreal"); %>
        <util:lookup cityName="${cityName}">
          ${cityName}'s province is ${province}.
          ${cityName}'s population is approximately ${population / 1000000} million.
        </util:lookup>
      </body>
    </html>

    上面的都是使用的经典jsp代码,下面将第3个示例使用其他代码实现:

    *使用标签:

    <%@ tag import="java.util.*" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ attribute name="cityName" required="true" %>
    <%@ variable name-given="province" %>
    <%@ variable name-given="population" %>
    <c:choose>
      <c:when test="cityName eq 'Toronto'>
        <c:set var="province" value="Ontario"/>
        <c:set var="population" value="2553400"/>
      </c:when>
      <c:when test="cityName eq 'Montreal'>
        <c:set var="province" value="Quebec"/>
        <c:set var="population" value="2195800"/>
      </c:when>
      <c:otherwise>
        <c:set var="province" value="Unknown"/>
        <c:set var="population" value="-1"/>
      </c:otherwise>
    </c:choose>
    %>
    <jsp:doBody/>
    <%@ taglib prefix="util" tagdir="/WEB-INF/tags" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
      <head>
      </head>
      <body>
        <c:set var="cityName" value="Montreal"/>
        <util:lookup cityName="${cityName}">
          ${cityName}'s province is ${province}.
          ${cityName}'s population is approximately ${population / 1000000} million.
        </util:lookup>
      </body>
    </html>

    *使用jsp指令,通常这种方式生成xml格式的文件

    <?xml version='1.0'?>
    <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page">
    	<jsp:directive.tag import="java.util.*"/>
    	<jsp:directive.taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"/>
    	<jsp:directive.attribute name="cityName" required="true"/>
    	<jsp:directive.variable name-given="province"/>
    	<jsp:directive.variable name-given="population"/>
    	<c:choose>
    	  <c:when test="cityName eq 'Toronto'>
    	    <c:set var="province" value="Ontario"/>
    	    <c:set var="population" value="2553400"/>
    	  </c:when>
    	  <c:when test="cityName eq 'Montreal'>
    	    <c:set var="province" value="Quebec"/>
    	    <c:set var="population" value="2195800"/>
    	  </c:when>
    	  <c:otherwise>
    	    <c:set var="province" value="Unknown"/>
    	    <c:set var="population" value="-1"/>
    	  </c:otherwise>
    	</c:choose>
    </jsp:root>
    <?xml version='1.0'?>
    <jsp:root version='2.0'
              xmlns:jsp="http://java.sun.com/JSP/Page"
              xmlns:util="urn:jsptagdir:/WEB-INF/tags"
              xmlns:c="http://java.sun.com/jsp/jstl/core">
      <jsp:directive.page contentType="text/html"/>          
    	<html>
    	  <head>
    	  </head>
    	  <body>
    	    <c:set var="cityName" value="Montreal"/>
    	    <util:lookup cityName="${cityName}">
    	      ${cityName}'s province is ${province}.
    	      ${cityName}'s population is approximately ${population / 1000000} million.
    	    </util:lookup>
    	  </body>
    	</html>
    </jsp:root>


    附录:

    标签文件中常用的指令:

    tag 类似JSP page指令,可以用于import常用的java类库等
    include 导入其他的标签定义文件
    taglib 使用其他标签,如jstl, spring tag, struts tag等等
    attribute 定义一个属性
    variable 定义一个jsp page中可见的变量,默认范围为NESTED,表示标签内有效。可选项有AT_BEGIN和AT_END


    这些指令的可选属性

    body-content 标签body的处理方式 ,可选项: 'empty', 'tagdependent' or 'scriptless'
    import 导入使用的java类库
    pageEncoding 设置页面编码
    isELIgnored 是否忽略el表达式
    dynamic-attributes 用于存储自定义属性的map,所谓的自定义属性指:未隐式申明的变量
    language 使用的脚本语言,目前必须是java
    display-name 标签名
    small-icon for tools
    large-icon for tools
    description 标签作用描述
    example informal description of how the tag is used

    <jsp:directive:attribute>的可选属性

    name 属性名
    required true or false
    rtexprvalue true or false - 指定是否支持运行时表达式
    type 值类型 - 默认是java.lang.String
    fragment true or false - 值先传递给容器(false), 直接传给标签处理方法(true)
    description 属性描述


    <jsp:directive:variable>的可选属性

    name-given 变量名(标签使用时的变量名)
    name-from-attribute Specifies the name of an attribute, whose value is the name of the variable that will be available in the calling JSP page. Exactly one of name-given or name-from-attribute must be supplied.
    alias A locally scoped variable which will store the variable's value. Used only with name-from-attribute.
    variable-class 变量类.默认是java.lang.String.
    declare Indicates whether the variable is declared in the calling JSP page or tag file. Default is true. Not entirely clear what this means!
    scope 变量范围,可选项 AT_BEGIN(标签后jsp page内有效), AT_END(标签后jsp page内有效) and NESTED. NESTED(默认,标签内有效)
    description 变量描述











  • 相关阅读:
    Java自学
    Java自学
    Java自学
    java自学
    Java自学
    mybatis基础及原理
    自定义swagger maven codegen插件
    spring学习总结016 --- spring事务原理
    spring学习总结015 --- spring事务
    windows解决端口占用问题
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3258352.html
Copyright © 2020-2023  润新知