JSP mit JSTL findet Property nicht

wakoz

Erfahrenes Mitglied
HI

Ich habe eine Kleine Web Anwendung zur Übung Geschrieben, nun bin ich dabei alles von JSP mit Java Code zu JSP mit JSTL umzustellen.

Mein Katalog meines kleinen Buchshops funktioniert soweit mit JSTL nur wenn ich nun vom Katalog zum Warenkorb Wechsel findet das JSP die Java Methoden nicht :confused:

Mein Warenkorb.jsp
HTML:
<jsp:useBean id="warenkorb" scope="session" class="model.Warenkorb" />
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1" import="model.*,java.text.DecimalFormat"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<%@page import="controler.ControllerAction"%><html
	xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Warenkorb.jsp</title>
</head>
<body>


<%@ include file="/view/Banner.jsp"%>

<c:set var="warenkorb" value="${sessionScope.warenkorb}"/>
<em>Es befinden sich <c:out value="${warenkorb.anzahlbuecher}"></c:out> Elemente im Warenkorb.</em>

<br />
<br />

<table>
	<tr>
		<th colspan="4">Warenkorb</th>
	</tr>
	
	<c:forEach items="${warenkorb.warenkorbelemente}" var="element">
	<tr>
		<td>
		
			${element.anzahl}
		x</td>
		<td>
		
			${element.buch.autor}
		
		</td>
		<td><a
			href="Controller?action=<%=ControllerAction.BUCH_ANZEIGEN.getAction()%>&isbn=
						${element.buch.isbn}">
		
			${element.buch.buch}
		 </a></td>
		<td>
			${element.gesamtpreis}
		 &euro;</td>
		<td><a
			href="Controller?action=<%=ControllerAction.BUCH_HERAUSNEHMEN.getAction()%>&isbn=${element.buch.isbn}">
		Buch l&ouml;schen </a></td>
	</tr>
	
	</c:forEach>


	<tr>
		<td colspan="3"><strong>Gesamtpreis</strong></td>
		<td>
		
			${warenkorb.gesamtpreis})
		 &euro;</td>
	</tr>

</table>

<a href="Controller?action=<%=ControllerAction.KATALOG_ANZEIGEN.getAction()%>"> &laquo;
zurück zum Katalog </a>

<a href="Controller?action=<%=ControllerAction.BUCH_BESTELLEN.getAction()%>"> Bücher
bestellen &rarr; </a>

</body>
</html>
Mein Controller
Code:
package controler;

import java.io.IOException;

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

import model.Buch;
import model.Katalog;
import model.Warenkorb;

/**
 * Servlet implementation class BuchladenServlet
 */
public class Controller extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 58268476537320082L;

	public static String KATALOG = "web.model.Katalog";
	public static String WAHRENKORB = "web.model.Warenkorb";

	private Katalog katalog;
	private Warenkorb warenkorb;
	private Buch buch;
	private RequestDispatcher requestDispatcher;
	private HttpSession httpSession;
	private HttpServletRequest request;
	private HttpServletResponse response;
	private ServletContext context;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public Controller() {
		super();
	}

	public void init() {

	}

	public void destroy() {

	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		this.request = request;
		this.response = response;

		this.httpSession = this.request.getSession();

		this.context = getServletContext();

		this.warenkorb = (Warenkorb) this.httpSession.getAttribute("warenkorb");
		if (warenkorb == null) {
			this.warenkorb = new Warenkorb();
			this.httpSession.setAttribute("warenkorb", warenkorb);
		}

		this.katalog = (Katalog) this.context.getAttribute("katalog");
		if (katalog == null) {
			this.katalog = Katalog.erzeuge();
			this.context.setAttribute("katalog", katalog);
		}

		String actionParameter = request.getParameter("action");
		ControllerAction action = getAction(actionParameter);

		String isbn = request.getParameter("isbn");

		switch (action) {
		case KATALOG_ANZEIGEN:
		default:
			katalogAnzeigen();
			break;
		case BUCH_ANZEIGEN:
			zeigeBuchInfoAn(isbn);
			break;
		case BUCH_HINZUFUEGEN:
			fuegeBuchinWarenkorbHinzu(isbn);
			break;
		case BUCH_HERAUSNEHMEN:
			nehmeBuchAusWarenkorbHeraus(isbn);
			break;
		case WARENKORB_ANZEIGEN:
			warenkorbAnzeigen();
			break;
		case BUCH_BESTELLEN:
			bestellungabschicken();
			break;
		}

	}

	private void bestellungabschicken() throws ServletException, IOException {
		request.setAttribute("warenkorbElemente", warenkorb
				.getWarenkorbElemente());

		forwardTo("/Bestellen");
		
	}

	/**
	 * @throws IOException
	 * @throws ServletException
	 * 
	 */
	private void katalogAnzeigen() throws ServletException, IOException {
		request.setAttribute("katalogBuecher", katalog.getAlleBuecher());

		forwardTo("/Katalog");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
	}

	private void zeigeBuchInfoAn(String isbn) throws ServletException, IOException {
		buch = katalog.getBuchInfo(isbn);
		request.setAttribute("buch", buch);

		forwardTo("/Buch");
	}

	private void fuegeBuchinWarenkorbHinzu(String isbn)
			throws ServletException, IOException {
		buch = katalog.getBuchInfo(isbn);
		warenkorb.setWarenkorbElement(buch.getIsbn(), buch);
		httpSession.setAttribute("warenkorb", warenkorb);
		request.setAttribute("buch", buch);
		request.setAttribute("katalogBuecher", katalog.getAlleBuecher());

		forwardTo("/Katalog");

	}

	private void nehmeBuchAusWarenkorbHeraus(String isbn)
			throws ServletException, IOException {
		buch = katalog.getBuchInfo(isbn);
		warenkorb.loescheWarenkorbElement(buch.getIsbn());
		httpSession.setAttribute("warenkorb", warenkorb);
		request.setAttribute("warenkorbElemente", warenkorb
				.getWarenkorbElemente());

		forwardTo("/Warenkorb");

	}

	private void warenkorbAnzeigen() throws ServletException, IOException {
		httpSession.setAttribute("warenkorb", warenkorb);
		request.setAttribute("warenkorbElemente", warenkorb.getWarenkorbElemente());

		forwardTo("/Warenkorb");
	}

	private void forwardTo(String url) throws ServletException, IOException {
		requestDispatcher = context.getRequestDispatcher(url);
		requestDispatcher.forward(request, response);
	}

	/**
	 * @param actionParameter
	 * @return
	 */
	private ControllerAction getAction(String actionParameter) {
		ControllerAction action = ControllerAction.KATALOG_ANZEIGEN;;

		if (actionParameter != null)
			for (ControllerAction act : ControllerAction.values()) {
				if (act.getAction().equals(actionParameter)){
					action = act;
					break;
//					action = ControllerAction.valueOf(actionParameter);
					
				}
			}

		return action;
	}

}
ich weiß mein Warenkorb kommt mindestens bis zum Controller. Fehler sind wenn entweder Zwischen Controller oder direckt im JSP

der StackTrace verräht mir das im JSP zeile 20 der Fehler ist. Das Property welches nicht gefunden wird ist eine Methode aus der Java Klasse Warenkorb, was aber nicht sein kann da vorher alles funktionierte erst bei der umstellung von Java zu JSTL im JSP funktioniert es nicht mehr.

die Java Klasse Warenkorb spare ich mir vorerst da ich vermute das das Warenkorb Objekt nicht ordnugsgemäß übergeben wird. Aber ich weiß nicht was ich falsch mache :(
 
Öm ja bei Web Anwendungen sprich JSP ist der auch so aussage kräftig :rolleyes:
Der Stack Trace sagt es gibt die Methode nicht, aber sie ist Existent vor der JSTL Umstellung hat alles Funktioniert!


Browser StackTrace
Code:
type Exception report

message 

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

exception 

org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: Property 'anzahlbuecher' not found on type model.Warenkorb
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	controler.Controller.forwardTo(Controller.java:174)
	controler.Controller.warenkorbAnzeigen(Controller.java:169)
	controler.Controller.doGet(Controller.java:98)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


root cause 

javax.el.PropertyNotFoundException: Property 'anzahlbuecher' not found on type model.Warenkorb
	javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:193)
	javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:170)
	javax.el.BeanELResolver.property(BeanELResolver.java:279)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:60)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
	org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:935)
	org.apache.jsp.view.Warenkorb_jsp._jspx_meth_c_005fout_005f0(Warenkorb_jsp.java:260)
	org.apache.jsp.view.Warenkorb_jsp._jspService(Warenkorb_jsp.java:107)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	controler.Controller.forwardTo(Controller.java:174)
	controler.Controller.warenkorbAnzeigen(Controller.java:169)
	controler.Controller.doGet(Controller.java:98)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
Java Stack Trace
Code:
javax.el.PropertyNotFoundException: Property 'anzahlbuecher' not found on type model.Warenkorb
	at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:193)
	at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:170)
	at javax.el.BeanELResolver.property(BeanELResolver.java:279)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:60)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:935)
	at org.apache.jsp.view.Warenkorb_jsp._jspx_meth_c_005fout_005f0(Warenkorb_jsp.java:260)
	at org.apache.jsp.view.Warenkorb_jsp._jspService(Warenkorb_jsp.java:107)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at controler.Controller.forwardTo(Controller.java:174)
	at controler.Controller.warenkorbAnzeigen(Controller.java:169)
	at controler.Controller.doGet(Controller.java:98)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:619)
08.04.2010 09:55:03 org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet Controller threw exception
javax.el.PropertyNotFoundException: Property 'anzahlbuecher' not found on type model.Warenkorb
	at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:193)
	at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:170)
	at javax.el.BeanELResolver.property(BeanELResolver.java:279)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:60)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:935)
	at org.apache.jsp.view.Warenkorb_jsp._jspx_meth_c_005fout_005f0(Warenkorb_jsp.java:260)
	at org.apache.jsp.view.Warenkorb_jsp._jspService(Warenkorb_jsp.java:107)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at controler.Controller.forwardTo(Controller.java:174)
	at controler.Controller.warenkorbAnzeigen(Controller.java:169)
	at controler.Controller.doGet(Controller.java:98)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:619)
 
Ich finde den StackTrace absolut aussagekräftig! Dort steht doch ganz genau, das es keine Methode getAnzahlbuecher() in der Klasse Warenkorb gibt!
Wenn der Rest funktioniert, kannst du ja auch sowas schreiben:
Java:
<em>Es befinden sich ${fn:length(warenkorb.warenkorbelemente)} Elemente im Warenkorb.</em>

Dazu mußt du aber die JSTL Functions einbinden.

Grüße
Peter
 
Danke für deine Antwort :)
Ich finde den StackTrace absolut aussagekräftig! Dort steht doch ganz genau, das es keine Methode getAnzahlbuecher() in der Klasse Warenkorb gibt!
Was meinst du warum der Stack Trace meiner Meinug nach e ist? Genau, weil er mir sagt das eine Methode die Existiert nicht da ist :suspekt:

Eine Methode die nicht da sein soll, aber bereits genutzt wurde! Sie Existiert und sie gibt mit ein Integer zurück, der einfach nur ausgegeben werden soll.
Warum sollte ich also so
]
Wenn der Rest funktioniert, kannst du ja auch sowas schreiben:
Java:
<em>Es befinden sich ${fn:length(warenkorb.warenkorbelemente)} Elemente im Warenkorb.</em>

Dazu mußt du aber die JSTL Functions einbinden.

Grüße
Peter
den wert ermitteln? Der sowieso nicht der Wahrheit entsprechen kann. Denn in jedem Element steckt die Anzahl wie oft das Element im Warenkorb liegt.

Im warenkorb liegt nur ein Generisches Element welches sich aus einem Element und der Anzahl gleicher Elemente besteht. Daher halte ich mir ja gerade hinter der Methode getAnzahlBuecher() die Summe aller Elemente
 
:D der Fehler liegt eindeutig im Warenkorb JSP!

Ich habe ein gesamtes Projekt Funktionstüchtig, nur halt jsp mit Java Code.
Zur Umstellung von JSP mit Java Code zu JSP ohne Java Code habe ich ein neues Projekt angelegt und sämtlichen Code aus dem alten Projekt übernommen.

Meine Fehler suche habe ich soweit abgeschlossen, ich weiß wo der Fehler ist! Nur kapiere ich nicht warum der Fehler auftritt!

Das Warenkorb Objekt kommt über das Bean im JSP an, kann mit java zugriff auch verwendet werden! Nur die Übergabe an JSP klappt nicht, so das es mit ${warenkorb."Methode"} nicht verwendet werden kann. <%= warenkorb."Methode"%> hingegen funktioniert wunderbar.

Und da mir nun anscheinend nichts Übrig bleibt werde ich wenn ich mit dem warenkorb arbeite weiter in meiner jsp file bei java bleiben :mad:
 
Meinetwegen, wenn die Klasse so ein Geheimnis ist! Aber es liegt garantiert nicht an der JSTL! Was mit Scriptlets funktioniert, geht auch mit JSTL, nur wesentlich wartbarer! Übrigens schreibst du in deinem einem Post was von der Methode getAnzahlBuecher(), lt. StackTrace rufst du aber getAnzahlbuecher() auf, IMHO sind in 99% der Fälle Schreibfehler das Problem.

Grüße
Peter
 
Meinetwegen, wenn die Klasse so ein Geheimnis ist! Aber es liegt garantiert nicht an der JSTL! Was mit Scriptlets funktioniert, geht auch mit JSTL, nur wesentlich wartbarer! Übrigens schreibst du in deinem einem Post was von der Methode getAnzahlBuecher(), lt. StackTrace rufst du aber getAnzahlbuecher() auf, IMHO sind in 99% der Fälle Schreibfehler das Problem.

Grüße
Peter

Doch es lag am JSP / JSTL die Konvention wie man Methoden schreibt ist so mies :) Fehler gefunden und in Rechtschreibung korrigiert

Danke
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück