Parameterübergabe einer Seite zu einer anderen Seite in JSF-2.0?
Ich möchte ein parameter übergeben werden, von einer Seite zur anderen.
Jeder Seite wird eine ViewScoped JSF Backing Bean.
Obwohl, ich versuche es mal mit <f:param>
bekomme ich die folgende Fehlermeldung:
wenn ich auf <h:commandLink>
wird navigieren Sie zu einer anderen Seite.
FEHLER :
] Root cause of ServletException.
com.sun.faces.mgbean.ManagedBeanCreationException: Unable to create managed bean ReservationActionBean. The following problems were found:
- The scope of the object referenced by expression #{param.resvDataModel}, request, is shorter than the referring managed beans (ReservationActionBean) scope of view
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:265)
at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
.........
Seite1.xhtml
<p:panelGrid style="margin-top:-1px;" id="dashboard">
<ui:repeat value="#{DashBoard.dayList}" var="day">
<p:row>
<p:column style="background:#C1CDCD;width:100px;">
<h:outputText value="#{day}" style="color:#333333;font-size:13px;">
<f:convertDateTime type="date" pattern="EEE, yyyy-MM-dd"/>
</h:outputText>
</p:column>
<ui:repeat value="#{DashBoard.timeSlot}" var="timeSlot">
<p:column style="background:#C1CDCD;text-align: center;">
<h:outputText value="#{timeSlot}" style="font-size:12px;"/>
</p:column>
</ui:repeat>
</p:row>
<ui:repeat value="#{DashBoard.resourceList}" var="res">
<p:row>
<p:column>
<h:outputText value="#{res.name}" style="font-size:12px;"/>
</p:column>
<ui:repeat value="#{DashBoard.getResvDataModelList(day, res)}" var="model">
<p:column style="background:#{model.colour};" colspan="#{model.section}">
<h:commandLink action="reservation" style="display:block;width:#{model.section * 50}px;height:20px;">
<f:param name="model" value="#{ReservationActionBean.resvDataModel}"/>
<!--h:outputText value="#{model.user}"rendered="#{model.resource.name == res.name ? true : false}"style="font-size:12px;"/-->
</h:commandLink>
</p:column>
</ui:repeat>
</p:row>
</ui:repeat>
</ui:repeat>
</p:panelGrid>
page2.xtml
<h:form id="reservationEntryFrom">
<f:metadata>
<f:viewParam name="resvDataModel" value="#{ReservationActionBean.resvDataModel}"/>
</f:metadata>
<!-- other -->
</h:form>
DashBoard.java
@ManagedBean(name = "DashBoard")
@ViewScoped
public class DashBoard extends BaseBean {
public List<ResvDataModel> getResvDataModelList(
Date date, MeetingRoom meetingRoom) {
//do operation
}
}
ReservationActionBean.java
@ManagedBean(name="ReservationActionBean")
@ViewScoped
public class ReservationActionBean extends BaseBean {
@ManagedProperty("#{param.resvDataModel}")
private ResvDataModel resvDataModel;
//other operations
}
ResvDataModel.java
public class ResvDataModel {
//attribute, getter and sertter
@Override
public boolean equals(Object object) {
return EqualsBuilder.reflectionEquals(this, object);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
- Ich vermute, seine Ursache in der Kombination des c:foreach-und viewscope... Versuchen Sie, ändern Sie Ihre
ReservationActionBean
Rahmen der Sitzung oder ersetzen Sie das c:foreach mit ui:repeat-oder datatable , Blick auf dieses stackoverflow.com/questions/2842401/... - Wenn ich
ui:repeat
kann das Programm nicht Rendern die Ausgabe. Ich weiß nicht, warum? Ich möchte nichtSessionScope
fürReservationActionBean
. - Seine schlechte Idee, c:foreach mit Blick auf Umfang...
ui:repeat
funktioniert jetzt auch inp:panelGrid
vonPrimefaces
? Jeder Weg, ich werde versuchen, verwenden Sieui:repeat
. vielen Dank für Ihre Unterstützung.- Verwenden Sie eine Komponenten-Bibliothek?
- Primefaces 3 + JSF 2.0 verwendet
- Sie benötigen könnten, um Ihre
ui:repeat
innerhalb einerp:column
in Ihremp:panelGrid
- Update ich die ganze Seite code. Können Sie bitte noch einmal überarbeitet?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
@ManagedProperty
ist aufgerufen, nur einmal während des bean ' s construction. Vorstellen, dass der bean im session-scope und die verwaltete Eigenschaft auf ein request-scoped variable (z.B. ein request-parameter), dann werden nur die parameter der ersten Anfrage festgelegt werden würde und es würde nie aktualisiert werden, mit dem geänderten parameter request-Werte in der nachfolgenden Anforderungen nach der session-bean-Konstruktion. Dies wird als unerwünschtes Verhalten. Daher@ManagedProperty
kann nicht auf etwas, das hat einen geringeren Anwendungsbereich als die@ManagedBean
selbst.In diesem speziellen Fall, müssen Sie
<f:viewParam>
statt. Setzen Sie die folgenden inpage2.xhtml
:Siehe auch:
Jedoch, es gibt ein weiteres problem mit diesem Ansatz. Sie sind nicht vorbei -
String
- Objekt als request-parameter. Wäre der Wert nurcom.example.ResvDataModel@hashcode
(oder was auch immer dietoString()
Methode IhrerResvDataModel
- Klasse gibt). Diese information ist nicht ausreichend, um zu rekonstruieren genau an die gewünschteResvDataModel
Instanz.Muss man einige unique identifier oder action-parameter mit dem Wert zusammen, anstatt einen ganzen Komplex von Java-Objekt kann nicht eindeutig dargestellt als eine
String
.<f:viewParam>
impage2.xhtml
wie Sie erwähnen. Aber, ich bekomme immer noch den Fehler. Auch ich update meinen post. Könnten Sie noch einmal überarbeitet? plz,...@ManagedProperty
.