09 lutego 2007

EJB 3.0 korzystając z JBoss AS 4.0.5.GA, JEMS Installer 1.2.0.GA i NetBeans IDE 5.5.1

Otwierając dzisiaj skrzynkę pocztową zobaczyłem wiadomość informującą o komentarzu do wpisu JBoss AS 4.0.5 z EJB 3.0 RC9 Patch 1 i NetBeans IDE 5.5.1, gdzie jonsnow napisał o usprawnieniu zestawiania środowiska z wykorzystaniem JEMS Installer.

Nie ukrywam, że zazwyczaj jestem sceptyczny do korzystania z narzędzi automatyzujących instalację, które nie tylko ukrywają faktycznie wykonywane kroki i na dodatek zapisują coś w rejestrach (pracuję na MS Windows), ale jeszcze przeczytałem informację o pewnej konkretnej konfiguracji JBoss AS, rozszerzenia EJB 3.0 i JEMS Installera, która miała prawo działać, co zniechęciło mnie zupełnie. Wiedząc, że JBoss AS 4.0.5 to nie jest serwer aplikacyjny Java EE 5 i daleko mu do niego (poza EJB3 oraz JPA, które serwera i tak nie wymaga) nie zagłębiałem się w ten temat dalej. Podobną sytuację mam w przypadku skorzystania z IBM WebSphere Application Server Version 6.1 Feature Pack for EJB 3, więc po co miałbym zajmować się JBoss AS 4? Poza tym pełniejszą implementację Java EE 5 mam chociażby w GlassFish v2 oraz Apache Geronimo v2. Mimo to, kiedy przeczytałem wiadomość od jonsnow pomyślałem, że mogę to sprawdzić. W końcu nic nie traciłem.

Co się okazało? Po około 30 minutach miałem zestawione kompletne środowisko do tworzenia semi-Java EE 5 aplikacji (semi wynika z niepełności JBoss AS 4.0.5 w realizowaniu Java EE 5 po stronie kontenera servletów - brak chociażby wstrzeliwania zależności, itp.).

Warto to odnotować, bo nie mogłem uwierzyć, że moje przestarzałe stereotypy o oprogramowaniu typu JEMS Installer wzięły kolejny raz górę nad zdrowym rozsądkiem. Wystarczyło poświęcić 15 minut na zapoznanie się z dokumentacją! Tylko, kto chciałby czytać dokumentację?!

Zacząłem od pobrania JEMS Installer 1.2.0.GA (właśnie owe GA było dla mnie kolejnym argumentem za sprawdzeniem jego możliwości). Uruchomienie instalacji było wskazane przez jonsnow, więc kopiuj-wklej (z drobnymi poprawkami dotyczącymi ścieżki instalacji JBoss AS 4) i ENTER.
  C:\>cd apps

C:\apps>java -jar jems-installer-1.2.0.GA.jar -installGroup ejb3 installpath=c:/apps/jboss-4.0.5.GA_ejb3
Obarczony stereotypami, uruchomiłem to w tle, a sam zabrałem się za bardziej wartościowe rzeczy niż przyglądanie się instalacji. Jakież było moje zdziwienie, kiedy dysk przestał intensywnie pracować po około 10-15 minutach! Pomyślałem, że zapewne Installer nie znalazł czegoś i zakończył swoje działanie z błędem myśląc, że zechciałbym mu pomóc. Zajrzałem na konsolę i co widzę:
C:\apps>java -jar jems-installer-1.2.0.GA.jar -installGroup ejb3 installpath=c:/apps/jboss-4.0.5.GA_ejb3
Looking for auto install resource...
/res/jbossauto-install.xml URL: jar:file:/C:/apps/jems-installer-1.2.0.GA.jar!/res/jbossauto-install.xml
PackageListener, install.log=C:\DOCUME~1\JLASKO~1\LOCALS~1\Temp\jems-install.log
[ Starting automated installation ]
creating Logfile: 'IzPack_Logfile_at_1171016018453.txt' in: 'C:\DOCUME~1\JLASKO~1\LOCALS~1\Temp\'
[ Starting to unpack ]
[ Processing package: ejb3-deployer (1/58) ]
[ Processing package: invokers-service (2/58) ]
[ Processing package: jta-service (3/58) ]
[ Processing package: mail-service (4/58) ]
[ Processing package: jboss-cache (5/58) ]
[ Processing package: jbossws5 (6/58) ]
[ Processing package: snmp-adaptor.sar (7/58) ]
[ Processing package: properties-service (8/58) ]
[ Processing package: javamail (9/58) ]
[ Processing package: jmx-console (10/58) ]
[ Processing package: jms-http-invoker (11/58) ]
[ Processing package: usertx-service (12/58) ]
[ Processing package: jboss-local-jdbc.rar (13/58) ]
[ Processing package: ear-deployer (14/58) ]
[ Processing package: security (15/58) ]
[ Processing package: naming (16/58) ]
[ Processing package: hibernate (17/58) ]
[ Processing package: jca-service (18/58) ]
[ Processing package: jboss-aop-jdk50-deployer (19/58) ]
[ Processing package: ejb-timer-service (20/58) ]
[ Processing package: iiop-service.xml (21/58) ]
[ Processing package: jms-socket-invoker (22/58) ]
[ Processing package: scheduler-service (23/58) ]
[ Processing package: web-console-jdk50 (24/58) ]
[ Processing package: jsr77-service (25/58) ]
[ Processing package: jgroups (26/58) ]
[ Processing package: quartz-rar (27/58) ]
[ Processing package: cache-invalidation-service.xml (28/58) ]
[ Processing package: jmx-core (29/58) ]
[ Processing package: bsh-deployer (30/58) ]
[ Processing package: jboss-ha-local-jdbc (31/58) ]
[ Processing package: mail-inflow-adaptor (32/58) ]
[ Processing package: jboss-ds (33/58) ]
[ Processing package: xmlresolver (34/58) ]
[ Processing package: jms-injvm-invoker (35/58) ]
[ Processing package: jsr88-service (36/58) ]
[ Processing package: jboss-xa-jdbc (37/58) ]
[ Processing package: jboss-ha-xa-jdbc (38/58) ]
[ Processing package: docs (39/58) ]
[ Processing package: binding-service (40/58) ]
[ Processing package: minimal (41/58) ]
[ Processing package: dynclassloader-service (42/58) ]
[ Processing package: ejb-deployer (43/58) ]
[ Processing package: uuid-key-generator (44/58) ]
[ Processing package: war-deployer (45/58) ]
[ Processing package: client-deployer-service (46/58) ]
[ Processing package: attribute-persistence-service (47/58) ]
[ Processing package: xmlservice (48/58) ]
[ Processing package: jmx-invoker-service (49/58) ]
[ Processing package: jboss-bean-deployer (50/58) ]
[ Processing package: client (51/58) ]
[ Processing package: jbossretro (52/58) ]
[ Processing package: rmi-http-invoker (53/58) ]
[ Processing package: jms-asf-rar (54/58) ]
[ Processing package: jbossmq-service (55/58) ]
[ Processing package: jdbc-metadata-service (56/58) ]
[ Processing package: default-jms-destintations (57/58) ]
[ Processing package: jboss-remoting (58/58) ]

calltarget:

jbossws-post-install:
[echo] Unpacking wstools to bin...
[unzip] Expanding: C:\apps\jboss-4.0.5.GA_ejb3\client\jbossws-client.jar into C:\apps\jboss-4.0.5.GA_ejb3\bin
[echo] Removing jbossws14 client jars...
[delete] Deleting 4 files from C:\apps\jboss-4.0.5.GA_ejb3\client
[delete] Deleting C:\apps\jboss-4.0.5.GA_ejb3\client\jboss-backport-concurrent.jar
[delete] Deleting C:\apps\jboss-4.0.5.GA_ejb3\client\jbossretro-rt.jar
[delete] Deleting C:\apps\jboss-4.0.5.GA_ejb3\client\jbossws14-client.jar
[delete] Deleting C:\apps\jboss-4.0.5.GA_ejb3\client\namespace.jar
[echo] jbossws done

calltarget:

chmod-bin:
[echo] Updating script executable modes
[echo] bin dir is c:/apps/jboss-4.0.5.GA_ejb3/bin
[ Unpacking finished. ]
creating Logfile: 'IzPack_Logfile_at_1171016018453.txt' in: 'C:\DOCUME~1\JLASKO~1\LOCALS~1\Temp\'
[ Writing the uninstaller data ... ]
[ Automated installation done ]

C:\apps>
Widzę migający kursor na konsoli i zakończoną poprawnie instalację (!) Zaczynało mi się podobać. Jako pierwszy moduł instalowany zobaczyłem ejb3-deployer, więc dawało mi to pewność, że jest lepiej niż początkowo myślałem.

Co mogłem dalej zrobić, aby sprawdzić poprawność instalacji? Uruchomić serwer.
jlaskowski@dev /cygdrive/c/apps/jboss-4.0.5.GA_ejb3
$ ./bin/run.sh
=========================================================================

JBoss Bootstrap Environment

JBOSS_HOME: c:\apps\jboss-4.0.5.GA_ejb3

JAVA: /cygdrive/c/apps/java5/bin/java

JAVA_OPTS: -Dprogram.name=run.sh -server -Xms128m -Xmx512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000

CLASSPATH: c:\apps\jboss-4.0.5.GA_ejb3\bin\run.jar;c:\apps\java5\lib\tools.jar

=========================================================================

11:38:51,437 INFO [Server] Starting JBoss (MX MicroKernel)...
11:38:51,437 INFO [Server] Release ID: JBoss [Zion] 4.0.5.GA (build: CVSTag=Branch_4_0 date=200610162339)
11:38:51,437 INFO [Server] Home Dir: C:\apps\jboss-4.0.5.GA_ejb3
11:38:51,437 INFO [Server] Home URL: file:/C:/apps/jboss-4.0.5.GA_ejb3/
11:38:51,437 INFO [Server] Patch URL: null
11:38:51,437 INFO [Server] Server Name: default
11:38:51,437 INFO [Server] Server Home Dir: C:\apps\jboss-4.0.5.GA_ejb3\server\default
11:38:51,437 INFO [Server] Server Home URL: file:/C:/apps/jboss-4.0.5.GA_ejb3/server/default/
11:38:51,437 INFO [Server] Server Log Dir: C:\apps\jboss-4.0.5.GA_ejb3\server\default\log
11:38:51,437 INFO [Server] Server Temp Dir: C:\apps\jboss-4.0.5.GA_ejb3\server\default\tmp
11:38:51,437 INFO [Server] Root Deployment Filename: jboss-service.xml
11:38:51,921 INFO [ServerInfo] Java version: 1.5.0_08,Sun Microsystems Inc.
11:38:51,921 INFO [ServerInfo] Java VM: Java HotSpot(TM) Server VM 1.5.0_08-b03,Sun Microsystems Inc.
11:38:51,921 INFO [ServerInfo] OS-System: Windows XP 5.1,x86
11:38:52,500 INFO [Server] Core system initialized
11:38:55,156 INFO [WebService] Using RMI server codebase: http://dev:8083/
11:38:55,187 INFO [Log4jService$URLWatchTimerTask] Configuring from URL: resource:log4j.xml
11:38:58,406 INFO [SocketServerInvoker] Invoker started for locator: InvokerLocator [socket://9.164.187.15:3873/]
11:39:04,031 INFO [ServiceEndpointManager] WebServices: jbossws-1.0.3.SP1 (date=200609291417)
11:39:08,671 INFO [SnmpAgentService] SNMP agent going active
11:39:09,500 INFO [CorbaNamingService] Naming: [IOR:000000000000002B49444C3A6F6D672E6F72672F436F734E616D696E672F4E616D696E67436F6E746578744578743A312E300000000000020000000000000
8000102000000000D392E3136342E3138372E313500000DC8000000114A426F73732F4E616D696E672F726F6F74000000000000050000000000000008000000004A414300000000010000001C0000000000010001000000010
10001000101090000000105010001000000210000006000000000000000010000000000000024000000200000007E00000000000000010000000D392E3136342E3138372E313500000DC900400000000000000000001004010
8060667810201010100000000000000000000000000000000000000000000002000000004000000000000001F0000000400000003000000010000002000000000000000020000002000000004000000000000001F000000040
00003]
11:39:09,875 INFO [CorbaTransactionService] TransactionFactory: [IOR:000000000000003049444C3A6F72672F6A626F73732F746D2F69696F702F5472616E73616374696F6E466163746F72794578743A312E
000000000200000000000000E8000102000000000D392E3136342E3138372E313500000DC8000000144A426F73732F5472616E73616374696F6E732F46000000050000000000000008000000004A414300000000010000001C
000000000100010000000105010001000101090000000105010001000000210000006000000000000000010000000000000024000000200000007E00000000000000010000000D392E3136342E3138372E313500000DC90040
00000000000000001004010008060667810201010100000000000000000000000000000000000000000000002000000004000000000000001F0000000400000003000000010000002000000000000000020000002000000004
0000000000001F0000000400000003]
11:39:10,593 INFO [Embedded] Catalina naming disabled
11:39:10,687 INFO [ClusterRuleSetFactory] Unable to find a cluster rule set in the classpath. Will load the default rule set.
11:39:10,687 INFO [ClusterRuleSetFactory] Unable to find a cluster rule set in the classpath. Will load the default rule set.
11:39:11,078 INFO [Http11BaseProtocol] Initializing Coyote HTTP/1.1 on http-0.0.0.0-8080
11:39:11,078 INFO [Catalina] Initialization processed in 391 ms
11:39:11,078 INFO [StandardService] Starting service jboss.web
11:39:11,093 INFO [StandardEngine] Starting Servlet Engine: Apache Tomcat/5.5.20
11:39:11,125 INFO [StandardHost] XML validation disabled
11:39:11,140 INFO [Catalina] Server startup in 62 ms
11:39:11,265 INFO [TomcatDeployer] deploy, ctxPath=/invoker, warUrl=.../deploy/http-invoker.sar/invoker.war/
11:39:11,500 INFO [WebappLoader] Dual registration of jndi stream handler: factory already defined
11:39:12,484 INFO [TomcatDeployer] deploy, ctxPath=/, warUrl=.../deploy/jbossweb-tomcat55.sar/ROOT.war/
11:39:12,687 INFO [TomcatDeployer] deploy, ctxPath=/jbossws, warUrl=.../tmp/deploy/tmp255jbossws-context-exp.war/
11:39:13,046 INFO [TomcatDeployer] deploy, ctxPath=/jbossmq-httpil, warUrl=.../deploy/jms/jbossmq-httpil.sar/jbossmq-httpil.war/
11:39:14,656 INFO [TomcatDeployer] deploy, ctxPath=/web-console, warUrl=.../deploy/management/console-mgr.sar/web-console.war/
11:39:15,562 INFO [MailService] Mail Service bound to java:/Mail
11:39:15,750 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in .../deploy/jboss-ha-local-jdbc.rar
11:39:15,812 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in .../deploy/jboss-ha-xa-jdbc.rar
11:39:15,843 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in .../deploy/jboss-local-jdbc.rar
11:39:15,890 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in .../deploy/jboss-xa-jdbc.rar
11:39:16,000 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in .../deploy/jms/jms-ra.rar
11:39:16,031 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in .../deploy/mail-ra.rar
11:39:16,078 INFO [RARDeployment] Required license terms exist, view META-INF/ra.xml in .../deploy/quartz-ra.rar
11:39:16,093 INFO [QuartzResourceAdapter] start quartz!!!
11:39:16,156 INFO [SimpleThreadPool] Job execution threads will use class loader of thread: main
11:39:16,203 INFO [QuartzScheduler] Quartz Scheduler v.1.5.2 created.
11:39:16,218 INFO [RAMJobStore] RAMJobStore initialized.
11:39:16,218 INFO [StdSchedulerFactory] Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
11:39:16,218 INFO [StdSchedulerFactory] Quartz scheduler version: 1.5.2
11:39:16,218 INFO [QuartzScheduler] Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
11:39:16,937 INFO [WrapperDataSourceService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=DefaultDS' to JNDI name 'java:DefaultDS'
11:39:17,281 INFO [A] Bound to JNDI name: queue/A
11:39:17,281 INFO [B] Bound to JNDI name: queue/B
11:39:17,281 INFO [C] Bound to JNDI name: queue/C
11:39:17,281 INFO [D] Bound to JNDI name: queue/D
11:39:17,281 INFO [ex] Bound to JNDI name: queue/ex
11:39:17,359 INFO [testTopic] Bound to JNDI name: topic/testTopic
11:39:17,359 INFO [securedTopic] Bound to JNDI name: topic/securedTopic
11:39:17,359 INFO [testDurableTopic] Bound to JNDI name: topic/testDurableTopic
11:39:17,390 INFO [testQueue] Bound to JNDI name: queue/testQueue
11:39:17,531 INFO [UILServerILService] JBossMQ UIL service available at : /0.0.0.0:8093
11:39:17,593 INFO [DLQ] Bound to JNDI name: queue/DLQ
11:39:17,718 INFO [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=ConnectionFactoryBinding,name=JmsXA' to JNDI name 'java:JmsXA'
11:39:17,750 INFO [TomcatDeployer] deploy, ctxPath=/jmx-console, warUrl=.../deploy/jmx-console.war/
11:39:18,078 INFO [Http11BaseProtocol] Starting Coyote HTTP/1.1 on http-0.0.0.0-8080
11:39:18,218 INFO [ChannelSocket] JK: ajp13 listening on /0.0.0.0:8009
11:39:18,328 INFO [JkMain] Jk running ID=0 time=0/125 config=null
11:39:18,406 INFO [Server] JBoss (MX MicroKernel) [4.0.5.GA (build: CVSTag=Branch_4_0 date=200610162339)] Started in 26s:969ms
To również zadziałało! No, dobrze pomyślałem, czas sprawdzić uruchomienie przykładowej aplikacji Java EE 5.

W NetBeans IDE 5.5.1 Daily Build (z dnia 31 stycznia 2007) zdefiniowałem nową instancję serwera (zakładka Runtime). JBoss AS działał, więc NetBeans IDE od razu rozpoznał sytuację i pozwolił mi na przejrzenie zainstalowanych aplikacji. Nic nie było. Zabrałem się za stworzenie aplikacji przemysłowej (ang. Enterprise Application) - File->New Project...->Enterprise->Enterprise Application. Zdefiniowałem nazwę dla projektu simple (wierząc, że z projektami typu simple JBoss AS sobie poradzi ;-)) i wybrałem serwer JBoss AS, który właśnie zdefiniowałem. Pozostałe rzeczy pozostawiłem bez zmian. Na węźle simple-ejb wybrałem z menu kontekstowego New->Session Bean....
  package pl.jaceklaskowski.simple.beans;

import javax.ejb.Stateless;

@Stateless
public class NewSessionBean implements NewSessionLocal {

public String powitaj(String kogo) {
return "Witam " + kogo + "!";
}

}
Komponent sesyjny EJB3 już miałem, więc pora do warstwy prezentacji, czyli utworzenie servletu. Dlaczego servletu? Po pierwsze, ponieważ podlega wstrzeliwaniu zależności w Java EE 5, a po drugie jest do tego wizard w NetBeans IDE. Wybrałem menu New->Servlet... z menu kontekstowego na węźle simple-war.

Przypisałem servlet do adresu /powitaj i początkowo mój servlet wyglądał tak:
  package pl.jaceklaskowski.simple.servlet;

import java.io.*;
import javax.ejb.EJB;

import javax.servlet.*;
import javax.servlet.http.*;
import pl.jaceklaskowski.simple.beans.NewSessionLocal;

public class WywolajNewSessionBean extends HttpServlet {

@EJB
private NewSessionLocal newSessionLocal;

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet WywolajNewSessionBean</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>" + newSessionLocal.powitaj(request.getParameter("kogo")) + "</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}

// usunięte, nieistotne dla wpisu, metody servletu
}
Po stworzeniu servletu, wcisnąłem klawisz F6 uruchamiający projekt główny, co w moim przypadku było właśnie projektem simple. Przełączyłem się na konsolę JBoss AS, gdzie pojawiły się wpisy zdarzeń:
12:07:24,750 INFO  [EARDeployer] Init J2EE application: file:/C:/apps/jboss-4.0.5.GA_ejb3/server/default/deploy/simple.ear
12:07:25,187 INFO [Ejb3Deployment] EJB3 deployment time took: 297
12:07:25,234 INFO [JmxKernelAbstraction] installing MBean: jboss.j2ee:ear=simple.ear,jar=simple-ejb.jar,name=NewSessionBean,service=EJB3 with dependencies:
12:07:25,500 INFO [EJBContainer] STARTED EJB: pl.jaceklaskowski.simple.beans.NewSessionBean ejbName: NewSessionBean
12:07:25,562 INFO [EJB3Deployer] Deployed: file:/C:/apps/jboss-4.0.5.GA_ejb3/server/default/tmp/deploy/tmp288simple.ear-contents/simple-ejb.jar
12:07:25,562 INFO [TomcatDeployer] deploy, ctxPath=/simple-war, warUrl=.../tmp/deploy/tmp288simple.ear-contents/simple-war-exp.war/
12:07:25,750 INFO [EARDeployer] Started J2EE application: file:/C:/apps/jboss-4.0.5.GA_ejb3/server/default/deploy/simple.ear
czyli wszystko w porządku. NetBeans uruchomił mi przeglądarkę z aplikacją, więc nadal było w porządku. Po wpisaniu adresu http://localhost:8080/simple-war/powitaj?kogo=Jacek okazało się jednak, że mój entuzjazm do bezawaryjnego zestawienia środowiska zmalał - pojawił się wyjątek! I to jaki - NullPointerException!

Analiza kodu wskazała na...brak wstrzeliwania zależności (DI) w JBoss AS. Przez moment nie mogłem w to uwierzyć. Jak to? Przecież Java EE 5 pozwala, aby servlet korzystał z DI. Może źle wyszukuje w JNDI? Trwało to jakąś chwilę, aż przypomniałem sobie o braku wsparcia dla DI w Tomcat 5, który był kontenerem servletów w JBoss AS.

Na pomoc pośpieszył mi NetBeans IDE z menu kontekstowym w otwartym edytorze z klasą servletu - Enterprise Resources->Call Enterprise Bean. W ten sposób NetBeans IDE dodał mi metodę lookupNewSessionBean, którą wykorzystałem w metodzie servletu:
  package pl.jaceklaskowski.simple.servlet;

import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.servlet.*;
import javax.servlet.http.*;
import pl.jaceklaskowski.simple.beans.NewSessionLocal;

public class WywolajNewSessionBean extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet WywolajNewSessionBean</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>" + lookupNewSessionBean().powitaj(request.getParameter("kogo")) + "</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}

private NewSessionLocal lookupNewSessionBean() {
try {
Context c = new InitialContext();
return (NewSessionLocal) c.lookup("java:comp/env/ejb/NewSessionBean");
} catch(NamingException ne) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught" ,ne);
throw new RuntimeException(ne);
}
}

// usunięte, nieistotne dla wpisu, metody servletu

}
Ponownie wcisnąłem F6, wpisałem adres http://localhost:8080/simple-war/powitaj?kogo=Jacek i...kolejny raz wyjątek!

Tym razem już wiedziałem, że należy zadeklarować zależność w deskryptorze instalacji aplikacji internetowej (WEB-INF/web.xml), ale nie wiedziałem jaka musi być postać. Przypomniałem sobie o artykule na stronach NetBeans IDE o integracji z JBoss AS 4, który planowałem przeczytać - EJB 3.0 Enterprise Beans for the JBoss Application Server. Teraz była najwłaściwsza pora. Odszukałem sekcji o połączeniu servleta z komponentem EJB i poprawiłem metodę lookupNewSessionBean, aby tym razem wyszukiwała komponentu pod adresem simple/NewSessionBean/local. Ostatecznie kod servletu wyglądał tak:
  package pl.jaceklaskowski.simple.servlet;

import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.servlet.*;
import javax.servlet.http.*;
import pl.jaceklaskowski.simple.beans.NewSessionLocal;

public class WywolajNewSessionBean extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet WywolajNewSessionBean</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>" + lookupNewSessionBean().powitaj(request.getParameter("kogo")) + "</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}

private NewSessionLocal lookupNewSessionBean() {
try {
Context c = new InitialContext();
return (NewSessionLocal) c.lookup("simple/NewSessionBean/local");
} catch(NamingException ne) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught" ,ne);
throw new RuntimeException(ne);
}
}

// usunięte, nieistotne dla wpisu, metody servletu
}
Ponownie F6, wpisanie adresu http://localhost:8080/simple-war/powitaj?kogo=Jacek i widzę pomyślnie uruchomioną aplikację!

Warto było! Dzięki jonsnow za komentarz!