jsf problem

terravotion

Erfahrenes Mitglied
Hallo zusammen

Ich hab gerade erst begonnen mit Java Server Faces zu arbeiten.

Was ich machen will:
Seite 1: Der User gibt seinen Namen ein und klickt auf submit
Nun wird der Wert in ein ManagedBean geschrieben
Seite 2: Der Name wird ausgelesen

Das hab ich nun relativ auch geschafft...
Nur bekomm ich immer den Error:
Code:
javax.faces.application.ViewExpiredException: viewId:/eingabe.faces - View /eingabe.faces could not be restored.
	com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:206)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:266)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:132)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:73)
	com.sun.enterprise.web.VirtualServerPipeline.invoke(VirtualServerPipeline.java:120)
	org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:231)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.invokeAdapter(ProcessorTask.java:667)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.processNonBlocked(ProcessorTask.java:574)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:844)
	com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:287)
	com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:212)
	com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)
	com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:75)

Was heisst das? Ich kann mir das nicht erklären =(
Ich hab mich an dem Tutorial von jsf-forum.de orientiert.


Grüsse,
Hunab
 
Ohne deinen code zu kennen bräuchten wir eine Glaskugel um dir zu helfen. Meine ist aber gerade in Reparatur denn sie war leider nicht immer zuverlässig.
 
RedirecterData.java liegt in nem Package...
Code:
package net.terravotion.jsf.redirect;

public class RedirecterData {
	public String Name = "sara";
	
	public String getName() {
		return Name;
	}
	
	public void setName(String name) {
		Name = name;
	}
}
Initialisiere ich den String Name ohne Inhalt gibts den Fehler ganz untern!


web.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <context-param>
    <param-name>javax.faces.CONFIG_FILES</param-name>
    <param-value>/WEB-INF/faces-config.xml</param-value>
  </context-param>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
  </servlet-mapping>
</web-app>


faces-config.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

<faces-config>

	<managed-bean>
		<managed-bean-name>Name</managed-bean-name>
		<managed-bean-class>net.terravotion.jsf.redirect.RedirecterData</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	
	<navigation-rule>
		<description>Weiterleitung</description>
			<from-view-id>/eingabe.jsp</from-view-id>
		<navigation-case>
			<from-action>success_eingabe</from-action>
			<to-view-id>/ausgabe.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>	
</faces-config>

index.jsp
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">   
    <title>index.jsp -> redirector</title>
  </head>
  
  <body>
    <jsp:forward page="/eingabe.faces" />
  </body>
</html>

eingabe.jsp
Code:
<%@ page language="java"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>eingabe.jsp</title>
  </head>
  
  <body>
  	<f:view>
   		<h:form>
    		Bitte Name eingeben:<h:inputText value="#{RedirecterData.Name}"></h:inputText>
    		<h:commandButton action="success_eingabe" value="submit"/>
    	</h:form>
    </f:view>
  </body>
</html>

ausgabe.jsp
Code:
<%@ page language="java"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">  
    <title>ausgabe.jsp</title>
  </head>
  
  <body>
    Die Eingabe war:<h:outputText value="#{RedirecterData.Name}" />
  </body>
</html>

Fehler wenn String Name nicht mit Inhalt initialisiert wurde:
Code:
type Exception report

message 

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

exception 

javax.servlet.ServletException: Target Unreachable, identifier 'RedirecterData' resolved to null
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:73)
	com.sun.enterprise.web.VirtualServerPipeline.invoke(VirtualServerPipeline.java:120)
	org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:231)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.invokeAdapter(ProcessorTask.java:667)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.processNonBlocked(ProcessorTask.java:574)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:844)
	com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:287)
	com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:212)
	com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)
	com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:75)


root cause 

javax.el.PropertyNotFoundException: Target Unreachable, identifier 'RedirecterData' resolved to null
	com.sun.el.parser.AstValue.getTarget(AstValue.java:66)
	com.sun.el.parser.AstValue.getType(AstValue.java:55)
	com.sun.el.ValueExpressionImpl.getType(ValueExpressionImpl.java:180)
	com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:129)
	javax.faces.component.UIInput.getConvertedValue(UIInput.java:943)
	javax.faces.component.UIInput.validate(UIInput.java:868)
	javax.faces.component.UIInput.executeValidate(UIInput.java:1078)
	javax.faces.component.UIInput.processValidators(UIInput.java:670)
	javax.faces.component.UIForm.processValidators(UIForm.java:229)
	javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1039)
	javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:672)
	com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:100)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:266)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:132)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:73)
	com.sun.enterprise.web.VirtualServerPipeline.invoke(VirtualServerPipeline.java:120)
	org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:231)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.invokeAdapter(ProcessorTask.java:667)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.processNonBlocked(ProcessorTask.java:574)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:844)
	com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:287)
	com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:212)
	com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)
	com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:75)
ich denke mal das ist alles...
 
Hier:

XML:
<managed-bean>
		<managed-bean-name>Name</managed-bean-name>	<managed-bean-class>net.terravotion.jsf.redirect.RedirecterData</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>

definierst du eine ManagedBean mit Namen: Name

Greifst aber auf eine ManagedBean mit Namens: RedirecterData zu

Bitte Name eingeben:<h:inputText value="#{RedirecterData.Name}">


ändere also:
<managed-bean-name>Name</managed-bean-name>
in:
<managed-bean-name>RedirecterData</managed-bean-name>

Wenn du sonst keinen Fehler mehr hast, sollte es gehen :)
 
Zuletzt bearbeitet von einem Moderator:
Ähm ich denke wir sind immer näher =):
Und ehrm, lach mich bitte nicht aus aber was wir als Property verstanden?
Code:
javax.servlet.ServletException: The class 'net.terravotion.jsf.redirect.RedirecterData' does not have the property 'Name'.
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:775)
	org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:742)
	org.apache.jsp.index_jsp._jspService(index_jsp.java:72)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:353)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:409)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:317)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
	com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:73)
	com.sun.enterprise.web.VirtualServerPipeline.invoke(VirtualServerPipeline.java:120)
	org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:231)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.invokeAdapter(ProcessorTask.java:667)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.processNonBlocked(ProcessorTask.java:574)
	com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:844)
	com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:287)
	com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:212)
	com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)
	com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:75)
 
Bei:
Code:
public String getName() {
		return Name;
	}
	
	public void setName(String name) {
		Name = name;
	}

ist dein property name und nicht Name :)

Verwirrt?

ich erklärs:

Es gibt eine Namesregel. Das Property wird durch get und set Methoden bestimmt. Jedoch in den Get / Set Methoden wird der erste Buchstabe gross geschrieben, dennoch ist der Name des Properties mit 1. kleinem Buchstaben.

Heisst:

getVorname() u. setVorname() => property: vorname
getVorName() u. setVorName() => property: vorName

und deshalb auch:

getName() u. setName() => property: name

Daher musst du deinen Code ändern das diese Zeile:
Bitte Name eingeben:<h:inputText value="#{RedirecterData.Name}"></h:inputText>
so aussieht:
Bitte Name eingeben:<h:inputText value="#{RedirecterData.name}"></h:inputText>

Wenn du getestet hast und es funktioniert (sollte nun doch ;) ) dann solltest du nochwas ändern:

Code:
public class RedirecterData {
	public String Name = "sara";
	
	public String getName() {
		return Name;
	}
	
	public void setName(String name) {
		Name = name;
	}
}

ändern in:
Code:
public class RedirecterData {
	private String name = "sara";
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
}

Nicht weil es vorher nicht richtig gewesen wäre, sondern eher weil es bestimmte Styleguides gibt in Java die mann sich angewöhnen sollte :) Denn alle Bücher und
alle Beispiele usw in Java sind danach geschrieben. Zudem solltest du die Membervariable auf "private" setzen. Denn deine Getter und Setter sorgen für den Zugriff. Grundsätzlich solltest du eigentlich Membervariablen IMMER auf private setzen (auf jedenfall im Zweifelsfall ;) ) und den Zugriff über Getter und Setter regeln.


Nur um das kurz mal anzureissen:

Membervariablen: beispiel: private String name; <-- immer mit 1. Buchstaben klein. Bei zusammengesetzen Variablen Namen sieht das dann so aus:
private Object pdfRenderer;
private PersonFactory personFactory;
pirvate ZigarrettenSchachtel zigarrettenSchachtel; :)

Methoden fangen immer mit kleinem Buchstaben an (im Gegensatz zu C# wo das mit grossem Buchstaben anfängt):

Java:
myWriter.writeString();
C#:
myWriter.WriteString();

Der Vorteil ist wenn du siehst das etwas mit einem grossen Buchstaben anfängt das es ein Klassenname ist (oder eine statische Klassenvariable)


statische Klassenvariablen
private static final int STATE_OPEN = 1;

Beispiel in der Verwendung:

if(myobj.getState()==STATE_OPEN)
machWasTolles();
 
Herzlichen Dank.

Ich hab noch nen Fehler gefunden:
Code:
<%@ page language="java"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">  
    <title>ausgabe.jsp</title>
  </head>
  
  <body>
    <f:view>
        Die Eingabe war:<h:outputText value="#{RedirecterData.Name}" />
    </f:view>
  </body>
</html>
muss es sein in ausgabe.jsp sein... es fehlten die <f:view> tags
 

Neue Beiträge

Zurück