Facelets code completion in Eclipse Ganymede
By: Ron Thijssen, 23 October 2008Onlangs hebben Jan-Kees en ik de J-Tech JSF cursus flink op de schop genomen. We hebben de keuze gemaakt om JSP er definitief uit te bonjouren, en daarvoor in de plaats de Facelets te gebruiken. Facelets biedt enorm veel mogelijkheden, en is de facto standaard voor een JSF project. Het maakt het leven van een JSF ontwikkelaar op een flink aantal gebieden een stuk aangenamer.
Vorige week, tijdens de 1e dag van de JSF cursus, liepen we echter tegen het grootste struikelblok van Facelets aan, namelijk: Support in diverse IDE’s. Facelets vervangt de traditionele *.jsp files in op XML gebaseerde *.xhtml files. Deze worden standaard niet ondersteund door bijvoorbeeld Eclispe, dat wil zeggen; Geen tag completion of validatie van de gebruikte tags uit de namespaces. Hierdoor kan het voorkomen dat je nogal snel een typvoudt maakt die je pas tijdens het draaien van de applicatie tegenkomt. Ik had in een grijs verleden iets gelezen over het gebruiken van .jspx files ipv .xhtml. Tijd om eens uit te zoeken wat de opties zijn.
Iedereen heeft wel eens een JSP pagina gemaakt. Het is ook mogelijk om JSPs in een XML vorm te gieten. De JSP editor biedt vervolgens codecompletion voor jsp tags. Dit biedt potentieel voor het gebruik van Facelets. Hieronder zie je een JSPX voorbeeld. Merk op dat voor de xml version en de doctype er losse jsp:text tags nodig zijn. Beetje jammer.
<?xml version="1.0" encoding="ISO-8859-1" ?> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" version="2.0"> <jsp:text> <![CDATA[ <?xml version="1.0" encoding="windows-1252" ?> ]]> </jsp:text> <jsp:text> <![CDATA[ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ]]> </jsp:text> <ui:composition> <ui:repeat value="#{bean.list}" var=”item”> #{item.naam} </ui:repeat> </ui:composition> </jsp:root>
Om validatie toe te kunnen passen op dit document heeft de validator een Tag Library Descriptor (TLD) nodig. JSF levert voor de HTML en CORE taglib standaard TLD files mee. Deze zitten in de JAR files. Om code completion te krijgen op de Facelets tags moet je hier een extra TLD voor toevoegen aan het project. Deze TLD is HIER te vinden. Plaats deze TLD in de WEB-INF folder op een willekeurige plaats (of in een jar in de META-INF/ folder)
Voor een nieuw project is de JSPX notatie eventueel een optie, echter indien je 100 bestaande pages om moet zetten is dit geen doen. Er is gelukkig ook een andere manier. Een manier waarop je de bestaande .xhtml files kan blijven gebruiken zonder hier inhoudelijk aanpassingen op te moeten doen. Dit doen we door de editor van wat extra informatie voorzien over de te gebruiken files. Standaard wordt .xhtml niet geassocieerd met JSP. Hoe doen we dit?
Ga naar preferences en stel het volgende in.
- General -> Content Types
- Zoek daar JSP op en voeg daar een file extension aan toe: *.xhtml
- General -> Editros -> File Associations
- Zoek daar *.xhtml op en selecteerd JSP Editor als de default editor.
Vanaf nu worden je xhtml files geopend in de JSP Editor. En vanaf nu heb je code completion voor je JSF en facelets tags zoals in het screenshotje hieronder te zien is. Ik heb dit helaas alleen werkend gekregen met Eclipse Ganymede. Eclipse europe lijkt niet mee te willen werken op mijn laptop.

Door bovenstaande oplossing te gebruiken wordt je iig geholpen bij de vorm van je document. Erg prettig wanneer je anders eerst 5 minuten moet wachten voordat je een fout kan constateren. Er kleven echter wel een aantal nadelen aan deze oplossing. Zie hier een korte opsomming:
- Nog steeds geen support voor Expression Language.
- De JSP editor verliest zijn support voor HTML code completion
- Iedere custom tag library heeft zijn eigen TLD nodig.

23 October 2008 om 1:23 pm
Tja, nadelen. Het zijn kleine beperkingen, maar ten opzichte van geen enkele IDE support zou ik het geen nadelen durven noemen.
Ik verwacht als je gewoon netjes html als root element gebruikt in elke Facelet, dat de HTML code completion ook gewoon werkt.
En over de TLD’s, iedere zelf respecterende library (iig de open source en commerciele libs) levert een TLD mee. Het enige probleem zijn zelfbouw libraries, maar goed, iedereen kent zijn eigen library mag ik hopen.
Wat mij betreft is het al een flinke verbetering.
24 October 2008 om 7:51 pm
Zucht.
http://www.jetbrains.com/idea/features/javaserver_faces.html
25 October 2008 om 12:25 pm
Jboss tools voor Eclipse, Facelets support, voila.
25 October 2008 om 7:48 pm
Moet je zeker apart installeren, of niet? Zit niet standaard in de 162 MB download, of wel?
(Je weet het, ik probeer altijd het laatste woord te hebben!)
26 October 2008 om 12:41 pm
@stephan: Ik vind JBoss Tools eigenlijk maar een bagger plugin. Traag, instabiel, memory leaks en nog meer van die “negatieve eigenschappen”.
Vooral de jBPM designer en de Facelets editor ben ik niet van gecharmeerd…
Typisch JBoss product, veel aandacht voor nieuwe features, maar weinig voor bugfixing en kwaliteit.
@Vincent: Ik zie op die site niets over Facelets.
26 October 2008 om 1:31 pm
Dat klopt. Dat is namelijk zo voor de hand liggend dat het de moeite van het vermelden niet waard is…
http://wiki.apache.org/myfaces/Facelets_Support_within_IDEs
27 October 2008 om 1:02 pm
Ik heb JBoss Tools geprobeerd in een vorige versie, maar was er niet over te spreken. JBoss Tools is btw nog niet GA voor Eclipse Ganymede vanwege de nieuwe WTP versie die gebruikt wordt.
Ik weiger te betalen voor een IDE
, dus voorlopig zal ik het met Eclipse moeten doen.
29 October 2008 om 7:29 am
btw, je moet niet die hele JBoss Tools meuk installen, alleen de RichFaces VPE stuffies + JBoss core…. dan werkt het wel allemaal ok.
Btw, je moet gewoon geen JSF gebruiken, heb je die Facelets support ook niet nodig
29 October 2008 om 10:22 pm
Stephan, ga jij maar lekker terug naar Spring Web. Terug naar de steentijd.
4 November 2008 om 11:03 am
En dan is er altijd nog NetBeans dat ook al een redelijke tijd facelets support heeft. En sowieso heeft NetBeans al standaard veel ondersteuning voor JSF, maar ook voor andere frameworks zoals Spring/Web.
8 November 2008 om 12:15 pm
Volgens mij heeft NetBeans stiekem Eclipse gepasseerd als goede IDE. Ik hoor de laatste tijd vrijwel alleen nog maar goede verhalen over NetBeans (en slechte over Eclipse).
Slechte verhalen waar ik me bij aansluit. Instabiel, per nieuwe release wordt het trager, waardeloze Maven support (hopelijk wordt het met IAM beter).