воскресенье, 19 июня 2011 г.

Упрощенное создание тегов в JSP 2.0

Теперь теги можно создавать намного проще, не зная языка Java. Можно тег описать в определенном формате в виде хмл в файле *.tag, контейнер эти файлы умеет читать и создавать из них классы тегов.

Чтобы иметь доступ к этому тегу необязательно даже описывать его в дескрипторе тегов, можно просто указать путь на него из ссылки джееспе:
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>


Хотя можно и что и более привычно пользоваться пользоваться ури, для этого нужно сослаться на файл из десриптора библиотеки тегов. Десприптор:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
  <tag-file>
    <name>tf</name>
    <path>/WEB-INF/tags/tf.tag</path>
  </tag-file>
</taglib>

А вот само исользование такого тега в jsp:
...
<%@taglib prefix="my" uri="/WEB-INF/tlds/mytaglibrarydescriptor"%>
...
<my:tf/>

Приступая к самому формату файла *.tag нужно понимать, что у нас в дескрипторе нет никакого описания кроме пути к файлу, и то возможный вариант, что даже не нужен деспритор. Поэтому все необходимые описания можно сделать только в одном месте - в самом файле. И как все настройки JSP-страницы, это можно сделать через директивы.
<%@tag description="put the tag description here" pageEncoding="UTF-8"%>

<%-- The list of normal or fragment attributes can be specified here: --%>
<%@attribute name="message"%>

<%-- any content can be specified here e.g.: --%>
<h2>${message}</h2>

А вот более сложный пример. Вызов:
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
...
<tags:panel color="#80ff80" bgcolor="#c0ffc0" title="Panel 2">
  Second panel.<br/>
  Second panel.<br/>
  Second panel.<br/>
  Second panel.<br/>
</tags:panel>
...
<tags:panel color="#8080ff" bgcolor="#c0c0ff" title="Panel 3">
  Third panel.<br/>
  <tags:panel color="#ff80ff" bgcolor="#ffc0ff" title="Inner">
    A panel in a panel.
  </tags:panel>
  Third panel.<br/>
</tags:panel>
...

А вот сам таг-файл:
<%@ attribute name="color" %>
<%@ attribute name="bgcolor" %>
<%@ attribute name="title" %>
<table border="1" bgcolor="${color}">
  <tr>
    <td>>b>${title}</b></td>
  </tr>
  <tr>
    <td bgcolor="${bgcolor}">
      <jsp:doBody/>
    </td>
  </tr>
</table>

А вот пример как создавать переменные среды из тега, который определен тег-файлом:
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
...
<tags:displayProducts>
  <jsp:attribute name="normalPrice">
    Item: ${name}<br/>
    Price: ${price}
  </jsp:attribute>
  <jsp:attribute name="onSale">
    Item: ${name}<br/>
    <font color="red"><strike>Was: ${origPrice}</strike></font><br/>
    <b>Now: ${salePrice}</b>
  </jsp:attribute>
</tags:displayProducts> 

Вот же сам файл, к тому нужно обратить внимание на то, что он сам не брезгует услугами других тегов, и как обычная джееспе может сослаться на библиотеку и использовать в своих целях ее теги:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ attribute name="normalPrice" fragment="true" %>
<%@ attribute name="onSale" fragment="true" %>
<%@ variable name-given="name" %>
<%@ variable name-given="price" %>
<%@ variable name-given="origPrice" %>
<%@ variable name-given="salePrice" %>

<table border="1">
  <tr>
    <td> 
      <c:set var="name" value="Hand-held Color PDA"/>
      <c:set var="price" value="$298.86"/>
      <jsp:invoke fragment="normalPrice"/>
    </td>
    <td> 
      <c:set var="name" value="4-Pack 150 Watt Light Bulbs"/>
      <c:set var="origPrice" value="$2.98"/>
      <c:set var="salePrice" value="$2.32"/>
      <jsp:invoke fragment="onSale"/>
    </td>
    <td> 
      <c:set var="name" value="Digital Cellular Phone"/>
      <c:set var="price" value="$68.74"/>
      <jsp:invoke fragment="normalPrice"/>
    </td>
    <td> 
      <c:set var="name" value="Baby Grand Piano"/>
      <c:set var="price" value="$10,800.00"/>
      <jsp:invoke fragment="normalPrice"/>
    </td>
    <td> 
      <c:set var="name" value="Luxury Car w/ Leather Seats"/>
      <c:set var="origPrice" value="$23,980.00"/>
      <c:set var="salePrice" value="$21,070.00"/>
      <jsp:invoke fragment="onSale"/>
    </td>
  </tr>
</table>  

Комментариев нет:

Отправить комментарий