Es werden kleine Hello-World-Beispiele zu einer Webanwendung mit Eclipse, Apache Tomcat und dem Sysdeo Eclipse Tomcat Plug-in erläutert.
Die Erläuterungen beziehen sich auf Eclipse 3.1. Ab Eclipse 3.3 wird das Sysdeo Eclipse Tomcat Plug-in nicht mehr benötigt. Eine Beschreibung für Eclipse 3.3 finden Sie in jee-tomcat-eclipse.htm.
Eine Einführung in Eclipse finden Sie unter java-eclipse.htm.
Benutzervariablen setzen: | |
JAVA_HOME | C:\Program Files\Java\jdk1.6 |
CATALINA_HOME | D:\Tools\Tomcat |
Systemvariablen erweitern um: | |
Path | <vorherigerPath>;C:\Program Files\Java\jdk1.6\bin |
'Window' | 'Customize Perspective...' | 'Commands' | 'Available command groups' | | Häkchen vor: | Tomcat | ||
'Window' | 'Preferences' | 'Tomcat' | | 'Tomcat Version': | Version 5.x | ||
'Window' | 'Preferences' | 'Tomcat' | | 'Tomcat Home': | D:\Tools\Tomcat | ||
Falls Sie auch ein JRE ohne SDK installiert haben, stellen Sie sicher, dass das SDK registriert ist: | ||||
'Window' | 'Preferences' | '[+] Java' | 'Installed JREs' | | 'Add...' und Häkchen: | C:\Program Files\Java\jdk1.6 | ||
'Window' | 'Preferences' | '[+] Tomcat' | 'JVM Einstellungen' | | 'JRE': | C Java jdk |
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet( HttpServletRequest requ, HttpServletResponse resp ) throws ServletException, IOException { resp.setContentType( "text/html" ); PrintWriter out = resp.getWriter(); out.println( "<html>" ); out.println( "Hallo, mein erstes Servlet meldet sich." ); out.println( "</html>" ); out.close(); } }
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'> <web-app> <display-name>Mein erstes Servlet</display-name> <servlet> <servlet-name>hello</servlet-name> <servlet-class>HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>(Statt dieser 'web.xml'-Änderung könnten Sie auch das Tomcat-Invoker-Servlet bemühen.)
<%@ page import="java.text.*" %> <%@ page import="java.util.*" %> <html> Hallo, meine erste JSP-Seite meldet sich.<br> <%= request.getRemoteHost() %>, <%= (new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss")).format(new Date()) + " h" %> </html>
<html> Hallo, meine JSP-Seite mit JavaBean meldet sich.<br> <%= request.getRemoteHost() %><br> <% meinpackage.MeineJavaBean jb = new meinpackage.MeineJavaBean(); out.println( jb.getDateString() ); %> </html>
package meinpackage; import java.text.SimpleDateFormat; import java.util.Date; public class MeineJavaBean { public String getDateString() { return (new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss")).format(new Date()) + " h"; } }
<jsp:useBean id="MeineBean" class="meinpackage.MeineJavaBean" />
Dann kann einfach mit '<jsp:getProperty ...>' und '<jsp:setProperty ...>' auf die Bean-Getter und -Setter zugegriffen werden und es ergeben sich weitere Möglichkeiten zur Nutzung, z.B. die einfache Parameterübergabe aus HTML-Formularen in JavaBeans.
<Context path="/MyJSPwithJavaBean" reloadable="true"
docBase="D:\MeinWorkspace\MyJSPwithJavaBean"
workDir="D:\MeinWorkspace\MyJSPwithJavaBean\work\org\apache\jsp" />
Informationen zu SOAP Web Services finden Sie unter
soap.htm und
java-soap-axis.htm.
Im Folgenden geht es um die Erzeugung eines SOAP Web Services mit Axis in Eclipse.
Downloaden Sie das Apache-Axis-Archiv (z.B. 'axis-bin-1_2.zip') von 'http://ws.apache.org/axis/' in ein temporäres Verzeichnis und entpacken Sie es. Kopieren Sie aus dem Apache-Axis-Archiv alle .jar-Libs aus dem 'axis-1_2/webapps/axis/WEB-INF/lib'-Verzeichnis in das 'MeinWebServiceProjekt/WEB-INF/lib'-Verzeichnis in Ihrem Eclipse-Workspace und die Datei 'web.xml' aus dem Apache-Axis-Archiv-Verzeichnis 'axis-1_2/webapps/axis/WEB-INF' in das 'MeinWebServiceProjekt/WEB-INF'-Verzeichnis in Ihrem Eclipse-Workspace. Zum Beispiel so:
xcopy \Temp\axis-bin-1_2\axis-1_2\webapps\axis\WEB-INF\lib\*.jar \MeinWorkspace\MeinWebServiceProjekt\WEB-INF\lib
xcopy \Temp\axis-bin-1_2\axis-1_2\webapps\axis\WEB-INF\web.xml \MeinWorkspace\MeinWebServiceProjekt\WEB-INF
Drei zusätzliche '.jar'-Libs werden benötigt:
'activation.jar' aus dem 'JavaBeans Activation Framework' (z.B. 'jaf-1_0_2-upd2.zip') von 'http://java.sun.com/products/javabeans/glasgow/jaf.html',
'mail.jar' aus 'JavaMail' (z.B. 'javamail-1_3_2-upd.zip') von 'http://www.oracle.com/technetwork/java/javamail' und
die 'XML Security'-Lib (z.B. 'xmlsec-1.2.1.jar') von 'http://xml.apache.org/security/' (oder 'http://xml.apache.org/security/dist/java-library/').
Kopieren Sie alle drei .jar-Libs nach '<MeinWorkspace>\MeinWebServiceProjekt\WEB-INF\lib'.
Umbenennen Sie die .jar-Libs im Eclipse-Workspace-Verzeichnis '<MeinWorkspace>\MeinWebServiceProjekt\WEB-INF\lib' so, dass sie keine Versionsnummern mehr enthalten (z.B. 'commons-discovery.jar' statt 'commons-discovery-0.2.jar').
Klicken Sie im 'Package Explorer' mit der rechten Maustaste auf 'meinpackage' und wählen Sie 'New' | 'Class' | 'Name = MeineWebServiceKlasse' | 'Finish'.
Im Editorfenster erscheint die Datei 'MeineWebServiceKlasse.java'.
Ersetzen Sie den Inhalt durch (und speichern Sie mit 'Ctrl+S'):
package meinpackage; public class MeineWebServiceKlasse { public double meineWebServiceMethode( String job, double x ) { if( "Quadrat".equalsIgnoreCase( job ) ) return x * x; if( "Wurzel".equalsIgnoreCase( job ) ) return Math.sqrt( x ); return 0.; } }
Klicken Sie mit der rechten Maustaste diesmal auf 'WEB_INF' (nicht verwechseln mit 'WEB_INF/src') und wählen Sie 'New' | 'File' | 'File name = deployMeinWebService.wsdd' | 'Finish'.
Speichern Sie im sich öffnenden Editorfenster folgenden Web Service Deployment Descriptor:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="MeinWebServiceName" provider="java:RPC" style="wrapped" use="literal"> <parameter name="className" value="meinpackage.MeineWebServiceKlasse" /> <parameter name="allowedMethods" value="*" /> <parameter name="scope" value="Request" /> </service> </deployment>
Verfahren Sie entsprechend für folgenden Undeployment Descriptor 'undeployMeinWebService.wsdd':
<undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <service name="MeinWebServiceName" /> </undeployment>
Starten Sie Tomcat über das Katzen-Icon in Eclipse.
Öffnen Sie ein Kommandozeilenfenster ('Start' | 'Alle Programme' | 'Zubehör' | 'Eingabeaufforderung') und geben Sie bei aktivem Tomcat folgende Befehle ein (unter Windows XP können Sie den Kommandotext im Webbrowser mit gedrückter Maustaste markieren, mit 'Strg+C' zwischenspeichern und irgendwo im Kommandozeilenfenster mit rechter Maustaste, 'Einfügen' und 'Return' ausführen):
cd \MeinWorkspace\MeinWebServiceProjekt\WEB-INF
set CLASSPATH=.;lib/activation.jar;lib/axis.jar;lib/axis-ant.jar;lib/commons-discovery.jar;lib/commons-logging.jar;lib/jaxrpc.jar;lib/log4j.jar;lib/mail.jar;lib/saaj.jar;lib/wsdl4j.jar
javac -d classes src/meinpackage/MeineWebServiceKlasse.java
java org.apache.axis.client.AdminClient -s /MeinWebServiceProjekt/services/AdminService deployMeinWebService.wsdd
Testen Sie folgende Aufrufe:
http://localhost:8080/MeinWebServiceProjekt/services/MeinWebServiceName
http://localhost:8080/MeinWebServiceProjekt/services/MeinWebServiceName?wsdl
Falls Sie den Web Service wieder deaktivieren wollen, geben Sie im Kommandozeilenfenster ein:
java org.apache.axis.client.AdminClient -s /MeinWebServiceProjekt/services/AdminService undeployMeinWebService.wsdd
Die Aktivierung und Deaktivierung können Sie auch anhand des Eintrags '<service name="MeinWebServiceName" ...' in der Datei 'server-config.wsdd' verfolgen.
Im Web Service Deployment Descriptor 'deployMeinWebService.wsdd' sorgt die Zeile
<service name="MeinWebServiceName" provider="java:RPC" style="wrapped" use="literal">
dafür, dass der Binding-Style und -Use des Web Services auf 'Document / literal' eingestellt wird. Diese Einstellung ist notwendig für WS-I Basic Profile compliance und Kompatibilität mit Microsofts .NET.
Verwenden Sie mit der Axis-Version 1.2 nicht 'style="document" use="literal"' statt 'style="wrapped" use="literal"', da es damit in der WSDL-Beschreibung zu Fehlern bei Methoden mit mehreren Parametern kommt, die, statt zu einem 'complexType' kombiniert zu werden, im 'message'-Body als mehrere 'part'-Elemente eingetragen werden, was bei 'Document / literal' anders als bei 'RPC / encoded' nicht erlaubt ist.
Wenn Sie statt 'Document / literal' lieber 'RPC / encoded' verwenden wollen, ändern Sie 'style="wrapped" use="literal"' zu 'style="rpc" use="encoded"' (oder lassen beide Parameter weg, da dies bei Axis 1.2 der Default ist). Undeployen Sie und deployen erneut. Sehen Sie sich die Unterschiede in der WSDL-Beschreibung an.
Falls Sie den gerade generierten Web Service mit einem JSP-Client testen wollen, können Sie das folgendermaßen:
Downloaden Sie die Apache Jakarta IO Taglib (z.B. 'jakarta-taglibs-io-20050627.zip') von http://www.apache.org/dist/jakarta/taglibs/io/jakarta-taglibs-io-current.zip (oder http://cvs.apache.org/builds/jakarta-taglibs/nightly/projects/io/jakarta-taglibs-io-...zip).
Entpacken Sie das Archive und kopieren Sie daraus die
'taglibs-io.tld'-Datei in Ihr
'<MeinWorkspace>/MeinWebServiceClient/WEB-INF'-Verzeichnis
und die 'taglibs-io.jar'-Datei in Ihr
'<MeinWorkspace>/MeinWebServiceClient/WEB-INF/lib'-Verzeichnis.
Im Editorfenster erscheint die Datei 'WsClient.jsp'.
Fügen Sie folgenden Inhalt ein (und speichern Sie mit 'Ctrl+S'):
<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> <%@ taglib uri="/WEB-INF/taglibs-io.tld" prefix="io" %> <% final String urlLocalhost = "http://localhost:8080/MeinWebServiceProjekt/services/MeinWebServiceName"; String url = request.getParameter( "url" ); String job = request.getParameter( "job" ); String val = request.getParameter( "val" ); url = ( null != url ) ? url.trim() : urlLocalhost; job = ( null != job ) ? job.trim() : "Wurzel"; val = ( null != val ) ? val.trim() : "64"; %> <html> <head> <title>Mein Web Service Client</title> </head> <body> <h2>Mein Web Service Client</h2> <form method="post"><pre> Enpoint-URL : <input type="text" name="url" value='<%= url %>' size=80> Quadrat oder Wurzel: <input type="text" name="job" value='<%= job %>' size=20> Wert : <input type="text" name="val" value='<%= val %>' size=20> <input type="submit" name="submit" value="Rechnen"> </pre></form> <h3><hr>meineWebServiceMethode( "<%= job %>", <%= val %> ) --> <% out.flush(); %> <io:soap url="<%= url %>" SOAPAction=""> <io:body> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <m:meineWebServiceMethode xmlns:m="http://meinpackage"> <in0><%= job %></in0> <in1><%= val %></in1> </m:meineWebServiceMethode> </SOAP-ENV:Body> </SOAP-ENV:Envelope> </io:body> </io:soap> <hr></h3> </body> </html>
.war-Datei
Zur Distribution und zum Deployment von Java-EE-Webanwendungen werden die JSP-, Servlet-, JavaBean-Dateien, .jar-Libs und weitere benötigten Dateien in eine .war-Datei zusammengepackt (Web-Archiv).
Ant build.xml
Das Erstellen der .war-Datei erfolgt normalerweise mit 'Ant' und zum Beispiel folgendem 'Ant'-Skript 'build.xml':
<project name="MeinWebAppProjekt" default="all"> <property name="distname" value="MeineWebApp" /> <property name="distpath" value="dist" /> <property name="servlet.jar" value="/Tools/Tomcat/common/lib/servlet-api.jar" /> <path id="compile.classpath"> <fileset dir="WEB-INF/lib" /> <pathelement path="${servlet.jar}" /> <pathelement path="WEB-INF/classes" /> <pathelement path="${classpath}" /> </path> <target name="clean"> <delete dir="WEB-INF/classes" /> <mkdir dir="WEB-INF/classes" /> </target> <target name="compile"> <javac srcdir="WEB-INF/src" destdir="WEB-INF/classes"> <classpath refid="compile.classpath" /> </javac> </target> <target name="dist"> <mkdir dir="${distpath}" /> <war destfile="${distpath}/${distname}.war" webxml="WEB-INF/web.xml"> <classes dir="WEB-INF/classes" /> <fileset dir="." includes="WEB-INF/*.*, WEB-INF/lib/*.*" excludes="**/WEB-INF/web.xml" /> </war> </target> <target name="all" depends="clean,compile,dist" /> </project>
Wenn Sie im Verzeichnis der 'build.xml'-Datei 'Ant' aufrufen, wird die .war-Datei im 'distpath'-Verzeichnis generiert.
Sysdeo Eclipse Tomcat Plug-in
Wenn Sie nicht so genau steuern wollen, welche Dateien in der .war-Datei enthalten sein sollen, können Sie alternativ mit Eclipse das oben bereits erwähnte Sysdeo Eclipse Tomcat Plug-in zur Erstellung der .war-Datei verwenden:
Lokal deployen
Remote deployen
Falls unter Windows entwickelt wird und die .war-Datei auf einen entfernten Unix- oder Linux-Server über eine SSH-Verbindung (Secure Shell) kopiert werden soll, kann dies zum Beispiel mit 'PuTTY' und 'PSCP' (PuTTY Secure Copy client) über folgende Kommandos erfolgen:
pscp.exe MeineWebApp.war MeinLoginName@MeineZielDomain.de:/home/MeinLoginName/
putty.exe MeineZielDomain.de
cd /home/MeinLoginName
chmod 755 MeineWebApp.war
cp MeineWebApp.war /usr/local/Tomcat/webapps
cd /usr/local/Tomcat/webapps
ls -l
Unter 'webapps' muss nach wenigen Sekunden ein neues Verzeichnis mit dem Namen 'MeineWebApp' entstehen. Darunter finden Sie die entpackten Dateien.
Bei Problemen sollten Sie sich als Erstes die Logdateien ansehen:
cd /usr/local/Tomcat/logs
less catalina<aktuellesDatum>.log
Ein erster Test der Webapplication kann lokal auf dem Server über PuTTY mit dem Textbrowser 'w3m' erfolgen:
w3m http://localhost:8080/MeineWebApp
Wenn Router und Firewalls entsprechend konfiguriert sind, kann die Webanwendung von außen erreicht werden über:
Mit JPDA / JDWP (z.B. auf Java EE Application Servern) ist Remote Debugging möglich, also das Debuggen auf entfernten Rechnern. Details zu den Verbindungsparametern finden Sie unter Connection and Invocation Details.
Starten Sie Ihre Anwendung auf dem entfernten Host-Rechner unter Angabe passender Debugoptionen, zum Beispiel für Tomcat, JBoss, WebLogic und OC4J mit:
-agentlib:jdwp=transport=dt_socket,address=<JdwpDebugPort>,server=y,suspend=n
Damit zum Beispiel Tomcat mit den genannten Debug-Optionen startet, setzen Sie die Umgebungsvariablen 'JPDA_ADDRESS=<JdwpDebugPort>' und 'JPDA_TRANSPORT=dt_socket' und starten Tomcat nicht über 'startup.bat' sondern über 'catalina.bat jpda start' (im '<tomcat-root>/bin'-Verzeichnis).
Ersetzen Sie jeweils '<JdwpDebugPort>' durch eine Portnummer, zum Beispiel '8787'.