2016-08-06 65 views
0

在我的網站上,我希望能夠通過鏈接更改區域設置,但我無法使用它。問題是,我可以在每個頁面上指定一個< f:metadata標籤有以下和工作在模板中正確使用<f:metadata><f:viewParam ...

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

但是那是相當難看,因爲這個功能無關,每個單頁和referes在控制元件頁面標題,我敢打賭,我會錯過同一頁上的元素somewhen。所以我想將其轉移到我的主頁面模板或頁眉模板中,而不是定義頁面模板的body元素的單個頁面。我的模板結構如下:一個主模板,一個頁眉模板,一個左側打開的內容部分(每個實際頁面需要填寫)和一個頁腳模板。但如果我移動這個(顯然然後<ui:define name="metadata">),然後沒有反應,如果我點擊鏈接的原因我不明白。

<?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> 

所以基本上我想上面的標籤片移動從內容部分整體模板或標題部分消失,但不起作用。這有可能嗎?

在我的頭節我有

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

乾杯 湯姆

+0

順便說一句,如果我替換'的'在我的主模板,並把在''這也不起作用。對我來說很奇怪,因爲基本上它與工作的代碼是相同的,除了標籤的位置在不同的文件中... – Tom

+0

http://docs.oracle.com/javaee/6/javaserverfaces/2.1 /docs/vdldocs/facelets/f/metadata.html,我不能把放在模板中。 「這個標籤必須駐留在給定viewId的頂層XHTML文件中,或者在模板客戶端中,但不在模板中。」任何想法,我可以建立這個,而不必把它放在每一個頁面上?即如果我把它放到標題中,爲什麼它不起作用? – Tom

+0

如果您將它放在模板中,則不起作用,因爲它是在您引用的文本中說的內容。 – EJP

回答

1

無法將<f:metadata>放入模板中。它真的必須進入客戶端頁面。另見a.o. JSF 2 facelets <f:metadata/> in template and page

你最好的賭注是手動搶請求參數在bean以下方式之一:

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

    @ManagedBean 
    @RequestScoped 
    public class ChangeLocaleController { 
    
        @ManagedProperty("#{param.locale}") 
        private String locale; 
    
        // ... 
    } 
    
  2. 或通過ExternalContext#getRequestParameterMap()

    @ManagedBean 
    @RequestScoped 
    public class ChangeLocaleController { 
    
        @PostConstruct 
        public void init() { 
         String locale = FacesContext.getCurrentInstance() 
          .getExternalContext().getRequestParameterMap().get("locale"); 
    
         // ... 
        } 
    } 
    
  3. 或者,如果你使用CDI,通過OmniFaces @Param

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

鏈接到不同的語言我做這種方式:

<!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> 

其中facesView是我requestScoped管理豆,我從請求URL初始化語言/區域設置

+0

這不是模板。 – EJP

+0

@EJP,這是一個標準的JSF模板,只是保持downvoting! –

+0

我刪除了它內部的html/Layout,以關注OP詢問的語言/區域設置。 –