Ce que vous demandez est mieux fait en utilisant Facelet templating. Vous pourrez ainsi avoir un modèle de page avec le contenu partagé (le menu de navigation dans votre cas) et hériter du reste des vues.
Que puis-je voir à partir de votre solution suggérée est que vous abusez des appels POST. #{fragmentsPresenter.changeView('viewOne')}
n'a pas de sens juste parce que vous savez déjà où vous voulez aller quand vous appuyez sur ce lien (à viewOne
), donc vous serez mieux en utilisant des liens simples pour cela.
Ici vous avez un exemple montrant comment gérer la navigation de manière appropriée. Supposons que vous avez un contrôleur de vue même vous en aurez pas besoin dans la plupart des cas:
ViewController.java
/**
* Give the scope you want to your bean depending on what are your operations
* oriented to. This example could be @ApplicationScoped as well
*
* @author amaeztu
*
*/
@ManagedBean
@SessionScoped
public class ViewController {
/**
* Just gets the current view path and switches to the other one
*
* @return
*/
public String changeView() {
String viewId = FacesContext.getCurrentInstance().getViewRoot()
.getViewId();
if (viewId.equals("/view1.xhtml")) {
return "/view2";
} else {
return "/view1";
}
}
}
emploi de ce contrôleur est juste pour vérifier ce que vous venez vue de et passer à l'autre. Il est inutile d'effectuer une requête POST (pour envoyer un formulaire) juste pour naviguer vers l'autre vue, alors que vous pourriez l'évaluer avant le rendu de la page.
Vous avez comment la vue du modèle est construit:
template.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head />
<h:body>
<h:form>
<!-- Use POST requests like this only when you have
to determine the destination dinamically at server side -->
<h:commandButton value="Switch View with POST"
action="#{viewController.changeView}" />
<br />
</h:form>
<!-- For plain navigation, use GET requests -->
<h:link value="Go to view 1" outcome="/view1" />
<br />
<!-- Determine where we are at page rendering time
and evaluate the other view path -->
<h:link value="Switch view without POST"
outcome="#{view.viewId eq '/view1.xhtml' ? '/view2' : '/view1'}" />
<br />
<br />
<ui:insert name="content" />
</h:body>
</ui:composition>
Cette page modèle définit un bouton partagé/set de lien et appelle pour le contenu. J'ai implémenté différents types d'options de navigation. L'utilisation de <h:link />
est, dans ce cas, la manière la plus directe. Vérifiez le deuxième lien, ici nous évaluons l'ID de vue en cours quand il est rendu et un lien pour aller à l'opposé est créé. Cool, n'est-ce pas?
Maintenant, voici c'est la mise en œuvre des vues de l'enfant:
view1.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" template="/template.xhtml">
<ui:define name="content">
<!-- Here you could have some @ViewScoped
bean managing the content i.e. #{view1Bean} -->
View 1
</ui:define>
</ui:composition>
view2.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" template="/template.xhtml">
<ui:define name="content">
View 2
</ui:define>
</ui:composition>
Vous serez en mesure de taper leur adresse dans votre navigateur et les voir, c'est ce qu'on appelle bookmarkable ;-)
Voir aussi:
Que voulez-vous dire par "injection de vue"? S'il vous plaît, fournissez un exemple pour l'explication. Rappelez-vous également que JSF est un framework côté serveur qui génère simplement du code HTML. Vous pouvez le combiner avec Angular sans problème. –
a changé ma question pour être plus clair. – arkhon