J'ai une application JSF contenant deux pages JSP qui affichent certaines des mêmes données à partir d'un objet conteneur de portée session. Chaque page affiche les données différemment, chacune dans une table de données qui varie entre les pages. Tout cela fonctionne correctement jusqu'à présent. Mon problème est que j'ai triché un peu avec la façon dont je devine quelle page a été demandée à l'intérieur de mes méthodes d'action de haricot de support. Sur chaque page, j'ai utilisé une liaison pour ma table de données.JSF - Comment déterminer la page JSP actuelle à partir de la méthode d'action du bean backing
draftReport.jsp:
<t:dataTable
border="1"
id="reportDraftDataTable"
binding="#{controller.reportDraftDataTable}"
value="#{sessionData.reportDraftAdapterList}"
var="currentRow"
rowClasses="dataTableOddRow, dataTableEvenRow">
report.jsp:
<t:dataTable
border="1"
id="reportDataTable"
binding="#{controller.reportDataTable}"
value="#{sessionData.reportAdapterList}"
var="currentRow"
rowClasses="dataTableOddRow, dataTableEvenRow">
I ont un grain support demande de portée (nommé Controller
) avec certaines des méthodes d'action pour ces pages Plutôt que de dupliquer du code sur le bean backing (une méthode similaire pour chaque page JSP similaire), je voulais savoir quelle page était rendue et l'utiliser comme paramètre pour une méthode de gestionnaire générique (capable de gérer les actions des deux pages) le haricot backing. Donc, j'ai triché et fait ceci:
public class Controller {
...
private HtmlDataTable preArrivalReportDataTable;
private HtmlDataTable preArrivalReportDraftDataTable;
private static enum ReportType {
NON_DRAFT,
DRAFT
}
...
private ReportType determineReportTypeFromControlBindings() {
Validate.isTrue(this.preArrivalReportDataTable != null^
this.preArrivalReportDraftDataTable != null,
"Either preArrivalReportDataTable XOR " +
"preArrivalReportDraftDataTable must be null in " +
"determineReportTypeFromControlBindings()");
if (this.preArrivalReportDataTable != null) {
return ReportType.NON_DRAFT;
} else {
return ReportType.DRAFT;
}
}
...
public String actionOnReport() {
ReportType reportType = null;
reportType = determineReportTypeFromControlBindings();
handleReportAction(reportType);
return "REFRESH";
}
...
}
Cela a fonctionné OK méthodes d'action à l'intérieur de ma classe de contrôleur, mais je besoin d'ajouter une autre méthode qui a finalement brisé mon code aki:
public String getStyleClass() {
ReportType reportType = determineReportTypeFromControlBindings();
switch (reportType) {
case NON_DRAFT:
return "styleA";
case DRAFT:
return "styleB";
default:
return null;
}
}
Dans mon JSP , l'expression JSF-EL est située au-dessus de la liaison de contrôle pour la table de données que j'utilise dans le bean de support pour déterminer à quelle page je suis. À ce stade, le determineReportTypeFromControlBindings()
lève une exception lors de la vérification de validation, vraisemblablement parce que la liaison de contrôle n'a pas encore eu lieu.
Je ne suis pas surpris que cela se produise. Il a toujours eu l'impression d'être dans le mauvais sens. Mais ma question est:
Quelle est la bonne façon de déterminer la page JSP actuellement demandée à partir d'une méthode d'action de haricot de support à la demande?
Dans le cas où cela est pertinent, j'utilise la bibliothèque de balises MyFaces 1.2 Tomahawk.
Vous ne pouvez pas créer un contrôleur approprié, séparé du bean View/Data que vous transmettez à JSF pour le rendu? Une conception claire de MVC serait presque certainement meilleure que le piratage de contrôleur sur votre modèle. –