# Problem mit Servlet/JSP



## Kuri34 (12. Dezember 2007)

Hallo bin noch ein ziemlicher Anfänger was Servlets angeht. Ich wollte ein Programm schreiben wo man einfach ein paar Daten eingibt (Name, Email,Text) und diese dann ausgeben. Das Eintragen und senden von der JSP an das Servlet hat auch funktioniert, allerdings funktioniert das Ausgeben der Daten auf der JSP nicht. Ich wollte das ganze mit einer JSP-Aktion machen und nicht mit Java Code. Mein Code sieht folgendermaßen aus:
JSP:

```
<%@ page language= "java" contentType="text/html"%>

<%@ page import="servlets.*"%>



<HTML>
<HEAD>
<TITLE>Philips Servlet Test</TITLE>
</HEAD>

<BODY>



<h1 align="center">Test Eintrag:</h1>

<%out.println(session.getAttribute("speicherbean")); %>



<jsp:getProperty name="speicherbean" property="name"  />


<form action="namen" method="POST">
<table border="0" align="center">
	<tr>
		<td>Namen eingeben :</td>
		<td><input type="text" name="nameneingabe" size="20"></td>
	</tr>
	<tr>
		<td>E-Mail eingeben :</td>
		<td><input type="text" name="maileingabe" size="20"></td>
	</tr>
	<tr>
		<td>Text eingeben :</td>
	</tr>
</table>
<table border="0" align="center">
	<tr>
		<td><textarea name="texteingabe" cols="31" rows="10"></textarea></td>
	</tr>

</table>
<table border="0" align="center">
	<tr>
		<td><input type="SUBMIT" NAME="SUBMIT" VALUE="Senden"></td>
		<td><input type="reset" NAME="RESET" VALUE="Loeschen"></td>
	</tr>
</table>
</form>

</body>

</html>
```
(Das Problem ist dieser Befehl : <jsp:getProperty name="speicherbean" property="name"  /> 
ohne den funktioniert alles einwandfrei.)

Servlet:

```
package servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Namen extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		String name = request.getParameter("nameneingabe");
		String mail = request.getParameter("maileingabe");
		String text = request.getParameter("texteingabe");

		DatenspeicherBean bean = (DatenspeicherBean) request.getSession()
				.getAttribute("speicherbean");
		
		if (bean == null) {
			bean = new DatenspeicherBean();
			request.getSession().setAttribute("speicherbean", bean);
		}

		bean.setName(name);

		
		
		bean.setEmail(mail);
		bean.setText(text);

		RequestDispatcher dispatcher = request
				.getRequestDispatcher("index.jsp");
		dispatcher.forward(request, response);

		
	}

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

		doGet(request, response);

	}
}
```
und als letzes meine Bean:

```
package servlets;

public class DatenspeicherBean {
	/**
	 * 
	 */
	private String name = "unbekannt";
	private String email; 
	private String text;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
   

}
```


Ich wollte zuerst einmal nur den Namen ausgeben lassen und die anderen Daten 
erst wenn das mit Namen funktioniert(deswegen fehlt für Email und Text die Ausgabe).
Hoffe mir kann jmd helfen.
Gruß Kuri


----------



## Kuri34 (14. Dezember 2007)

Hat denn keiner eine Idee?


----------



## Andron (14. Dezember 2007)

Du hast ein Servlet programmiert. Benutze bitte keine Klassennamen wie Name oder so. Zu Testzwecken kannst du dein Servlet auch MyServlet oder BasicServlet nennen.

Was bedeuted <form action="namen">?


> Im einleitenden <form>-Tag geben Sie mit dem Pflichtattribut action an, an welchen URI die Formulardaten beim Absenden des Formular übertragen werden sollen (action = Aktion). Der URI sollte die Adresse eines Programmes auf dem Server-Rechner sein, das die Formulardaten weiterverarbeitet. Üblicherweise handelt es sich dabei um ein CGI-Script, das z.B. in Perl und PHP geschrieben wurde.


In deinem Fall solltest du <form action="Namen"> verwenden.
Hast du auch deine web.xml korrekt definiert?


----------



## Kuri34 (14. Dezember 2007)

Ich denke schon das ich sie richtig konfiguriert habe. Ich poste sie mal sicherheitshalber


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

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=
    "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    
    
    <servlet>
    <servlet-name>Testservlet</servlet-name>
    <servlet-class>servlets.Namen</servlet-class>
    </servlet>
    
    <servlet-mapping>
    <servlet-name>Testservlet</servlet-name>
    <url-pattern>/namen</url-pattern>
    </servlet-mapping>
    
    
  </web-app>
```


----------



## Andron (14. Dezember 2007)

Ach, jetzt ferstehe ich das.
Was kommt denn für eine Fehlermeldung?
Versehe mal dein Code mit einigen Testausgaben. Nach jeder relevanter Anweisung mach mal ein system.out.println("here is 1"); usw.
Dann siehst du, bis wohin dein Programm ausgeführt wird.
Besser wäre es mit dem Debugger zu arbeiten.

Versuch mal vor dem forward noch das:

```
request.getSession().setAttribute("speicherbean", bean);
```

Kannst auch folgendes ausprobieren, also in deiner JSP auf die Bean als Objekt zuzugreifen:

```
<%@ page import="servlets.DatenspeicherBean"%>
<%
DatenspeicherBean bean = (DatenspeicherBean) request.getSession()
				.getAttribute("speicherbean");
out.println(speicherbean.getName());
%>
```
Zu debug-Zwecken noch

```
String name = (String)request.getParameter("nameneingabe");
String mail = (String)request.getParameter("maileingabe");
String text = (String)request.getParameter("texteingabe");
```
und Testausgaben machen:

```
if(name != null) System.out.println("name: "+name);
```


----------



## Kuri34 (17. Dezember 2007)

Hallo danke schon einmal für deine Hilfe. Das mit dem Quellcode vor dem Forward hat nicht funktioniert da kommt die selbe Fehlermeldung. Ich habe den Debugger schon benutzt er geht jedoch komplett durchs Servlet und zeigt erst beim Dispatcher folgenden Fehler an 
:Source not found for ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 303

Im Browser erscheint dann folgender Fehler :
org.apache.jasper.JasperException: Attempted a bean operation on a null object.
Dies passiert allerdings auch wenn der Name keinen null wert hat.

Das mit der Objekt Erzeugung in der JSP Funktioniert zwar aber dann hat das Servlet ja kaum noch eine Funktion und so wie ich es gelesen habe sollte man Javacode ja in einer JSP vermeiden.


----------



## Andron (17. Dezember 2007)

Ok, ich glaube, ich habs kapiert, warum es bei dir nicht geht.
Ablauf:
1. Aufruf von index.jsp
2. Ausfüllen des Formulars
3. ... usw.

Beim Schritt1 hast du in deiner JSP folgendes stehen:

```
<%out.println(session.getAttribute("speicherbean")); %>
<jsp:getProperty name="speicherbean" property="name"  />
```
Die Bean ist aber zu dem Zeitpunkt Null.

Eine Lösung wäre einen Loader zu implementieren, der die Bean vorerzeugt und die Werte mit "" initialisiert.


Habe gerade noch getestet.
Es geht auch, wenn man zuerst das Servlet aufruft. Der forwardet dich dann auf die index.jsp. Dort kannst du deinen Namen eingeben. Nach dem Abschicken erscheint der Name links als Testausgabe. Also funktioniert alles, wenn man das Servlet ZUERST aufruft.

Die Zeile <%@ page import="servlets.*"%> in der JSP kannst du auch löschen.


----------



## Kuri34 (17. Dezember 2007)

Das Funktioniert leider auch nicht ich habe sogar schon eine zweite jsp Seite erstellt ohne
den Befehl : <%out.println(session.getAttribute("speicherbean")); %> welche sozusagen als Startseite dienen sollte. Diese wurde dann auch angezeigt und man konnte den Namen eintragen und abschicken. Jedoch kam dann wieder der selbe Fehler beim dispatchen auf die alte JSP obwohl die bean im Servlet erzeugt wurde. Deswegen bin ich ja auch total ratlos weil es ja eigentlich so funktionieren müsste .


----------



## Andron (17. Dezember 2007)

Kuri34 hat gesagt.:


> Das Funktioniert leider auch nicht ich habe sogar schon eine zweite jsp Seite erstellt ohne
> den Befehl : <%out.println(session.getAttribute("speicherbean")); %> welche sozusagen als Startseite dienen sollte. Diese wurde dann auch angezeigt und man konnte den Namen eintragen und abschicken. Jedoch kam dann wieder der selbe Fehler beim dispatchen auf die alte JSP obwohl die bean im Servlet erzeugt wurde. Deswegen bin ich ja auch total ratlos weil es ja eigentlich so funktionieren müsste .



Was geht denn genau nicht?
Wie gesagt, wenn du zuerst dein Servlet ansprichst, dann geht alles.
http://localhost:8080/App-Name/namen
Du brauchst keine 2 JSP, eine reicht.
Poste bitte deine Klasse noch mal und beschreib genau, wie du es haben möchtest.


----------



## Kuri34 (18. Dezember 2007)

Das mit den 2 JSPs war auch nur ein test. Aber wenn ich auf das Servlet direkt zugreife kommt der selbe Fehler. Ich rufe mit http://localhost:8080/servlets/namen das Servlet auf und es kommt der selber Fehler wie bei der JSP :

```
org.apache.jasper.JasperException: Attempted a bean operation on a null object.
	org.apache.jasper.runtime.JspRuntimeLibrary.handleGetProperty(JspRuntimeLibrary.java:603)
	org.apache.jsp.test_jsp._jspService(test_jsp.java:76)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	servlets.Namen.doGet(Namen.java:41)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
```


----------



## Andron (19. Dezember 2007)

Was steht denn bei dir in Zeile 41?
Kannst du bitte dein Code nochmal posten.
Hier ist mein Code und damit geht's:

```
package servlets;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Namen extends HttpServlet
{

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
	{
		String name = request.getParameter("nameneingabe");
		String mail = request.getParameter("maileingabe");
		String text = request.getParameter("texteingabe");

		System.out.println("Hier ist Servlet Namen: doGet");

		DatenspeicherBean bean = (DatenspeicherBean) request.getSession().getAttribute("speicherbean");

		if (bean == null)
		{
			bean = new DatenspeicherBean();
			request.getSession().setAttribute("speicherbean", bean);
		}

		bean.setName(name);

		bean.setEmail(mail);
		bean.setText(text);

		RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
		dispatcher.forward(request, response);

	}

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

		doGet(request, response);

	}
}
```


```
<%@ page language= "java" contentType="text/html"%>



<HTML>
<HEAD>
<TITLE>Philips Servlet Test</TITLE>
</HEAD>

<BODY>



<h1 align="center">Test Eintrag:</h1>

<%out.println(session.getAttribute("speicherbean")); %>



<jsp:getProperty name="speicherbean" property="name"  />


<form action="namen" method="POST">
<table border="0" align="center">
	<tr>
		<td>Namen eingeben :</td>
		<td><input type="text" name="nameneingabe" size="20"></td>
	</tr>
	<tr>
		<td>E-Mail eingeben :</td>
		<td><input type="text" name="maileingabe" size="20"></td>
	</tr>
	<tr>
		<td>Text eingeben :</td>
	</tr>
</table>
<table border="0" align="center">
	<tr>
		<td><textarea name="texteingabe" cols="31" rows="10"></textarea></td>
	</tr>

</table>
<table border="0" align="center">
	<tr>
		<td><input type="SUBMIT" NAME="SUBMIT" VALUE="Senden"></td>
		<td><input type="reset" NAME="RESET" VALUE="Loeschen"></td>
	</tr>
</table>
</form>

</body>

</html>
```


----------



## Kuri34 (19. Dezember 2007)

Bei mir funktioniert es nichtmal mit deinem Code , bekomme den selben Fehler wie vorher ...


----------



## Andron (19. Dezember 2007)

Poste bitte dein Code.
Wie sieht dein Tomcat-webapp Verzeichnis aus?


----------

