39
JSTL, XML and XSLT An introduction to JSP Standard Tag Library and XML/XSLT transformation for Web layout

JSTL, XML and XSLT An introduction to JSP Standard Tag Library and XML/XSLT transformation for Web layout

Embed Size (px)

Citation preview

JSTL, XML and XSLT

An introduction to JSP Standard Tag Library and XML/XSLT transformation for Web layout

JSP Standard Tag Library (JSTL) JSTL is a standardized set of Custom Tags

with several implementations http://jakarta.apache.org/taglibs/doc/standard

-doc/intro.html JSTL is one Tag Library, but it’s functionally

is divided into four parts with its own TLD Core XML Processing I18N Database Access (SQL)

JSTL - Prerequisites

In all examples a couple of objects are supposed to be available customers - A collection of Customer objects intArray - An array of int's stringArra - An array of Strings The Customer Object

int key String lastName String firstName Date birthDate Address address

The Address Object String line1 String line2 String city String state String country

JSTL Core

The Core part of JSTL contain tags the core of JSTL such as iteration, conditional processing and expression language support

< %@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %> at the top of your JSPs

JSTL Core – General tags

<c:set …> is used to declare variables and assign values to them <c:set var=“name” scope=“application|request|

session” value=“val” /> <c:set var=“name” scope=“application|request|

session”/> <bookshop:shoppingCart />

</c:set>

JSTL Core – General tags

<c:out …> is used to print values <c:out value="${customer.lastName}"/> <c:out value="${customer.lastName}“

scope=”session” /> <c:out value="${customer.phoneHome}"

default="no home phone specified"/>

JSTL Core – Conditional tags

Conditional tags are used for execution control <c:if />

<c:if test="${customer.address.country == 'USA'}"> <c:out value="${customer}"/><br> </c:if

<c:chose /> and <c:when /> - a switch/case structure <c:choose>

<c:when test="${customer.address.country == 'USA'}"> <font color="blue"> </c:when>

<c:when test="${customer.address.country == 'Canada'}"> <font color="red"> </c:when>

<c:otherwise> <font color="green"> </c:otherwise> </c:choose>

JSTL Core – iteration tags

Iteration tags are used to loop over some data structure, often a Collection

<c:forEach var=“current” items=“Collection ” begin=“start” end=“10” /> <c:forEach var="customer" items="${customers}">

<c:out value="${customer}"/><br> </c:forEach> <c:forEach var="i" begin="1" end="10">

<c:out value="${i}"/> • </c:forEach>

JSTL Core – iteration tags

<c:forTokens var=“token” items=“a,b,c” delims=“,”> <c:forTokens var="token" items="bleu,blanc,rouge|

vert,jaune|blanc,rouge" delims="|"> <c:out value="${token}"/> •

</c:forTokens> <c:forTokens var="token" items="bleu,blanc,rouge|

vert,jaune|blanc,rouge" delims="|,"> <c:out value="${token}"/> •

</c:forTokens>

JSTL Core – Import tags

There are several tags for importing information from http and ftp (and more)

<c:import url=“url” var=“resultVar”/> <c:import url=“http://developer.mimer.com” />

Will get the content of the URL and print it Relative path is ok

<c:import url="LocalSample.jsp"/> <c:import url=“ftp://ftp.mimer.se/readme_v.txt/”

var=“result”/> Will get the content and store it in the variable resultVar

JSTL Core – Import tags

The <c:param name=“name” value=“value” /> can be combined with <c:import /> to import content from dynamic sites <c:import url=http://

developer.mimer.se/support/support_faq.tml> <c:param name=“category” value=“3” />

</c:import>

JSTL Core – Working with URLs The <c:url /> and <c:param /> is used

together to construct URLs with proper escaping and rewriting

<c:url value=“base.jsp” /> <c:param name=“name" value=“Fredrik Alund"/>

</c:url> Gives base.jsp?name=Fredrik%20Alund Possibly with jsessionid appended

JSTL XML

JSTL contains several tags for working with XML and XSLT But first an introduction to XML and XSLT

XML

XML is an abbreviation for EXtensible Markup Language

A markup language like HTML Not used to generate layouts but to describe

data No tags are defined in XML, just syntax rules

for tags XML uses a DTD (Document Type Definition)

to formally describe the data

XML

XML tags are case sensitive All XML elements must have a closing tag

<a></a> or <a /> All XML elements must be properly nested

<a><b><c></b></c></a> is not valid All XML documents must have a root/start tag <a></a><b></b> is not valid, but

<root><a></a><b></b></root> is

XML

A XML document is well formed if it conforms to the XML syntax rules

A XML document is valid if it is well formed and conform to the rules of a DTD

XML Example 1

<?xml version="1.0“ encoding=“UTF-8” ?>

<person>

<name>Fredrik</name>

<surname>Ålund</name>

<age>32</age>

</person> The first line tells what version of XML is

used and what encoding to use

XML bigger example

<family><person>

<name>Fredrik</name><surname>Ålund</name><age>32</age>

</person><person>

<name>Annika</name><surname>Ålund</name><age>28</age>

</person><person>

<name>Viktor</name><surname>Ålund</name><age>0,5</age>

</person></family>

XML attributes

XML elements can have attributes<employees>

<employee empid=“1”><name>Fredrik Ålund</name><department depid=“3”>Services</department>

</employee><employee empid=“2”>

<name>Helena Larsson</name><department depid=“3”> Services </department>

</employee>

</employees>

XML CDATA

If the value of an element contain binary data or some other illegal characters, CDATA can be used <element><!CDATA[anytext]]></element>

Why XML?

Describe your data Give you a structure of your data Easier integration of systems The same XML document can be

transformed to HTML, WML or VoiceXML to support different clients

XSL and XSLT

XSL is an abbreviation of eXtensible Stylesheet Language

XSLT means XSL Transformation XSL consists of two parts

A method for transforming XML documents A XML document can be transformed into a HTML

document A method for formatting XML documents

Elements can be sorted and formatted in different ways

XSL files are valid XML documents

A XSL example

A XSL to transform our employee list to html might look like<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <body> <table border="2" bgcolor="yellow"> <tr> <th>Name</th> <th>Department</th> </tr> <xsl:for-each select=“employees/employee"> <tr> <td><xsl:value-of select=“name"/></td> <td><xsl:value-of select=“department"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>

XSL templates

Stylesheets starts with <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

A template matches a part of a XML document and is evaluted <xsl:template match="/"> - matches the root <xsl:template match=“employees"> - matches

employees

XSL <xsl:for-each/>

<xsl:for-each select=“employees/employee"> loops over all employees

<xsl:for-each select=" employees/employee " order-by="+ name"> will order the elements on the name element (+ ascending, - descending)

XSL <xsl:for-each/> and filters Filters can be applied to filter out elements <xsl:for-each

select=“employees/employee[department/@depid = ‘3’“ >

<xsl:for-each select=“employees/employee[department = ‘Services’“ >

Valid filter operations are =  (equal) =! (not equal) &LT& (less than) &GT& (greater than)

XSL <xsl:value-of/>

<xsl:value-of ..> returns the value of an element or attribute

<xsl:value-of select=“name"/> return the value of the name element for the current employee

<xsl:value-of select=“@empid"/> returns the empid attribute of the employee element

XSL IF

The conditional statement if is available in XSL <xsl:if match=".[@empid=‘1']"> </xsl:if>

XSL chose

<xsl:choose>   <xsl:when match=".[@empid=‘3']">      ... some code ...   </xsl:when>   <xsl:otherwise>      ... some code ....   </xsl:otherwise></xsl:choose>

XSL Text

<xsl:text disable-output-escaping=“true/false” /> Used to output text. Useful if the text is not valid

XML since it can be combined with <![CDATA[xxx]]>

<xsl:text disable-output-escaping="yes"> <![CDATA[shop?action=detail&bookid=]]>

</xsl:text>

<xsl:apply-template />

Instead of using for-each, we can use <xsl:apply-templates match=“element”/>

Make <xsl:template match=“xxx” /> for each element

Put <xsl:apply-template where you want the output of the other template

<xsl:element />

In XSL you have to follow XML syntax rules. This makes it hard to construct HTML form elements and HREFs. <xsl:element > can be used to ease this

A HREF link in XSL<xsl:element name="input">

<xsl:attribute name="href"><xsl:text disable-output-escaping="yes">

<![CDATA[ shop?action=detail&bookid=  ]]> </xsl:text><xsl:value-of select="id" />

</xsl:attribute><xsl:text>Detail</xsl:text>

</xsl:element>

<xsl:element>

A HTML Form text input field

<xsl:element name="input"><xsl:attribute name="size">2</xsl:attribute>

 <xsl:attribute name="type">text</xsl:attribute>

 <xsl:attribute name="value">1</xsl:attribute>

 <xsl:attribute name="name">

quantity

</xsl:attribute>

</xsl:element>

The same XSL with apply-template <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="employees"> <html> <body> <table border="2" bgcolor="yellow"> <tr> <th>Id</th><th>Name</th> <th>Department</th> </tr> <xsl:apply-templates /> </table> </body> </html> </xsl:template>

<xsl:template match="employee"> <tr> <td><xsl:value-of select="@empid"/></td> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="department"/></td> </tr> </xsl:template> </xsl:stylesheet>

JSTL and XML, resumed

JSTL has support for navigating XML with XPath and to do XSLT processing

<%@ taglib prefix="x" uri="http://java.sun.com/jstl/xml" %> is used to specify that the XML part is to be used

JSTL XML - parsing

A XML structure can be parsed into a XML document that can be navigated

<x:parse var="a"> <a> <b> <c> foo </c> </b> <d> bar </d> </a> </x:parse>

<x:out select="$a/a/d"/> The XML is parsed into variable a The value of the element d is selected

JSTL XSL Transformation

<c:set var="xml"> <a><b>header!</b></a>

</c:set> <c:set var="xsl">

<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

version="1.0"> <xsl:template match="text()"> <h1><xsl:value-of select="."/></h1> </xsl:template> </xsl:stylesheet>

</c:set><x:transform xml="${xml}" xslt="${xsl}"/>

JSTL XSL Transformation combined with JSTL Core and Custom Tags Combine the Core import with XSLT to read

the XSL file from disk Get XML output from a Custom tag (or Java

Bean) Do XSL Transformation

JSTL XSL Transformation combined with JSTL Core and Custom Tags<c:set var="booklist_xslt">

<c:import url="booklist_xslt.xsl"/>

</c:set>

<x:transform xslt="${booklist_xslt}">

<jsp:getProperty name="bookList" property="xml"/>

</x:transform>