<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<jsp-config>
mit der Verbindung von URI zu TLD-Datei in "web.xml" einfügen)
sind normalerweise nicht nötig, WTP und JBoss sind intelligent genug die zur URI passende TLD-Datei selbst zu finden.
Nur wenn diese nicht eindeutig wäre oder (aus welchen Gründen auch immer nicht identisch ist mit der in der TLD deklarierten)
müssen diese zwei Schritte erfolgen. <managed-bean>
<description>
This Managed Bean performs the calculation of surface and volume of the cube.
It stores a list of all user inputs for the current session.</description>
<managed-bean-name>geometricModelHandler</managed-bean-name>
<managed-bean-class>de.fhw.komponentenarchitekturen.knauf.jsf.GeometricModelHandler</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
private double dblA = 0;
private double dblB = 0;
private double dblC = 0;
public double getA()
{
return dblA;
}
public void setA(double dblA)
{
this.dblA = dblA;
}
public double getB()
{
return dblB;
}
public void setB(double dblB)
{
this.dblB = dblB;
}
public double getC()
{
return dblC;
}
public void setC(double dblC)
{
this.dblC = dblC;
}
private double dblOberflaeche = 0;
private double dblVolumen = 0;
private History history = new History();
public History getHistory()
{
return this.history;
}
public double getVolume()
{
return this.dblVolume;
}
public double getSurface()
{
return this.dblSurface;
}
calculate
zugefügt, die beim Klick auf "Submit" aufgerufen wird und
die Berechnung durchführt sowie die aktuelle Berechnung der Historie zufügt. public String calculate()
{
//Calculate the values and store in member variables:
this.dblVolume = this.dblA * this.dblB * this.dblC;
this.dblSurface = 2 * (this.dblA * this.dblB) + 2 * (this.dblA * this.dblC) + 2 * (this.dblB * this.dblC);
//Add to history
SideLengths sideLengthCurrent = new SideLengths();
sideLengthCurrent.setA(this.dblA);
sideLengthCurrent.setB(this.dblB);
sideLengthCurrent.setC(this.dblC);
this.history.addSideLength(sideLengthCurrent );
//Return value does not matter, because this simple sample has no navigation rules.
return null;
}
Die Rückgabe einer solchen Submit-Methode ist normalerweise eine Navigationsregel die die Zielseite zurückgibt.
Kommt dabei null
zurück so gelangt man automatisch wieder zu der Seite die das Formular abgeschickt hat. public List<SideLengths> getSideLengths()
{
return this.vectorSideLengths;
}
public int getSize()
{
return this.vectorBerechnungen.size();
}
Die Methode getSize
ist nötig um mittels <c:if>
-Tag auf das Vorhandensein von Elementen zu prüfen (nur dann
wird die Tabelle der bereits durchgeführten Berechnungen angezeigt). getSideLengths
liefert die SideLengths
-Objekte als generic Liste zurück. Diese wird später über das JSF-Tag
<h:dataTable>
durchlaufen. <?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Simple JSF sample</title>
</head>
<body>
<f:view>
<h:form id="formGeometricModelInput">
<h:panelGrid columns="3">
<c:if test="${sessionScope.geometricModelHandler.volume > 0.0}">
<h:outputText value="Volume:"/>
<h:outputText id="volume" value="#{geometricModelHandler.volume}"></h:outputText>
<h:outputText value=""></h:outputText>
<h:outputText value="Surface:"/>
<h:outputText id="surface" value="#{geometricModelHandler.surface}"></h:outputText>
<h:outputText value=""></h:outputText>
</c:if>
<h:outputText value="Side a:"></h:outputText>
<h:inputText label="Side A" id="a" value="#{geometricModelHandler.a}"></h:inputText>
<h:message for="a"></h:message>
<h:outputText value="Side b:"></h:outputText>
<h:inputText label="Side B" id="b" value="#{geometricModelHandler.b}"></h:inputText>
<h:message for="b"></h:message>
<h:outputText value="Side c:"></h:outputText>
<h:inputText label="Side C" id="c" value="#{geometricModelHandler.c}"></h:inputText>
<h:message for="c"></h:message>
<h:commandButton id="calculate" value="Calculate" action="#{geometricModelHandler.calculate}"></h:commandButton>
<h:outputText value=""></h:outputText>
<h:outputText value=""></h:outputText>
<%--Print history: --%>
<c:if test="${geometricModelHandler.history.size > 0}">
<%--A DataTable with three columns will contain all calculations of the current session.
The current iteration element will be put in a variable named "sideLengthCurrent" --%>
<h:dataTable value="#{geometricModelHandler.history.sideLengths}" var="sideLengthCurrent">
<h:column>
<f:facet name="header">
<h:outputText value="A"/>
</f:facet>
<h:outputText value="#{sideLengthCurrent.a}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="B"/>
</f:facet>
<h:outputText value="#{sideLengthCurrent.b}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="C"/>
</f:facet>
<h:outputText value="#{sideLengthCurrent.c}"></h:outputText>
</h:column>
</h:dataTable>
</c:if>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<f:view>
<h:form id="formGeometricModelInput">
...
</h:form>
</f:view>
Das "id"-Attribut des "h:form"-Tags ist nötig, weil dieses Beispiel auch für einen JSFUnit-Test verwendet wird. <h:panelGrid columns="3">
...
</h:panelGrid>
Im folgenden beginnt jeweils nach drei Ausdrücken eine neue Zeile. c:if
genutzt. In der Prüfbedingung kann man auf die Managed Bean zugreifen, da diese unter dem in faces-config.xml
deklarierten managed-bean-name
im entsprechenden Scope (hier: Session) liegt. <c:if test="${sessionScope.geometricModelHandler.volume > 0.0}"> ... </c:if>
<h:outputText value="Volume:"/>
<h:outputText id="volume" value="#{geometricModelHandler.volume}"></h:outputText>
<h:outputText value=""></h:outputText>
<h:outputText value="Surface:"/>
<h:outputText id="surface" value="#{geometricModelHandler.surface}"></h:outputText>
<h:outputText value=""></h:outputText>
Zu beachten: in JSF-Tags beginnen Expression-Language-Ausdrücke mit "#".
<h:outputText value="Volume:" rendered="#{geometricModelHandler.volume > 0.0}"/>
<h:outputText id="volume" value="#{geometricModelHandler.volume}" rendered="#{geometricModelHandler.volume > 0.0}"></h:outputText>
<h:outputText value="" rendered="#{geometricModelHandler.volume > 0.0}"></h:outputText>
<h:outputText value="Surface:" rendered="#{geometricModelHandler.volume > 0.0}"/>
<h:outputText id="surface" value="#{geometricModelHandler.surface}" rendered="#{geometricModelHandler.volume > 0.0}"></h:outputText>
<h:outputText value="" rendered="#{geometricModelHandler.volume > 0.0}"></h:outputText>
Geschickter wäre natürlich, diesen Bereich in ein Panel zu setzen und dieses als ganzes ein-/auszuschalten.id
definiert) in die entsprechenden Felder geschrieben.
<h:outputText value="Side a:"></h:outputText>
<h:inputText label="Side A" id="a" value="#{geometricModelHandler.a}"></h:inputText>
<h:message for="a"></h:message>
<h:outputText value="Side b:"></h:outputText>
<h:inputText label="Side B" id="b" value="#{geometricModelHandler.b}"></h:inputText>
<h:message for="b"></h:message>
<h:outputText value="Side c:"></h:outputText>
<h:inputText label="Side C" id="c" value="#{geometricModelHandler.c}"></h:inputText>
<h:message for="c"></h:message>
h:message
ausgeben
(z.B. beim Eingeben von Buchstaben).
Das Attribut for="..."
gibt dabei die ID des Eingabefelds an, dessen Fehler hier ausgegeben werden. Diese Fehlerausgaben sind der Grund,
warum wir im h:panelGrid
drei Spalten haben.label="..."
des h:inputText
definiert einen Text, der in den Fehlermeldungen verwendet wird.
Das führt zu solchen Ausgaben: "Kante A: '0.0a' must be a number between 4.9E-324 and 1.7976931348623157E308 Example: 1999999"label
-Attribut nicht setzen, würde die Fehlermeldung z.B. so aussehen: "j_id_jsp_1992281669_1:a: 'a' must be a number between 4.9E-324 and 1.7976931348623157E308 Example: 1999999"
(man würde also die häßliche interne ID in ihrer ganzen Pracht sehen).h:message
-Element deklariert, so würde wieder die Seite "geometricmodel.jsp" ohne weitere Fehlermeldungen aufgerufen werden, nur in der Server-Konsole
fänden wir die Meldung "21:55:38,890 INFO [lifecycle] WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=j_id_jsp_1992281669_1:a[severity=(ERROR 2), summary=(j_id_jsp_1992281669_1:a: 'a' must be a number consisting of one or more digits.), detail=(j_id_jsp_1992281669_1:a: 'a' must be a number between 4.9E-324 and 1.7976931348623157E308 Example: 1999999)]"h:message
-Element so definieren:<h:message showSummary="true" showDetail="false" for="b"></h:message>
showSummary
ist per Default auf "false", showDetail
ist per Default "true". Ich habe den Default also gerade umgedreht.h:commandButton
abgebildet. Im Attribut action
wird angegeben
welche Methode beim Klick/Abschicken des Formulars aufgerufen werden soll. <h:commandButton id="calculate" value="Calculate" action="#{geometricModelHandler.calculate}"></h:commandButton>
Das folgende h:outputText
-Element erklärt sich daher dass hier eine Tabellenzeile des panelGrid
abgeschlossen wird. <c:if>
-Tag wird geprüft ob Einträge in der Historie vorhanden sind, nur dann werden diese ausgegeben. <h:dataTable>
ausgegeben. <h:dataTable value="#{geometricModelHandler.historieGesamt.sideLengths}" var="sideLengthCurrent">
...
</h:dataTable>
Das Attribut value
gibt an über welche Liste (hier: ein Array aus der Managed Bean) gelaufen werden soll. var
ist ein PageContext-Attribut, in dem das aktuelle SideLengths
-Objekt landet. <h:column>
<f:facet name="header">
<h:outputText value="A"/>
</f:facet>
<h:outputText value="#{sideLengthCurrent.a}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="B"/>
</f:facet>
<h:outputText value="#{sideLengthCurrent.b}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="C"/>
</f:facet>
<h:outputText value="#{sideLengthCurrent.b}"></h:outputText>
</h:column>
Es werden drei Spalten deklariert (<h:column>
). Jede Spalte enthält einen Header, dieser wird durch <f:facet name="header"> deklariert.
Das name
-Attribut erzeugt durch den konstanten Wert header
einen Header, der Überschrift-Text steckt im Inhalt des Tags.
Der Spalteninhalt pro Zeile wird anschließend als Textausgabe deklariert. Dieser stammt aus dem PageContext-Attribut "sideLengthCurrent", es werden in den drei Spalten die Properties
"a", "b" und "c" abgerufen. 21:42:08,009 ERROR [io.undertow.request] (default task-14) UT005023: Exception handling request to /JSF/geometricmodel.jsp: org.apache.jasper.JasperException: java.lang.NullPointerException
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:410) [jastow-1.0.0.Final.jar:1.0.0.Final]
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326) [jastow-1.0.0.Final.jar:1.0.0.Final]
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259) [jastow-1.0.0.Final.jar:1.0.0.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.security.handlers.AuthenticationCallHandler.handleRequest(AuthenticationCallHandler.java:52) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:168) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:687) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [rt.jar:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.7.0_51]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_51]
Caused by: java.lang.NullPointerException
at javax.faces.webapp.UIComponentClassicTagBase.setJspId(UIComponentClassicTagBase.java:1856) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5]
at org.apache.jsp.geometricmodel_jsp._jspx_meth_f_005fview_005f0(geometricmodel_jsp.java:128)
at org.apache.jsp.geometricmodel_jsp._jspService(geometricmodel_jsp.java:103)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:69) [jastow-1.0.0.Final.jar:1.0.0.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:366) [jastow-1.0.0.Final.jar:1.0.0.Final]
... 27 more
java.lang.RuntimeException: Cannot find FacesContext
javax.faces.webapp.UIComponentClassicTagBase.getFacesContext(UIComponentClassicTagBase.java:1763)
javax.faces.webapp.UIComponentClassicTagBase.isIncluded(UIComponentClassicTagBase.java:1647)
javax.faces.webapp.UIComponentClassicTagBase.setJspId(UIComponentClassicTagBase.java:1575)
org.apache.jsp.geometricmodel_jsp._jspx_meth_f_005fview_005f0(geometricmodel_jsp.java:109)
org.apache.jsp.geometricmodel_jsp._jspService(geometricmodel_jsp.java:83)
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:384)
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)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
Die einfachste Lösung wäre, nicht die JSP-Seite aufzurufen, sondern einen Alias der über das Faces-Servlet führt. Das Faces-Servlet behandelt
(siehe obiger Auszug aus "web.xml") alle URLs mit der Endung ".faces", und leitet diese auf die gleichnamige JSP-Seite weiter.
Wir könnten also mittels http://localhost:8080/JSF/geometricmodel.faces
auf die Seite zugreifen. <?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page session="false" language="java" contentType="text/html; charset=ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Test für JSF</title>
</head>
<body>
<h1>JSF-Basics</h1>
<a href="geometricmodel.faces">Zur Startseite</a>
</body>
</html>
Eine Alternative wäre ein direktes Redirect auf die Faces-Seite (kompletter Code der Seite): <%@ page session="false" language="java" contentType="text/html; charset=ISO-8859-1"%>
<% response.sendRedirect("geometricmodel.faces"); %>
21:22:26,194 ERROR [io.undertow.request] (default task-5) UT005023: Exception handling request to /JSF/geometricmodel.faces: javax.servlet.ServletException:
viewId:/geometricmodel.faces - Ansicht /geometricmodel.faces konnte nicht wiederhergestellt werden.
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:659) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5]
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.security.handlers.AuthenticationCallHandler.handleRequest(AuthenticationCallHandler.java:52) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:168) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:687) [undertow-core-1.0.0.Final.jar:1.0.0.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [rt.jar:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.7.0_51]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_51]
Caused by: javax.faces.application.ViewExpiredException: viewId:/geometricmodel.faces - Ansicht /geometricmodel.faces konnte nicht wiederhergestellt werden.
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:210) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:121) [jsf-impl-2.2.5-jbossorg-3.jar:]
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) [jsf-impl-2.2.5-jbossorg-3.jar:]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5]
... 24 more
Dies tritt immer dann auf, wenn man vorher eine Seite offen hatte, die über JSF erzeugt wurde, und diese Seite nach dem Reploy direkt wieder
an den Server abschickt (also z.B. im obigen Beispiel erneut auf den Submit-Button klickt).