JSTL Example


 * На далеком диком западе, в стране непуганых дизайнеров, существует страшное поверье, что если дизайнер увидит код java в странице jsp, то он сойдет с ума и ему не поможет даже волшебное зелье “Гамбургер с кока-колой”. (с) http://study-and-dev.com/blog/jstl_1/

При написании примера можно опираться на цикл статей:

Как создать тег

Как создать тег с аттрибами

Как создать тег с динамическими аттрибутами

При этом в интернетах бродит информация, что создание xml-файлов описания тегов в WEB-INF - устаревший метод.

Мы объединим все три статьи в одном проекте и создадим два тега: helloworld и ebook. В helloworld просто выведем строку, а в books выведем книгу с обязательными тегами в виде автора и названия и два динамических тега: дата публикации и тип книги.

Создадим обычный Spring-проект и заменим в нем index.jsp на следующиее содержимое:

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@taglib uri="/WEB-INF/jstl/helloworldTag.tld" prefix="jperm" %> <%@taglib uri="/WEB-INF/jstl/bookTag.tld" prefix="ebook" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

 Welcome to Spring Web MVC project

Чуть ниже будет результат использования собственного тега helloworld.  Результат работы тега book: 

В папке WEB-INF/jstl создадим два файла с информация о тегах.

helloworldTag.tld с содержимым, описывающим тег без аттрибутов:

  1.0 hello helloworldTag helloworld jperm.jstl.HelloWorld empty helloworld tag displayes Hello World string

bookTag.tld будет описывать два статичных аттрибута (title, author) и произвольное число динамических аттрибутов

  1.0</tlib-version> book</short-name> bookTag book jperm.jstl.Book</tag-class> empty</body-content> <dynamic-attributes>true</dynamic-attributes> helloworld tag displayes Hello World string title true Book title false author true Author name false

В этих файлах заданы классы, отвечающие за вывод текста. В нашем случае это jperm.jstl.HelloWorld и jperm.jstl.Book. Создадим эти файлы.

Содержимое jperm.jstl.HelloWorld:

package jperm.jstl;

import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport;

/** * * @author ars */ public class HelloWorld extends TagSupport { private static final long serialVersionUID = 1L; @Override public int doStartTag throws JspException { try{ pageContext.getOut.print("Hello World!"); } catch(IOException ioException) { throw new JspException("Error: " + ioException.getMessage); }       return SKIP_BODY; } }

Содержимое jperm.jstl.Book:

/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package jperm.jstl;

import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.DynamicAttributes; import javax.servlet.jsp.tagext.TagSupport;

/** * * @author ars */ public class Book extends TagSupport implements DynamicAttributes { private static final long serialVersionUID = 1L; private String author; private String title; private Map<String, Object> map = new HashMap<String, Object>; public void setAuthor(String author) { this.author = author; }   public void setTitle(String title) { this.title = title; }   @Override public int doStartTag throws JspException { try{ // Работаем с динамическими тегами StringBuffer buffer = new StringBuffer;  // Пройдем по всем динамическим аттрибутам buffer.append(" Динамические аттрибуты: <ul>"); for (String name: map.keySet) { buffer.append("<li>") .append(name) .append(" - ") .append(map.get(name)) .append("</li>"); }           buffer.append("</ul> "); pageContext.getOut.print(buffer.toString); // Работаем со статическими тегами pageContext.getOut.print(" Автор: " + this.author + "  Книга: " + this.title + "  "); } catch(IOException ioException) { throw new JspException("Error: " + ioException.getMessage); }       return SKIP_BODY; }

// получаем динамические теги и добавляем все их в HashMap, чтобы в дальнейшем с ними работать @Override public void setDynamicAttribute(String uri, String localName, Object value) throws JspException { map.put(localName, value); } }

Все, теперь осталось открыть проект и увидеть результат: Чуть ниже будет результат использования собственного тега helloworld. Hello World! Результат работы тега book: Динамические аттрибуты: <ul><li>type - книга</li><li>public - 2013.01.01</li></ul>  Автор: Ivanov I.I.  Книга: Земля Русская