2016-08-06 34 views
0

Auf meiner Website möchte ich Gebietsschema über Link ändern können, aber ich kann es nicht verwenden, wie ich möchte. Das Problem ist, dass ich einen < f:metadata-Tag auf jeder Seite mit dem folgenden angeben und das funktioniertVerwendung von <f:metadata><f: viewParam ... korrekt in Vorlagen

<ui:define name="metadata"> 
<f:metadata> 
     <f:viewParam name="locale" value="#{changeLocaleController.locale}"/>... 

jedoch, dass ziemlich hässlich ist, da diese Funktion hat nichts mit jeder einzelnen Seite und referes an ein Steuerelement zu tun in der Seitenkopf und ich wette ich würde das Element auf der gleichen Seite irgendwann verpassen. Daher möchte ich dies auf meine Hauptseitenvorlage oder die Kopfzeilenvorlage anstatt auf einzelne Seiten, die das Körperelement meiner Seitenvorlage definieren, umstellen. Meine Vorlagenstruktur ist unten mit einer Hauptvorlage, einer Kopfzeilenvorlage, einem linken offenen Inhaltsabschnitt (jede reale Seite muss dies ausfüllen) und einer Fußzeilenvorlage. Aber wenn ich das bewege (offensichtlich dann <ui:define name="metadata">), passiert nichts, wenn ich aus einem Grund, den ich nicht verstehe, auf den Link klicke.

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE ...> 
<ui:insert name="metadata" />< 
<h:head> 
    some css etc 
</h:head> 

<h:body> 
    <ui:insert name="header"> 
     <ui:include src="header.xhtml" /> 
    </ui:insert> 

    <ui:insert name="content" /> 

    <ui:insert name="footer"> 
     <ui:include src="footer.xhtml" /> 
    </ui:insert> 
</h:body> 

So im Wesentlichen möchte ich das oben genannte Tag Stück aus dem Inhaltsbereich auf die gesamte Vorlage oder Kopfbereich weg bewegen, aber das funktioniert nicht. Ist das irgendwie möglich?

In meinem Kopf Abschnitt habe ich die Links zu den verschiedenen Sprachen mit

<h:link> 
    <f:param name="locale" value="#{language.locale}" />some image 
</h:link> 

Prost Tom

+0

btw, wenn ich ersetzen '' in meinem Haupt-Template und setzen in '' das funktioniert auch nicht. Ziemlich seltsam für mich, da es im Grunde derselbe Code ist wie der, der funktioniert, außer dass die Position der Tags in einer anderen Datei ist ... – Tom

+0

tunss out auf http://docs.oracle.com/javaee/6/javaserverfaces/2.1 /docs/vdldocs/facelets/f/metadata.html Ich kann nicht in die Vorlage einfügen. "Dieses Tag muss in der XHTML-Datei der obersten Ebene für die angegebene viewId oder in einem Vorlagenclient, aber nicht in einer Vorlage enthalten sein." Irgendwelche Ideen, wie sonst kann ich das aufbauen, ohne es auf jede einzelne Seite schreiben zu müssen? I.e. Warum funktioniert es nicht, wenn ich es in den Header setze? – Tom

+0

Es funktioniert nicht, wenn Sie es in die Vorlage aufgrund dessen, was es in dem zitierten Text sagt, einfügen. – EJP

Antwort

1

Es ist nicht möglich, <f:metadata> in eine Vorlage einzufügen. Es muss wirklich auf der Client-Seite gehen. Siehe auch a.o. JSF 2 facelets <f:metadata/> in template and page.

Ihre beste Wette wäre, um die Anforderung manuell Parameter in der Bean eine der folgenden Möglichkeiten zu greifen:

  1. Via @ManagedProperty("#{param.xxx}").

    @ManagedBean 
    @RequestScoped 
    public class ChangeLocaleController { 
    
        @ManagedProperty("#{param.locale}") 
        private String locale; 
    
        // ... 
    } 
    
  2. Oder über ExternalContext#getRequestParameterMap().

    @ManagedBean 
    @RequestScoped 
    public class ChangeLocaleController { 
    
        @PostConstruct 
        public void init() { 
         String locale = FacesContext.getCurrentInstance() 
          .getExternalContext().getRequestParameterMap().get("locale"); 
    
         // ... 
        } 
    } 
    
  3. Oder, wenn Sie CDI verwenden, über OmniFaces @Param.

    @Named 
    @RequestScoped 
    public class ChangeLocaleController { 
    
        @Inject @Param 
        private String locale; 
    
        // ... 
    } 
    
-2

ich es tun auf diese Weise:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     lang="#{facesView.facesLanguage.id}"> 

<h:head> 
    <meta charset="UTF-8" /> 
    <title><h:outputText escape="false" value="${pageTitle}"/></title> 
    .... 

    <h:outputStylesheet library="css" name="...."/> 
    <h:outputStylesheet library="css" name="...."/> 
    . 
    <h:outputScript library="js" name="jquery.min.js" target="head"/>  
    <h:outputScript library="js" name="...." target="head"/> 

</h:head> 
<body> 

<f:view locale="#{facesView.locale}" encoding="UTF-8" contentType="text/html"> 
    <ui:insert name="header"/> 
    <ui:insert name="content"/> 
    .... 
</f:view> 
</body> 
</html> 

wo facesView ist mein requestScoped verwaltet Bean, wo ich die Sprache/Gebietsschema aus der Anfrage URL

+0

Dies ist keine Vorlage. – EJP

+0

@EJP, dies ist eine Standard-JSF-Vorlage, einfach weiter unten gehen! –

+0

Ich habe das HTML/Layout darin entfernt, um den Fokus auf die Sprache/das Gebietsschema zu legen, nach dem das OP fragt. –