Blog

0

JSP Custom Tag dan Recursion

Selama mengembangkan aplikasi dengan platform Spring MVC, saya sering mengalami kesulitan untuk menampilkan view yang diharapkan apabila tidak ada tag/tag library yang memfasilitasi. Misalnya menampilkan tree, membuat select box dari list of object dan lainnya. Dalam kesempatan kali ini, saya akan menyampaikan tips untuk melakukan hal tersebut.

Yang pertama adalah penggunaan custom tag. Quoted from here: “A custom tag is a user-defined JSP language element”. Saya biasanya menggunakan custom tag untuk: a) Menampilkan view yang dipakai berkali-kali di halaman yang berbeda (seperti input select) atau b) Menampilkan view yang sulit dicoding menggunakan java di JSP. Memang kita bisa coding dengan java di view (JSP), tapi saya merasakan coding di JSP tidak sefleksibel dibandingkan coding lgsg di class.

Untuk membuat custom tag, pertama buat tag library definition (tld), misalnya WEB-INF/tlds/helper.tld. Tag ini membuat select box menggunakan list of objecs yang value dan labelnya sesuai definisi saat runtime (mencontoh form:select yang ada di taglib http://www.springframework.org/tags/form).

[source language="java"]
<?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">
  <tlib-version>1.0</tlib-version>
  <short-name>helper</short-name>
  <uri>/WEB-INF/tlds/helper</uri>
  <tag>
    <name>select</name>
    <tag-class>id.co.javan.labs.tags.InputSelectTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
      <name>name</name>
      <required>false</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
    <attribute>
      <name>items</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.util.List</type>
    </attribute>
    <attribute>
      <name>itemLabel</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
    <attribute>
      <name>itemValue</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
  </tag>
</taglib>
[/source]

Kemudian buat class-nya

[source language="java"]
public class InputSelectTag extends TagSupport {

    private String name = "";
    private List items;
    private String itemLabel;
    private String itemValue;

    // Create setter for all variables (A MUST)
    …

    // Overwrite method
    @Override
    public int doStartTag() throws JspException {
        try {
            StringBuilder sb = new StringBuilder();
            sb.append("<select name=\"").
                    append(name).
                    append("\">");
            for (Object item : items) {
                String firstLetter = itemLabel.substring(0, 1);
                String methodName = itemLabel.replaceFirst(firstLetter, firstLetter.toUpperCase());
                String label = item.getClass().getMethod("get" + methodName).invoke(item).toString();
                firstLetter = itemValue.substring(0, 1);
                methodName = itemValue.replaceFirst(firstLetter, firstLetter.toUpperCase());
                String value = item.getClass().getMethod("get" + methodName).invoke(item).toString();
                sb.append("<option value=\"").
                        append(value).
                        append("\"").
                        append(">").
                        append(label).
                        append("</option>");
            }
            sb.append("</select>");

            JspWriter writer = pageContext.getOut();
            writer.print(sb.toString());
        } catch (Exception e) {
        }
        return SKIP_BODY;
    }

    @Override
    public int doEndTag() throws JspException {
        return EVAL_PAGE;
    }
}
[/source]

Taglib sudah siap paka, tinggal akses di JSP seperti berikut

[source language="java"]

<%@taglib prefix="h" uri="/WEB-INF/tlds/helper"%>

<h:select items="${templates}" itemLabel="name" itemValue="id" name=”template” />

[/source]

Tips kedua adalah melakukan rekursi di JSP. Caranya cukup sederhana, yaitu dengan menggunakan tag <jsp:include>

[source language="java"]

${root.label}

<c:forEach var="root" items="${root.childrenAccount}">

<c:set var="root" value="${root}" scope="request"/>

<jsp:include page="node.jsp"/>

</c:forEach>

[/source]

Source: klik

Comments

There are no comments yet.

Leave a Reply

Your email is never published nor shared. Required fields are marked *

*

© Copyright PT Javan Cipta Solusi 2012. All rights reserved.