# Prob mit Tomcat und Servlet



## Robout (30. April 2004)

Hi,
ich bin ganz neu bei der Sache und habe folgendes Problem:
Ich habe ein Servlet programmiert und möchte es nun testen.
Ich habe Von SUN das Web Services Developer Pack installiert, welches Tomcat beinhaltet (ich weiß nicht welche Version).
Tomcat selber scheint zu funktionieren - die localhost:8080 funktionier einwandfrei und die examples unter  localhost:8080/servlet-examples lassen sich auch aufrufen.
Ich habe nun in dem gleichen Verzeichnis wie das servlet-examples einen neuen Ordener mit dem Namen Test angelegt und mein Servlet inclusive der ganzen verzeichnisse mit den classen da rein kopiert.
Zusätzlich habe ich ein Verzeichnis WEB-INF angelegt und darin ein web.xml angelegt nach dem Vorbild der examples.
... das klappt nun aber einfach nicht. Wenn ich localhost/test/bla eingebe sagt er das wäre nicht available...

zum Test habe ich das ganze dann einfach in den vorhandene Examples Ordner verschoben und in der web.xml zusätzlich eingetragen, aber auch da passiert das gleiche. Während sich alle anderen Servlets im gleichen Verzeichnisn ausführen lassen, sagt er bei  meinem, "not available".. 
Hat jemand einen Tip woran das liegen kann Ich hab langsam keinen Bock mehr....
Vielen Dank schonmal!
Robin


----------



## Franz Degenhardt (1. Mai 2004)

Hi!

Wenn für deinen context nicht "autoDeploy" aut true gesetzt ist, musst du Tomcat neustarten um die neuen Servlets sehen zu können. Wenn es das nicht ist, könntest du mal deine context-Konfiguration und die web.xml posten.

Grüsse TrueSun


----------



## Robout (2. Mai 2004)

*HILFEklappt immernoch nicht..*

also mit tomcat neustarten hab ich schon versucht.. Aber das mit auf auto stellen,
sollte ich vielleicht mal machen.
Also meine Verzeichnisse sehen so aus:
ich habe das webapps verzeichnis indem auch die beispieldateien liegen.
da habe ich mir einen neuen Ordner angelegt "Gruppenaufgabe"
darin habe ich einen Ordner "WEB-INF" und darin die unten stehende web.xml
dann habe ich in "WEB-INF" einen Ordner "classes" indem meine "servlet1.class" ist mit den dazugehörigen Unterordnern.
Ich habe die web.xml Datei aus dem Beispiel kopiert und editiert. Sonst habe ich nichts weiter gemacht...
Hier ist die web.xml komplett
Vielen Dank schonmal



<?xml version="1.0" encoding="ISO-8859-1"?>

<!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>Servlet 2.4 Examples</display-name>
    <description>
      Servlet 2.4 Examples.
    </description>

    <!-- Define servlet-mapped and path-mapped example filters -->
    <filter>
        <filter-name>Servlet Mapped Filter</filter-name>
        <filter-class>filters.ExampleFilter</filter-class>
	<init-param>
	    <param-name>attribute</param-name>
	    <param-value>filters.ExampleFilter.SERVLET_MAPPED</param-value>
	</init-param>
    </filter>
    <filter>
        <filter-name>Path Mapped Filter</filter-name>
        <filter-class>filters.ExampleFilter</filter-class>
	<init-param>
	    <param-name>attribute</param-name>
	    <param-value>filters.ExampleFilter.PATH_MAPPED</param-value>
	</init-param>
    </filter>
    <filter>
        <filter-name>Request Dumper Filter</filter-name>
        <filter-class>filters.RequestDumperFilter</filter-class>
    </filter>

    <!-- Example filter to set character encoding on each request -->
    <filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>EUC_JP</param-value>
        </init-param>
    </filter>

    <filter>
        <filter-name>Compression Filter</filter-name>
        <filter-class>compressionFilters.CompressionFilter</filter-class>

        <init-param>
          <param-name>compressionThreshold</param-name>
          <param-value>10</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>0</param-value>
        </init-param>
    </filter>

    <!-- Define filter mappings for the defined filters -->
    <filter-mapping>
        <filter-name>Servlet Mapped Filter</filter-name>
	<servlet-name>invoker</servlet-name>
    </filter-mapping>
    <filter-mapping>
        <filter-name>Path Mapped Filter</filter-name>
	<url-pattern>/servlet/*</url-pattern>
    </filter-mapping>


<!-- Example filter mapping to apply the "Set Character Encoding" filter
     to *all* requests processed by this web application -->
<!--
    <filter-mapping>
        <filter-name>Set Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
-->

<!--
    <filter-mapping>
      <filter-name>Compression Filter</filter-name>
      <url-pattern>/CompressionTest</url-pattern>
    </filter-mapping>
-->

<!--
    <filter-mapping>
        <filter-name>Request Dumper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
-->

    <!-- Define example application events listeners -->
    <listener>
        <listener-class>listeners.ContextListener</listener-class>
    </listener>
    <listener>
        <listener-class>listeners.SessionListener</listener-class>
    </listener>

    <!-- Define servlets that are included in the example application -->

    <servlet>
        <servlet-name>Servlet1</servlet-name>
        <servlet-class>Servlet1</servlet-class>
    </servlet>


    <servlet-mapping>
        <servlet-name>Servlet1</servlet-name>
        <url-pattern>/Servlet1</url-pattern>
    </servlet-mapping>

    <security-constraint>
      <display-name>Example Security Constraint</display-name>
      <web-resource-collection>
         <web-resource-name>Protected Area</web-resource-name>
	 <!-- Define the context-relative URL(s) to be protected -->
         <url-pattern>/jsp/security/protected/*</url-pattern>
	 <!-- If you list http methods, only those methods are protected -->
	 <http-method>DELETE</http-method>
         <http-method>GET</http-method>
         <http-method>POST</http-method>
	 <http-method>PUT</http-method>
      </web-resource-collection>
      <auth-constraint>
         <!-- Anyone with one of the listed roles may access this area -->
         <role-name>tomcat</role-name>
	 <role-name>role1</role-name>
      </auth-constraint>
    </security-constraint>

    <!-- Default login configuration uses form-based authentication -->
    <login-config>
      <auth-method>FORM</auth-method>
      <realm-name>Example Form-Based Authentication Area</realm-name>
      <form-login-config>
        <form-login-page>/jsp/security/protected/login.jsp</form-login-page>
        <form-error-page>/jsp/security/protected/error.jsp</form-error-page>
      </form-login-config>
    </login-config>

    <!-- Security roles referenced by this web application -->
    <security-role>
      <role-name>role1</role-name>
    </security-role>
    <security-role>
      <role-name>tomcat</role-name>
    </security-role>

    <!-- Environment entry examples -->
    <!--env-entry>
      <env-entry-description>
         The maximum number of tax exemptions allowed to be set.
      </env-entry-description>
      <env-entry-name>maxExemptions</env-entry-name>
      <env-entry-value>15</env-entry-value>
      <env-entry-type>java.lang.Integer</env-entry-type>
    </env-entry-->
    <env-entry>
      <env-entry-name>minExemptions</env-entry-name>
      <env-entry-value>1</env-entry-value>
      <env-entry-type>java.lang.Integer</env-entry-type>
    </env-entry>
    <env-entry>
      <env-entry-name>foo/name1</env-entry-name>
      <env-entry-value>value1</env-entry-value>
      <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>
    <env-entry>
      <env-entry-name>foo/bar/name2</env-entry-name>
      <env-entry-value>true</env-entry-value>
      <env-entry-type>java.lang.Boolean</env-entry-type>
    </env-entry>
    <env-entry>
      <env-entry-name>name3</env-entry-name>
      <env-entry-value>1</env-entry-value>
      <env-entry-type>java.lang.Integer</env-entry-type>
    </env-entry>
    <env-entry>
      <env-entry-name>foo/name4</env-entry-name>
      <env-entry-value>10</env-entry-value>
      <env-entry-type>java.lang.Integer</env-entry-type>
    </env-entry>

</web-app>


----------



## Franz Degenhardt (3. Mai 2004)

Hey!

Wenn deine Klasse "Servlet1" heisst gehe ich mal davon aus, das du das defaultpackage benutzt, ansonsten müsstest du die package-Angabe bei der "servlet-class" mit angeben, z.B.   
<servlet-class>de.Gruppenaufgabe.Servlet1</servlet-class>. 
Ich glaub nicht, dass du deine web.xml komplett verstehst, nimm lieber die minimalistische Version, dann weisst du auch was passiert. Zum testen ist es ganz  praktisch, das invoker-Servlet zu benutzen. Dieses führt ein automatisches mapping für jedes Servlet durch. 
Mit:
http://localhost:8080/Gruppenaufgabe/servlet/Servlet1  (invoker-mapping)
oder
http://localhost:8080/Gruppenaufgabe/Servlet1 (eigenes mapping)
müsstest du dein servlet sehen.
Ansonsten kannst du ja nochmal den Ausschnitt "Context" aus deiner server.xml posten. Schonmal geschaut ob du Fehlermeldungen in den logs hast?


```
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<!-- minimale web.xml -->

<web-app>
   <display-name>example webapp</display-name>
   <description>your description here</description>
   <context-param>
      <param-name>webmaster</param-name>
      <param-value>webmaster@localhost</param-value>
      <description>
        The EMAIL address of the administrator to whom questions
        and comments about this application should be addressed.
      </description>
   </context-param>

   <servlet>
      <servlet-name>Servlet1</servlet-name>
      <servlet-class>Servlet1</servlet-class>
   </servlet>

   <servlet-mapping>
      <servlet-name>Servlet1</servlet-name>
      <url-pattern>/Servlet1</url-pattern>
   </servlet-mapping>

   <!-- nimm testweise einfach noch das invoker-mapping hinzu -->
   <servlet-mapping>
      <servlet-name>invoker</servlet-name>
      <url-pattern>/servlet/*</url-pattern>
   </servlet-mapping>

</web-app>
```

Grüsse TrueSun


----------



## Robout (5. Mai 2004)

*andere Fehlermeldung*

Hi,
nach unzähligen Stunden Bastelei, habe ich nun folgende Fehlermeldung erreicht,die sich für mich schon heisser anhört:
HTTP Status 500 - 

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException: Servlet.init() for servlet servlet1 threw exception
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:164)
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:833)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:732)
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:619)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:688)
java.lang.Thread.run(Thread.java:534)

root cause 

java.lang.IllegalAccessError: tried to access method dblpbr.DblpMmDb.<init>()V from class dblpbr.Servlet1
dblpbr.Servlet1.init(Servlet1.java:17)
javax.servlet.GenericServlet.init(GenericServlet.java:256)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:164)
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:833)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:732)
org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:619)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:688)
java.lang.Thread.run(Thread.java:534)

note The full stack trace of the root cause is available in the Tomcat logs.
Apache Tomcat/5.0.19

ich komme jetzt immernoch nicht weiter, aber ich nehme an dass die web.xml jetzt korrekt ist -oder?
Danke schonmal für deine Antwort
Robin


----------



## Robout (6. Mai 2004)

*erledigt!*

Hi,
hat sich erledigt. Das Problem lag darin,dass der Klassenpfad auf die benötigte jat irgendwie nicht klappte... Ich hab die einfach entpackt und schon lief es!
Gruß
Robin


----------



## klammer (17. September 2005)

ich habe ein ähnliches problem, vielleicht könnt ihr mir weiterhelfen... wäre dringend 

vielleicht liegt es am kompilieren? (bin anfänger)

was ich bisher gemacht habe und fehlermeldung:

------------


1.	Tomcat Ordnerstruktur erstellen:

<TOMCAT_HOME>/webapps/onjava
=====> images (directory)
=====> WEB_INF
==========> classes
==========> lib

2.	web.xml erstellen in <TOMCAT_HOME>/webapps/onjava/WEB_INF

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">

<web-app>
</web-app>

3.	ServletContext hinzufügen in <TOMCAT_HOME>/conf/server.xml

<Context path="/onjava" docBase="onjava" debug="0" reloadable="true" />

4.	login.jsp erstellen in <TOMCAT_HOME>/webapps/onjava/

<html>
<head>
 <title>OnJava Demo</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#FFFFFF" onLoad="document.loginForm.username.focus()">

 <table width="500" border="0" cellspacing="0" cellpadding="0">
  <tr>
   <td> </td>
  </tr>
  <tr>
  <td>
   </td>
  </tr>
  <tr>
   <td> </td>
  </tr>
 </table>
 <table width="500" border="0" cellspacing="0" cellpadding="0">
  <tr>
   <td>
    <table width="500" border="0" cellspacing="0" cellpadding="0">
     <form name="loginForm" method="post" action="servlet/com.onjava.login">
     <tr>
      <td width="401"><div align="right">User Name: </div></td>
      <td width="399"><input type="text" name="username"></td>
     </tr>
     <tr>
      <td width="401"><div align="right">Password: </div></td>
      <td width="399"><input type="password" name="password"></td>
     </tr>
     <tr>
      <td width="401"> </td>
      <td width="399"><br><input type="Submit" name="Submit"></td>
     </tr>
     </form>
    </table>
   </td>
  </tr>
 </table>
</body>
</html>

5.	Testen der JSP (Tomcat starten)

http://localhost:8080/onjava/login.jsp




6.	welcome.jsp login.jsp erstellen in <TOMCAT_HOME>/webapps/onjava/

<html>
<head>
 <title>OnJava Demo</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

 <table width="500" border="0" cellspacing="0" cellpadding="0">
  <tr>
   <td> </td>
  </tr>
  <tr>
  <td>
   <img src="/onjava/images/monitor2.gif"></td>
  <td>
   <b>Welcome : <%= request.getAttribute("USER")
%></b>
  </td>
  </tr>
  <tr>
   <td> </td>
  </tr>
 </table>
</body>
</html>

7.	kompilieren von login.java

package com.onjava;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class login extends HttpServlet {

 private String target = "/welcome.jsp";

 private String getUser(String username, String password) {

// Just return a static name
  // If this was reality, we would perform a SQL lookup
  return "Bob";
 }

 public void init(ServletConfig config)
  throws ServletException {

  super.init(config);
 }

 public void doGet(HttpServletRequest request,
  HttpServletResponse response)
  throws ServletException, IOException {

  // If it is a get request forward to doPost()
  doPost(request, response);
 }

 public void doPost(HttpServletRequest request,
  HttpServletResponse response)
  throws ServletException, IOException {

  // Get the username from the request
  String username = request.getParameter("username");
  // Get the password from the request
  String password = request.getParameter("password");

  String user = getUser(username, password);

  // Add the fake user to the request
  request.setAttribute("USER", user);

  // Forward the request to the target named
  ServletContext context = getServletContext();

  RequestDispatcher dispatcher =
   context.getRequestDispatcher(target);
  dispatcher.forward(request, response);
 }

 public void destroy() {
 }
}
8.	login.java und login.class speichern in <TOMCAT_HOME>/webapps/onjava/WEB_INF/classes/com/onjava

9.	Servlet Eintrag im web.xml hinzufügen (<TOMCAT_HOME>/webapps/onjava/WEB_INF)

<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.onjava.login</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/servlet/*</url-pattern> 
</servlet-mapping>

10.	Invoker nicht kommentieren in <TOMCAT_HOME>/conf/web.xml

(2 Stellen)

11.	Testen der login.jsp und welcome.jsp (Tomcat neu starten)

http://localhost:8080/onjava/login.jsp


Fehlermeldung 404

ressource onjava/servlet/login not available


----------

