<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Information Centre &#187; Web</title>
	<atom:link href="http://my.center-of.info/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://my.center-of.info</link>
	<description>“Wenn etwas schon da war, wie kann man es dann patentieren?” D.E.Knuth, 2002</description>
	<lastBuildDate>Mon, 28 Sep 2009 23:04:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Tutorial: JSF 2.0 Beispielanwendung</title>
		<link>http://my.center-of.info/2009/08/27/tutorial-jsf2-beipielanwendung/</link>
		<comments>http://my.center-of.info/2009/08/27/tutorial-jsf2-beipielanwendung/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 22:22:39 +0000</pubDate>
		<dc:creator>Haf</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[jsf2]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://my.center-of.info/?p=138</guid>
		<description><![CDATA[Wie schon erwähnt, erscheinen bald die ersten Releases von JSF 2.0.
Entsprechend wird nun eine kleine Beispielanwendung erstellt, um einen ersten Eindruck zu bekommen.
Technologie:

JSF 2.0: Mojarra in Version 2.0.0-b16
Tomcat 6
Maven
Eclipse


Voraussetzung:

JDK 6
Tomcat 6
Eclipse inklusive WTP, Maven (m2eclipse)
Beim m2eclipse-Plugin &#8220;Maven integration for WTP&#8221; in Eclipse nachinstallieren, falls nicht vorhanden

Vorbereitung:

In Eclipse ein dynamische Webprojekt erstellen
Tomcat 6 als Server in [...]]]></description>
			<content:encoded><![CDATA[<p>Wie schon <a href="http://my.center-of.info/2009/08/26/jsf2overview/" title="IC: JSF 2 Überblick">erwähnt</a>, erscheinen bald die ersten Releases von JSF 2.0.<br />
Entsprechend wird nun eine kleine Beispielanwendung erstellt, um einen ersten Eindruck zu bekommen.<br />
Technologie:</p>
<ul>
<li>JSF 2.0: Mojarra in Version 2.0.0-b16</li>
<li>Tomcat 6</li>
<li>Maven</li>
<li>Eclipse</li>
</ul>
<p><span id="more-138"></span><br />
<strong>Voraussetzung:</strong></p>
<ul>
<li><a href="http://java.sun.com/javase/downloads/index.jsp" target="_blank" title="SUN: Java Download">JDK 6</a></li>
<li><a href="http://tomcat.apache.org/download-60.cgi" target="_blank" title="Apache Tomcat 6 Download">Tomcat 6</a></li>
<li><a href="http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/galileor" target="_blank" title="Eclipse Download: Galileor">Eclipse inklusive WTP</a>, Maven (<a href="http://m2eclipse.sonatype.org/" target="_blank" title="Sonatype: Maven Eclipse Plugin">m2eclipse</a>)</li>
<li>Beim m2eclipse-Plugin &#8220;<strong>Maven integration for WTP</strong>&#8221; in Eclipse nachinstallieren, falls nicht vorhanden</li>
</ul>
<p><strong>Vorbereitung:</strong></p>
<ol>
<li>In Eclipse ein dynamische Webprojekt erstellen</li>
<li>Tomcat 6 als Server in Eclipse einrichten</li>
<li>Dem Projekt &#8220;Maven Nature&#8221; hinzufügen. Zur Zeit ist das Projekt ein reines Webprojekt ohne Maven Eigenschaften. Durch Rechte-Maustaste auf das Projekt und dann <em>Maven > Enable Dependency Management</em> wird Maven-Funktionalität für das Projekt hinzugefügt</li>
<li>Maven erwartet eine andere Ordner-Struktur als in dem WTP-Webprojekt. Als erstes muss der Source-Ordner angepasst werden. Hierfür müssen mind. folgender Ordner erstellt werden: src/main/java. Diesen muss man in Eclipse dann auch als Source-Ordner konfigurieren (Java Build Path)</li>
<li>Der WebContent-Ordner wird von Maven mit der WTP-Integration genutzt. Hier ist keine Veränderung/Anpassung notwendig</li>
<li>Die existierende pom.xml muss entsprechende Einträge erweitert werden. Für JSF 2 könnte das wie folgt aussehen:
<pre class="brush: xml">
&lt;project xmlns=&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&amp;quot;&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;jsf2test&lt;/groupId&gt;
  &lt;artifactId&gt;jsf2test&lt;/artifactId&gt;
  &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;

  &lt;properties&gt;
  	&lt;version.jsf2&gt;2.0.0-b16&lt;/version.jsf2&gt;
  	&lt;version.junit&gt;4.4&lt;/version.junit&gt;
  	&lt;version.jstl&gt;1.2&lt;/version.jstl&gt;
  	&lt;version.servlet&gt;2.5&lt;/version.servlet&gt;
  	&lt;version.log4j&gt;1.2.14&lt;/version.log4j&gt;
  &lt;/properties&gt;

  &lt;repositories&gt;
  	&lt;repository&gt;
		&lt;id&gt;maven2-repository.dev.java.net&lt;/id&gt;
		&lt;name&gt;Java.net Repository for Maven&lt;/name&gt;
		&lt;url&gt;http://download.java.net/maven/2/&lt;/url&gt;
		&lt;layout&gt;default&lt;/layout&gt;
	&lt;/repository&gt;
  &lt;/repositories&gt;

  &lt;build&gt;
    &lt;finalName&gt;jsf2test&lt;/finalName&gt;
    &lt;plugins&gt;
	    &lt;plugin&gt;
			&lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
			&lt;configuration&gt;
			&lt;source&gt;1.5&lt;/source&gt;
			&lt;target&gt;1.5&lt;/target&gt;
			&lt;/configuration&gt;
		&lt;/plugin&gt;

	    &lt;plugin&gt;
		  &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
		  &lt;!-- jetty 7
		  &lt;artifactId&gt;jetty-maven-plugin&lt;/artifactId&gt;
		   --&gt;
		  &lt;artifactId&gt;maven-jetty-plugin&lt;/artifactId&gt;
		  &lt;version&gt;6.1.15&lt;/version&gt;
		  &lt;!--
		  &lt;configuration&gt;
		    &lt;scanIntervalSeconds&gt;10&lt;/scanIntervalSeconds&gt;
		  &lt;/configuration&gt;
		   --&gt;
		&lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;

   &lt;dependencies&gt;
   	&lt;!-- JSF2 --&gt;
	&lt;dependency&gt;
		&lt;groupId&gt;com.sun.faces&lt;/groupId&gt;
		&lt;artifactId&gt;jsf-api&lt;/artifactId&gt;
		&lt;version&gt;${version.jsf2}&lt;/version&gt;
	&lt;/dependency&gt;

	&lt;dependency&gt;
		&lt;groupId&gt;com.sun.faces&lt;/groupId&gt;
		&lt;artifactId&gt;jsf-impl&lt;/artifactId&gt;
		&lt;version&gt;${version.jsf2}&lt;/version&gt;
	&lt;/dependency&gt;

	&lt;dependency&gt;
      &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
      &lt;artifactId&gt;jstl&lt;/artifactId&gt;
      &lt;version&gt;${version.jstl}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
      &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
      &lt;artifactId&gt;servlet-api&lt;/artifactId&gt;
      &lt;version&gt;${version.servlet}&lt;/version&gt;
    &lt;/dependency&gt;

	&lt;!-- Misc --&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;junit&lt;/groupId&gt;
      &lt;artifactId&gt;junit&lt;/artifactId&gt;
      &lt;version&gt;${version.junit}&lt;/version&gt;
      &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
	    &lt;groupId&gt;log4j&lt;/groupId&gt;
	    &lt;artifactId&gt;log4j&lt;/artifactId&gt;
	    &lt;version&gt;${version.log4j}&lt;/version&gt;
	&lt;/dependency&gt;

  &lt;/dependencies&gt;
&lt;/project&gt;
</pre>
</li>
<li>Die Bibliotheken, welche Maven bereitstellt, müssen beim Deploy in WEB/lib kopiert werden. Die Nutzung der Maven Dependencies geschieht durch folgende Einstellung: In den Eigenschaften des Projekts muss unter <strong>Java EE Module Dependencies</strong> die <strong>Maven Dependencies</strong> ausgewählt werden.</li>
<li>Web.xml für JSF anpassen. Z.B. wie folgt:
<pre class="brush: xml">
&lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&gt;
&lt;web-app xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/javaee&amp;quot; xmlns:web=&amp;quot;http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&amp;quot; xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&amp;quot; id=&amp;quot;WebApp_ID&amp;quot; version=&amp;quot;2.5&amp;quot;&gt;
  &lt;display-name&gt;dynWebTest&lt;/display-name&gt;

  &lt;servlet&gt;
    &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
    &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
  &lt;/servlet&gt;

  &lt;servlet-mapping&gt;
    &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
    &lt;url-pattern&gt;*.xhtml&lt;/url-pattern&gt;
  &lt;/servlet-mapping&gt;

  &lt;!-- This parameter is also possible to set over JNDI --&gt;
  &lt;context-param&gt;
    &lt;param-name&gt;javax.faces.PROJECT_STAGE&lt;/param-name&gt;
    &lt;param-value&gt;Development&lt;/param-value&gt;
  &lt;/context-param&gt;

  &lt;welcome-file-list&gt;
    &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;
    &lt;welcome-file&gt;index.xhtml&lt;/welcome-file&gt;
  &lt;/welcome-file-list&gt;
&lt;/web-app&gt;
</pre>
</li>
</ol>
<p>Nun steht das Grundgerüst bereit, um endlich mit JSF 2.0 anzufangen.<br />
Für diejenigen, die mit JSF 1.x schon gearbeitet haben, werden wohl die faces-config.xml vermissen. Korrekt. Ist gewollt. Ist nämlich die erste Verbesserung von JSF 2.0! Die faces-config.xml kann immer noch verwendet werden, aber vieles ist durch Annotations möglich und die Navigation ist einfacher/verständlicher geworden. Später mehr dazu.</p>
<p>Vielleicht noch ein paar Worte zur Beispielanwendung: Die Beispielanwendung beinhaltet eine Seite, mit einem Input-Feld und zwei Select-Boxen. Man stelle sich folgendes Szenario vor: Man möchte ein Registrierungs-Formular erstellen, in dem der Nutzer überprüfen kann, ob der Username noch vorhanden ist. Zusätzlich soll er das Land auswählen können, in dem er lebt.</p>
<p><strong> Controller:</strong><br />
Der Controller ist das ManagedBean, welches in den XHTML-Seiten verwendet wird und alle Anfragen verarbeitet.</p>
<pre class="brush: java">
@ManagedBean(name = &amp;quot;fc&amp;quot;)
@RequestScoped
public class FrontController {

	private Person person;

	private String country;

	private String continent;

	private Map&lt;String, String[]&gt; countries;

	@ManagedProperty(value = &amp;quot;#{authService}&amp;quot;)
	private AuthService authService;

	public void isUsernameValid() {

		if(authService.isUsernameValid(person.getUsername())) {

			output = &amp;quot;Username ist nocht nicht vorhanden&amp;quot;;
		} else {
			output = &amp;quot;Username ist schon vorhanden. Bitte einen anderen auswählen&amp;quot;;
		}
	}

        public String[] getCountries() {
		// deliver the countries to the actual continent
		return countries.get(continent);
	}
       /* further get/set-Methods */
}
</pre>
<p>Durch die Annotations wird JSF mitgeteilt, dass es sich bei der Klasse um ein managed bean mit dem Namen <strong>fc</strong> handelt (@ManagedBean) und die jeweils immer nur für ein Request gültig ist (@RequestScoped, <a href="https://javaserverfaces.dev.java.net/nonav/docs/2.0/managed-bean-javadocs/" target="_blank" title="API 2.0 - Managed Bean">weitere Scops sind vorhanden</a>). Früher hat man diese Einstellungen in faces-config.xml durchgeführt.<br />
Neu ist auch @ManagedProperty. Mittels dieser Annotation wird die Dependency Injection Funktionalität von JSF 2.0 verwendet. In FrontController#authService wird nun das passende Objekt mit dem managed bean namen &#8220;authService&#8221; injiziert.<br />
Hier sei anzumerken, dass JSF kein field access durchführt, sondern die getter/setter-Methoden verwendet um Properties zu setzen.</p>
<p>Die Domain-Klasse Person ist ein einfaches Bean bzw. POJO, und repräsentiert die einzugebenden Daten in dem Formular.</p>
<p>Zu dem Controller und Model Teil gehört noch die Präsentation und diese wird mittels <a href="https://facelets.dev.java.net/" target="_blank" title="Facelets">Facelets</a> durchgeführt. In JSF 2.0 ist Facelets die primäre Technologie zur <a href="https://javaserverfaces.dev.java.net/nonav/docs/2.0/javadocs/javax/faces/view/ViewDeclarationLanguage.html" target="_blank" title="ViewDeclarationLanguage API">Beschreibung des Views</a>. Man kann natürlich JSP nutzen, wenn man den Sprung nicht durchführen möchte. Aber die Vorteile liegen eher bei Facelets!</p>
<pre class="brush: xml">
&lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;
        &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&gt;

&lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;
      xmlns:ui=&amp;quot;http://java.sun.com/jsf/facelets&amp;quot;
      xmlns:f=&amp;quot;http://java.sun.com/jsf/core&amp;quot;
      xmlns:h=&amp;quot;http://java.sun.com/jsf/html&amp;quot;&gt;

&lt;h:head&gt;
  &lt;title&gt;JSF Demo&lt;/title&gt;
&lt;/h:head&gt;
&lt;h:body&gt;
  &lt;h1&gt;Register&lt;/h1&gt;
  &lt;h:form&gt;

    &lt;h:inputText id=&amp;quot;name&amp;quot; value=&amp;quot;#{fc.person.username}&amp;quot;&gt;
    &lt;/h:inputText&gt;
    &lt;h:commandButton value=&amp;quot;Check username&amp;quot; action=&amp;quot;#{fc.isUsernameValid}&amp;quot;&gt;
    	&lt;f:ajax execute=&amp;quot;name&amp;quot; render=&amp;quot;outIsUserValid&amp;quot; /&gt;
    &lt;/h:commandButton&gt;
    &lt;h:outputText id=&amp;quot;outIsUserValid&amp;quot; value=&amp;quot;#{fc.output}&amp;quot; /&gt;
  &lt;/h:form&gt;
  &lt;br /&gt;

  &lt;h:form&gt;
                &lt;!-- First select box to select the continent.... --&gt;
  		&lt;h:selectOneMenu value=&amp;quot;#{fc.continent}&amp;quot;&gt;
  			&lt;f:selectItems value=&amp;quot;#{fc.continents}&amp;quot; /&gt;
  			&lt;f:ajax render=&amp;quot;countrylist&amp;quot; /&gt;
  		&lt;/h:selectOneMenu&gt;

                &lt;!-- ...and depending of the selected continent, contains this
                      second select box the countries
                --&gt;
  		&lt;h:selectOneMenu value=&amp;quot;#{fc.country}&amp;quot; id=&amp;quot;countrylist&amp;quot;&gt;
  			&lt;f:selectItems value=&amp;quot;#{fc.countries}&amp;quot; /&gt;
  		&lt;/h:selectOneMenu&gt;
  &lt;/h:form&gt;
&lt;/h:body&gt;
&lt;/html&gt;
</pre>
<p>Mittels Facelets ist die Beschreibung der Views reiner XML/XHTML.<br />
In dem ersten Formular ist das Input-Feld, in dem der Nutzer überprüfen kann, ob sein Username schon vergeben ist. Die Überprüfung wird mittels Ajax durchgeführt. Hierfür ist der neue <a href="https://javaserverfaces.dev.java.net/nonav/docs/2.0/pdldocs/facelets/f/ajax.html" target="_blank" title="JSF2 API: Ajax Tag">&lt;f:ajax&gt;-Tag</a> zuständig. Beim betätigen des Buttons wird ein Ajax-Request verschickt, dieser beinhaltet die Werte aus den Felder in dem <em>execute</em>-Attribute. In unserem Fall aus dem Feld mit der ID <em>name</em>. Die Antwort wird, wie in dem <em>render</em>-Attribute definiert, in ID <em>outIsUserValid</em> eingefügt. Auf dem Server wird zur Verarbeitung die Methode FrontController.isUsernameValid() aufgerufen. Während des Aufrus ist FrontController#person mit den aktuellen Werten (hier: username) gesetzt.</p>
<p>In dem zweiten Formular gibt es zwei Select-Boxen. In dem einen kann ein Kontinent ausgewählt werden. Resultierend dazu, wird in der zweiten eine Liste von Ländern angezeigt. Diese Länder-Liste wird durch Ajax ermittelt.<br />
In der ersten Liste ist wieder ein &lt;f:ajax&gt;-Tag zu finden. Bei dem 1. Beispiel wurde der Request verschickt, wenn der Nutzer den Button drückt. D.h. in der Javascript-Welt, beim Click-Event, wird der Request verschickt. Das &lt;f:ajax&gt;-Tag wählt immer das passende Event aus, abhängig von der Komponente, in dem es verwendet wird.<br />
Bei Listen horcht es auf ein OnChange-Event. Natürlich kann man ein anderes Event festlegen, dafür gibt es das <em>event</em>-Attribut.<br />
D.h. also, sobald in der ersten Liste die Auswahl verändert wird, wird die zweite Liste aktualisiert (durch render=&#8221;countrylist&#8221;). Auf dem Server wird FrontController.getCountries() aufgerufen. In dem Kontext ist FrontController#continent belegt, da der Nutzer eine Auswahl in der 1.Liste durchgeführt hat. FrontController.getCountries() liefert nun nur ein Array von Ländern zurück. Die korrekte Verschachtelung in HTML-Elemente (option-Tag) übernimmt JSF!</p>
<p><strong>Fazit:</strong></p>
<ul>
<li>Mittels JSF 2.0 hat man weniger Konfigurationsaufwand</li>
<li>Durch den Einsatz von Facelets macht das Erstellen der HTML-Seiten wieder Spass. Hier kann man die vorhandenen HTML-Templates fast unverändert übernehmen&#8230;</li>
<li>Unproblematischer Javascript/Ajax-Einsatz, ohne es wirklich zu merken!</li>
<li>DI ohne Spring!</li>
</ul>
<p>Also der erste Eindruck hat überzeugt. Wenn man JSF-Fan war, wird man JSF-Fan weiter bleiben. Wenn nicht, könnte man es jetzt bestimmt werden <img src='http://my.center-of.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://my.center-of.info/2009/08/27/tutorial-jsf2-beipielanwendung/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Spec 2.0: JSF 2 Überblick</title>
		<link>http://my.center-of.info/2009/08/26/jsf2overview/</link>
		<comments>http://my.center-of.info/2009/08/26/jsf2overview/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 20:52:45 +0000</pubDate>
		<dc:creator>Haf</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[jsf2]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://my.center-of.info/?p=135</guid>
		<description><![CDATA[JSF ist ja nicht jedermanns Sache. Ich fand JSF 1.x auch mit den &#8220;Problemen&#8221; toll. Die Implementierung (Mojarra und MyFaces) hatten so manche Fehler und zusätzliche Funktionalitäten, welche in der Spec nicht definiert wurden. Aber im Großen und Ganzen ein gutes und solides Konzept.
Leider jedoch ein Framework, was ein paar Jährchen und Trends hinter sich [...]]]></description>
			<content:encoded><![CDATA[<p>JSF ist ja nicht jedermanns Sache. Ich fand JSF 1.x auch mit den &#8220;Problemen&#8221; toll. Die Implementierung (<a href="https://javaserverfaces.dev.java.net/" target="_blank" title="Mojarra: JSF SUN RI">Mojarra</a> und <a href="http://myfaces.apache.org/" target="_blank" title="MyFaces Project">MyFaces</a>) hatten so manche Fehler und zusätzliche Funktionalitäten, welche in der Spec nicht definiert wurden. Aber im Großen und Ganzen ein gutes und solides Konzept.<br />
Leider jedoch ein Framework, was ein paar Jährchen und Trends hinter sich hat &#8211; JSF 1.1 (<a href="http://www.jcp.org/en/jsr/detail?id=127" target="_blank" title="JSR 127:JavaServer Faces">JSR 127</a>, 03.2001) und JSF 1.2 (<a href="http://www.jcp.org/en/jsr/detail?id=252" target="_blank" title="JSR 252:JavaServer Faces">JSR 252</a>, 05.2006). Seit 07.2009 gibt es nun das Final Release der JSF 2.0 Spezifikation (<a href="http://www.jcp.org/en/jsr/detail?id=314" target="_blank" title="JSR 314:JavaServer Faces">JSR 314</a>).<br />
<span id="more-135"></span><br />
Die <a href="https://javaserverfaces.dev.java.net/servlets/ProjectDocumentList?folderID=11662" target="_blank" title="Mojarra: 2.0.0-RC">RI von SUN</a> steht auch bald bereit und auch die Truppe um MyFaces hat einen <a href="http://matthiaswessendorf.wordpress.com/2008/08/29/myfaces-goes-jsf-20/" target="_blank" title="Matthias Wessendorf's Weblog: MyFaces goes JSF 2.0">JSF 2.0 Branch</a> erstellt. Spätestens jetzt sollte man einen Blick auf die Neuerungen und Verbesserungen, die mit 2.0 eingeführt werden, werfen.<br />
Möchte man sich nun mit JSF 2.0 auseinander setzen, könnte man sich die ersten Bücher besorgen, aber ob diese aktuell und praxistauglich sind, sei jedem überlassen.<br />
Die vielleicht komplette und aktuelle Information kriegt man zur Zeit, wenn man sich direkt die APIs anschaut und verschiedene Blogs verfolgt.<br />
Hier folgt erstmal eine unvollständige Liste von Informationsquellen (wird aktualisiert):</p>
<ul>
<li><a href="http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/" target="_blank" title="Andy Schwartz’s Weblog: What’s New in JSF 2?">Andy Schwartz Blogeintrag</a> Andy hat selbst eine Auflistung inklusive weitere Erklärung aufgeführt</li>
<li><a href="https://javaserverfaces.dev.java.net/users.html" target="_blank" title="Mojarra: Get Started">Mojarra: Get started</a></li>
<li><a href="https://javaserverfaces.dev.java.net/nonav/rlnotes/2.0.0/index.html" target="_blank" title="Mojarra 2.0.0 RC Release Notes Overview">Mojarra 2.0.0 Release Notes</a>: Mit den Verweisen zu den aktuellen APIs, TLDs etc</li>
</ul>
<p>Zu dieser Auflistung, die aktualisiert wird, folgen in dem Blog ein paar Beispiele zu speziellen Themen.</p>
<p>P.S.: In dem Block &#8220;Spec 2.0&#8243; folgen demnächst Beiträge zu Spezifikationen, Frameworks die nun in Version 2.0 erschienen sind.</p>
]]></content:encoded>
			<wfw:commentRss>http://my.center-of.info/2009/08/26/jsf2overview/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WebSphere + JSF 1.2 + Facelets</title>
		<link>http://my.center-of.info/2009/01/28/websphere-jsf12-facelets/</link>
		<comments>http://my.center-of.info/2009/01/28/websphere-jsf12-facelets/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 21:33:06 +0000</pubDate>
		<dc:creator>Haf</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[facelets]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[websphere]]></category>

		<guid isPermaLink="false">http://my.center-of.info/?p=113</guid>
		<description><![CDATA[Möchte man ein JSF Projekt unter IBM WebSphere Application Server 6.x nutzen, muss man ein paar Sachen bedenken:
Wie man bei [1] sehen kann, unterstüzt WebSphere 6.1 Servlet 2.4 und JSP 2.0 &#8211; das entspricht etwa einem Tomcat 5.5.x [2]. Möchte man nun JSF 1.2 (mittels MyFaces 1.2.x) nutzen hat man da ein kleines Problem.
JSF 1.2 [...]]]></description>
			<content:encoded><![CDATA[<p>Möchte man ein JSF Projekt unter IBM WebSphere Application Server 6.x nutzen, muss man ein paar Sachen bedenken:</p>
<p><span id="more-113"></span>Wie man bei [1] sehen kann, unterstüzt WebSphere 6.1 Servlet 2.4 und JSP 2.0 &#8211; das entspricht etwa einem Tomcat 5.5.x [2]. Möchte man nun JSF 1.2 (mittels MyFaces 1.2.x) nutzen hat man da ein kleines Problem.<br />
JSF 1.2 benötigt nämlich Servlet 2.5, JSP 2.1 und Java 5 oder später. Genau das kann WebSphere 6.1 mit seiner integrierten JSF 1.1 Implementierung nicht bieten.</p>
<p>Erst bei WebSphere Application Server 7 werden die gewünschten Versionen unterstützt. Wenn man jetzt nicht auf Version 7 umsteigen will/kann, und nicht unzählige Bibliotheken in WebSphere 6 ersetzen will, kann man es sich &#8220;einfach&#8221; machen und auf JSP verzichten. Das geht. Und zwar mit JSF und Facelets [4] als View-Technologie. D.h. es ist kein JSP mehr notwendig und WebSphere kann irgendeine Version anbieten.</p>
<p>Ich werde jetzt hier nicht Facelets beschreiben, das ich mach vielleicht mal später. Speziell geht es hier gerade um die Nutzung von JSF 1.2 mit Facelets in WebSphere Application Server 6.x.</p>
<p>Dazu muss in dem WEB-INF/lib-Ordner alle benötigten Bibliotheken aufgeführt werden. Das sind mindestens diese:</p>
<ul>
<li>commons-beanutils-1.7.0.jar</li>
<li>commons-codec-1.3.jar</li>
<li>commons-collections-3.2.jar</li>
<li>commons-digester-1.8.jar</li>
<li>commons-discovery-0.4.jar</li>
<li>el-api-1.0.jar</li>
<li>el-impl-1.0.jar</li>
<li>jsf-facelets-1.1.11.jar</li>
<li>jstl-1.2.jar</li>
<li>myfaces-api-1.2.5.jar</li>
<li>myfaces-impl-1.2.5.jar</li>
<li>myfaces-shared-impl-3.0.5.jar</li>
</ul>
<p>Wie man vielleicht bemerkt hat, commons-logging.jar ist nicht dabei. Denn diese existiert schon in WebSphere App Server und sollte rausgenommen werden. Weiter sind die el-*.jars auch drin. Die hat WebSphere gar nicht und werden von Facelets benötigt.</p>
<p>Nachdem man nun das WAR-Archiv in WebSphere Application Server deployed hat, muss man noch die Reihenfolge des Classloaders ändern, damit zuerst die eigenen Bibliotheken genutzt werden und nicht z.B. JSF 1.1 von WebSphere. Das wählt man in &#8220;Modul verwalten&#8221;, wenn man das Web-Modul ausgewählt hat aus, und selektiert in der Select-Box den Eintrag, damit der Classloader der Anwendung zuerst gewählt wird (intern auch als &#8220;PARENT_LAST&#8221; bekannt).</p>
<p>Nun kann die Anwendung gestartet werden und sollte ohne Probleme laufen. Im Endeffekt einfach. Wenn man weiß wie! <img src='http://my.center-of.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Links:<br />
[1] <a title="IBM WebSphere: Supported Specs and APIs" href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/rovr_specs.html" target="_blank">WebSphere supported Specifications and API</a><br />
[2] <a title="Apache Tomcat" href="http://tomcat.apache.org" target="_blank">Tomcat</a><br />
[3] <a title="Apache MyFaces" href="http://myfaces.apache.org/" target="_blank">MyFaces</a><br />
[4] <a title="SUN Facelets" href="https://facelets.dev.java.net/" target="_blank">Facelets</a></p>
]]></content:encoded>
			<wfw:commentRss>http://my.center-of.info/2009/01/28/websphere-jsf12-facelets/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IE: Change Event und Autocompletion</title>
		<link>http://my.center-of.info/2009/01/17/ie-change-event-und-autocompletion/</link>
		<comments>http://my.center-of.info/2009/01/17/ie-change-event-und-autocompletion/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 12:07:06 +0000</pubDate>
		<dc:creator>Haf</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://my.center-of.info/?p=105</guid>
		<description><![CDATA[Im IE (7) gibt es Probleme mit dem Change-Event bei einem Input-Feld, wenn dies auch Autocompletion von script.aculo.us[1] beinhaltet.

Wird ein Input-Feld bezüglich den Veränderungen beobachtet ($('field').observe('change', ...')) wird beim IE dieser Event dann gefeuert, wenn der Focus das Feld verlässt.
Hat das Input-Feld nun auch Autocompletion, wird dieser Event nicht mehr gefeuert, wenn, der Nutzer mit [...]]]></description>
			<content:encoded><![CDATA[<p>Im IE (7) gibt es Probleme mit dem Change-Event bei einem Input-Feld, wenn dies auch Autocompletion von script.aculo.us[1] beinhaltet.</p>
<p><span id="more-105"></span></p>
<p>Wird ein Input-Feld bezüglich den Veränderungen beobachtet (<code>$('field').observe('change', ...')</code>) wird beim IE dieser Event dann gefeuert, wenn der Focus das Feld verlässt.</p>
<p>Hat das Input-Feld nun auch Autocompletion, wird dieser Event nicht mehr gefeuert, wenn, der Nutzer mit Tab oder Enter ein Eintrag aus der Autocompletion-Liste auswählt.</p>
<p>Hier muss man den Event selbst feuern, wenn der Eintrag aus der Autocompletion-Liste ausgewählt wurde. Da man bei Prototype keine native Events abfeuern kann, nutzt man die eigenen Events [2] nutzen.</p>
<p>script.aculo.us Autocompletion ruft die Funktion <code>selectEntry</code> wenn ein Eintrag ausgewählt wurde. Nun kann man diese Funktion überschreiben und nach der Auswahl das nötige Event feuern. Natürlich nur beim IE ansonsten hat man das Event doppel. In dem folgenden Listing wird dies beispielhaft für <code>Autocompleter.Local</code> gemacht</p>
<pre class="brush: js">
var al = new Autocompleter.Local(&#039;field&#039;, &#039;auto_box&#039;, localResults, { });
    // overwrite the selecEntry() function to fires the change event in IE
    al.selectEntry = function() {
       // the next two lines are the same from the original function!
       this.active = false;
       this.updateElement(this.getCurrentEntry());

       // the additional functionality
       // fire the event only for IE, cause IE does not fire this existing change event
       if(Prototype.Browser.IE) {
          var elem = $(&#039;field&#039;);
          elem.fire(&#039;clazz:event&#039;, ...);
       }
};
</pre>
<p>Links:<br />
[1] <a title="script.aculo.us" href="http://wiki.github.com/madrobby/scriptaculous" target="_blank">script.aculo.us</a><br />
[2] <a title="Prototype API: Element.fire" href="http://prototypejs.org/api/element/fire" target="_blank">Prototype Element.fire</a></p>
]]></content:encoded>
			<wfw:commentRss>http://my.center-of.info/2009/01/17/ie-change-event-und-autocompletion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaFX 1.0</title>
		<link>http://my.center-of.info/2008/12/07/javafx-10/</link>
		<comments>http://my.center-of.info/2008/12/07/javafx-10/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 11:11:59 +0000</pubDate>
		<dc:creator>Haf</dc:creator>
				<category><![CDATA[JEE]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javafx]]></category>
		<category><![CDATA[ria]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://my.center-of.info/?p=82</guid>
		<description><![CDATA[Seit dem 04.12.2008 gibt es nun endlich die Version 1.0 von JavaFX. JavaFX ist eine Plattform um Rich Internet Applications für verschiedene End-Geräte zu erstellen. Im Idealfall realisiert man eine Anwendung, die dann später im Browser, auf dem Desktop und auf dem mobilen Gerät läuft. Für weitere Details sei auf die JavaFX-Seiten verwiesen [1] und [...]]]></description>
			<content:encoded><![CDATA[<p>Seit dem 04.12.2008 gibt es nun endlich die Version 1.0 von <a title="SUN JavaFX" href="http://www.javafx.com/" target="_blank">JavaFX</a>. JavaFX ist eine Plattform um Rich Internet Applications für verschiedene End-Geräte zu erstellen. Im Idealfall realisiert man eine Anwendung, die dann später im Browser, auf dem Desktop und auf dem mobilen Gerät läuft. Für weitere Details sei auf die JavaFX-Seiten verwiesen [1] und [2].</p>
<p><span id="more-82"></span></p>
<p><strong>Überblick</strong></p>
<p>Um JavaFX-Anwendung zu nutzen, braucht man standardmäßig nur die aktuelle Java Version. Hier ist Java 1.6.0_11 [3] passend, da diese Version die Fähigkeit anbietet, Applets auf den Desktop zu ziehen. Beim ersten Aufruf einer JavaFX-Anwendung werden die Runtime-Bibliotheken beim ersten Mal runtergeladen, wenn sie nicht vorhanden sind. Bei entsprechender Implimentierung der JavaFX-Anwendung (was ja ein Applet ist), kann man sich das Applet auf den Desktop ziehen. Schließt man dann den Browser, bekommt man die Möglichkeit ein Verweis auf den Desktop zu erstellen, um später das Applet &#8211; und nur das Applet, nicht auch den Browser &#8211; wieder zu nutzen.</p>
<p>JavaFX kommt auch mit einer neuen Script-Sprache, dem JavaFX Script. JavaFX Script ist eine deklarative kompilierbare Scriptsprache, was auch type inference &#8211; und somit implizit auch statische Typen &#8211; anbietet.</p>
<p><strong>Entwicklung</strong></p>
<p>Zur Entwicklung. Sun setzt ja bekanntlich auf Netbeans. Das bedeutet in dem Fall, es gibt ein Netbeans-Version [4] mit integriertem JavaFX. Diese Version beinhaltet das JavaFX Software Development Kit, Beispiele und bei Windows noch den JavaFX Mobile Emulator.</p>
<p>Zusätzlich gibt es Plugins für Photoshop und Adobe Illustrator. Mit JavaFX sollen ja auch schöne GUIs erstellt werden und hierfür bietet man Grafikern eine einfache Möglichkeit dies in ihren bekannten Umgebungen zu erstellen. Wie gut diese Plugins funktionieren, kann ich leider nicht sagen.</p>
<p>Für Eclipse-Nutzer gibt es ein veraltetes Plugin [5], hier ist zu hoffen, dass demnächst eine aktuellere Version veröffentlich wird.</p>
<p>Mit Netbeans kann man jedenfalls recht einfach erste JavaFX Anwendungen realisieren. Für die grafische Darstellung kann man eine Palette von vorhandenen Mustern, Transformationen etc nutzen. Jedoch gibt es hier keinen visuellen Designer. Die Palette beinhaltet nur Code-Fragmente, die in den existierenden Code eingefügt werden können. Ob es hier einen Designer geben wird, ist fraglich, da entsprechen Photoshop/Illustrator Plugins existieren.</p>
<p><strong>Features</strong></p>
<p>Die Features dürfen nun auch nicht vergessen werden:</p>
<ul>
<li>RIA Plattform für verschiedene Endgeräte</li>
<li>Einfache Integration für Grafiker</li>
<li>Gute Unterstützung von Grafiken, 2D, 3D, Video, Audio</li>
<li>Zugang zu Java-Bibliotheken</li>
</ul>
<p>Für weitere Details sei auf die Überblicks-Seite in [1] verwiesen.</p>
<p>Links:<br />
[1] JavaFX Überblick: <a title="SUN JavaFX Überblick" href="http://javafx.com/about/overview/" target="_blank">http://javafx.com/about/overview/ </a><br />
[2] JavaFX Getting Started with the Technology: <a title="Getting Started with JavaFX Technology" href="http://javafx.com/docs/gettingstarted/javafx/" target="_blank">http://javafx.com/docs/gettingstarted/javafx/</a><br />
[3] Java SE 6 Update Release Notes: <a title="SUN Java6 Changelogs" href="http://java.sun.com/javase/6/webnotes/6u11.html" target="_blank">http://java.sun.com/javase/6/webnotes/6u11.html</a><br />
[4] JavaFX Download (for Windows): <a title="SUN JavaFX Download page" href="http://javafx.com/downloads/windows.jsp" target="_blank">http://javafx.com/downloads/windows.jsp</a><br />
[5] OpenJFX Eclipse Plugin v0.0.2: <a title="Altes Eclipse JavaFX Plugin" href="http://download.java.net/general/openjfx/plugins/eclipse/" target="_blank">http://download.java.net/general/openjfx/plugins/eclipse/</a><br />
[6] JavaFX API: <a title="SUN JavaFX API" href="http://java.sun.com/javafx/1/docs/api/index.html" target="_blank">http://java.sun.com/javafx/1/docs/api/index.html</a><br />
[7] JavaFX Script Language: <a title="SUN JavaFX Script Language" href="http://java.sun.com/javafx/1/tutorials/core/" target="_blank">http://java.sun.com/javafx/1/tutorials/core/</a><br />
[8] JavaFX Language Reference: <a title="Openjfx: JavaFX Language Reference" href="http://openjfx.java.sun.com/current-build/doc/reference/JavaFXReference.html" target="_blank">http://openjfx.java.sun.com/current-build/doc/reference/JavaFXReference.html</a><br />
[9] JavaFX Blog: <a title="SUN JavaFX Blog" href="http://blogs.sun.com/javafx/" target="_blank">http://blogs.sun.com/javafx/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://my.center-of.info/2008/12/07/javafx-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prototype each(), IE und null</title>
		<link>http://my.center-of.info/2008/11/26/prototype-each-ie-und-null/</link>
		<comments>http://my.center-of.info/2008/11/26/prototype-each-ie-und-null/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 11:52:28 +0000</pubDate>
		<dc:creator>Haf</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://my.center-of.info/?p=72</guid>
		<description><![CDATA[Bei der Arbeit mit JavaScript kommt man irgendwann in die Situation durch ein Array zu iterieren. Dabei nutzt man nicht immer einfach indizierte Arrays, sondern oft auch Arrays mit Lücken in den Indizes oder sogar assoziative Arrays.
Diese letzten Varianten kann man eigentlich genauso durchlaufen, wie die erste, wenn da nicht der IE wäre. Der IE [...]]]></description>
			<content:encoded><![CDATA[<p>Bei der Arbeit mit JavaScript kommt man irgendwann in die Situation durch ein Array zu iterieren. Dabei nutzt man nicht immer einfach indizierte Arrays, sondern oft auch Arrays mit Lücken in den Indizes oder sogar assoziative Arrays.<br />
Diese letzten Varianten kann man eigentlich genauso durchlaufen, wie die erste, wenn da nicht der IE wäre. Der IE hat Probleme mit Lücken in Arrays.<br />
<span id="more-72"></span><br />
Wie man im folgenden Listing sehen kann, gibt es beim Firefox fast die erwartbaren Ergebnisse.<br />
Nur fast. Denn beim ersten Output stimmen die Indizes nicht. Das gleiche Problem hat man jedoch auch beim IE.</p>
<pre class="brush: js">
var ar1 = new Array();
ar1[2] = &#039;A&#039;;
ar1[13] = &#039;B&#039;;
ar1[23] = &#039;C&#039;;

var out = &#039;&#039;;
ar1 = ar1.compact();
ar1.each(function(item, index) {
  out += index + &#039;: &#039; + item + &#039;, &#039;;
});
// =&gt; out = 0: A, 1: B, 2: C, 

out = &#039;&#039;;
for(i in ar1) {
  if( (typeof ar1[i]) != &#039;function&#039; )
    out += i + &#039;: &#039; + ar1[i] + &#039;, &#039;;
}
// =&gt; out = 2: A, 13: B, 23: C, 

var ar2 = {
 a: &#039;Part_1&#039;,
 b: &#039;Part_2&#039;,
 sum: &#039;Part_1_2&#039;
};

out = &#039;&#039;;
for(a in ar2) {
 out += a + &#039;: &#039; + ar2[a] + &#039;, &#039;;
}
// =&gt; out = a: Part_1, b: Part_2, sum: Part_1_2,
</pre>
<p>Der IE gibt folgendes aus:</p>
<pre class="brush: php">
// 1.output: 0: undefined, 1: undefined, 2: A, 3: undefined, 4: undefined, 5: undefined, 6: undefined, 7: undefined, 8: undefined, 9: undefined, 10: undefined, 11: undefined, 12: undefined, 13: B, 14: undefined, 15: undefined, 16: undefined, 17: undefined, 18: undefined, 19: undefined, 20: undefined, 21: undefined, 22: undefined, 23: C, 

// 2.output: 2: A, 13: B, 23: C,
// 3.output: a: Part_1, b: Part_2, sum: Part_1_2,
</pre>
<p>Wie man beim 1. Output sehen kann, werden die Lücken mit angezeigt.<br />
Dies kann man verhindern, in dem man das Array zusammenfasst und das geht z.B. mit der Prototype Funktion <a href="http://www.prototypejs.org/api/array/compact" title="Prototype API für Array.compact()" target="_blank">Array.compact()</a>.<br />
Also ein</p>
<pre class="brush: js">
 ar1 = ar1.compact();
</pre>
<p>hilft hier.</p>
<p>Bei der zweiten Variante werden die korrekten Indizes beibehalten. Hier muss man jedoch bedenken, dass man durch das ganze JavaScript Object iteriert und einem meistens die Funktionen nicht interessieren. </p>
<p>Und das letzte Beispiel zeigt, dass dies auch bei einem eigenen Objekt funktioniert. Auch dort sollte man Funktions-Filter einbauen, wenn erwünscht.</p>
<p>Links:<br />
[1] <a href="http://www.prototypejs.org/api/array/compact" title="Prototype API" target="_blank">http://www.prototypejs.org/api/array/compact</a></p>
]]></content:encoded>
			<wfw:commentRss>http://my.center-of.info/2008/11/26/prototype-each-ie-und-null/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
