12 kwietnia 2007

Przewodnik o JSF i Exadel Studio Pro - pierwsze wrażenia

Właśnie ukończyłem mój pierwszy podręcznik o JSF dostarczany z Exadel Studio Pro 4.0.4. Wszystko za sprawą problemu uruchomienia pierwszej aplikacji JSF przez Ulę (aka odysse) - JSF - błąd (tagliby?). Po tygodniu bezskutecznej wymiany wiadomości postanowiłem rozeznać się w źródłach i poprosiłem odysse o przesłanie mi ich na skrzynkę. Dowiedziałem się przy tym, że odysse korzysta z Exadel Pro Studio (i wcale nie była tym zachwycona). Przyszła pora na zainstalowanie narzędzia i przekonanie się na własnej skórze co to cudeńko potrafi.

Rozpocząłem od pobrania wersji instalacyjnej Exadel Studio Pro 4.0.4 na platformę Windows. Pełna nazwa produktu to Exadel Studio Pro plug-in for Eclipse i już podczas pierwszych ekranów instalacyjnych okazało się, że będę potrzebował wersji Eclipse 3.2.x (pracuję z Eclipse 3.3M6, więc pomysł pobrania kolejnej nie był przyjęty z zachwytem). Ostatnia wersja Eclipse z serii 3.2.x to Eclipse IDE 3.2.2.

Po chwili, instalację Studio miałem za sobą.


Rzut oka na czas ewaluacji jaki mi pozostał...


i przeszedłem do lektury przewodnika Getting Started Guide for Creating a JSF Application. Wykonałem wszystkie kroki zgodnie z podręcznikiem. Tym razem postanowiłem nic nie zmieniać i pozwoliłem poprowadzić się za rękę ;-) Wszystko szło gładko, aż do momentu, kiedy należało uruchomić aplikację. Podczas uruchomienia otrzymałem znajomy zrzut wątków Javy:

Dla zainteresowanych przedstawiam go w całości:

SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: Component javax.faces.component.UIViewRoot@f2225f not expected type. Expected: UIOutput. Perhaps you're missing a tag?
at com.sun.faces.taglib.html_basic.OutputTextTag.setProperties(OutputTextTag.java:90)
at javax.faces.webapp.UIComponentTag.findComponent(UIComponentTag.java:712)
at javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:429)
at com.sun.faces.taglib.html_basic.OutputTextTag.doStartTag(OutputTextTag.java:155)
at org.apache.jsp.pages.greeting_jsp._jspx_meth_h_outputText_0(greeting_jsp.java:87)
at org.apache.jsp.pages.greeting_jsp._jspService(greeting_jsp.java:61)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
2007-04-12 19:02:56 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: Component javax.faces.component.UIViewRoot@f2225f not expected type. Expected: UIOutput. Perhaps you're missing a tag?
at com.sun.faces.taglib.html_basic.OutputTextTag.setProperties(OutputTextTag.java:90)
at javax.faces.webapp.UIComponentTag.findComponent(UIComponentTag.java:712)
at javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:429)
at com.sun.faces.taglib.html_basic.OutputTextTag.doStartTag(OutputTextTag.java:155)
at org.apache.jsp.pages.greeting_jsp._jspx_meth_h_outputText_0(greeting_jsp.java:87)
at org.apache.jsp.pages.greeting_jsp._jspService(greeting_jsp.java:61)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)

Zgodnie z komunikatem, okazało się że znacznik h:outputText nie jest umieszczony między znacznikami f:view (!) Zmieniłem źródło strony o dodanie znacznika

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<html>
<head>
<title></title>
</head>
<body>
<f:view>
Hello <h:outputText value="#{personBean.name}"/>!
</f:view>
</body>
</html>

i po ponownym uruchomieniu aplikacji, wpisaniu Jacek w pole tekstowe i wciśnięciu przycisku Say Hello zobaczyłem ekran z Hello Jacek!.


Zadziałało! To jest właśnie odpowiedź dla odysse - propozycja przejścia przewodnika krok po kroku. U mnie zadziałało, więc i u niej powinno.

Pomimo błędu, narzędzie jest bardzo intuicyjne i pomocne, szczególnie dla osób rozpoczynających poznawanie JSF. I jeszcze w dodatku (już prawie) darmowe! Planuję zapoznać się z pozostałymi przewodnikami udostępnymi na stronach Exadel.