2011-05-12 51 views
0

我使用prettyfaces来处理URL路径。JSF - 在跟踪链接时设置属性

我想要做的是设置一个语言属性上的一个链接(选择语言)。这样的事情:

<h:link outcome="#{bean.currentPath}" value="English"> <!-- path goes to self --> 
    <f:param name="link" value="#{currentTopic.link}" /> 
    <f:param name="lang" value="eng" /> 
</h:link> 

prettyconfig检索链接并遵循它,但我怎样才能将参数发送到语言bean?

<url-mapping id=""> 
    <pattern value="/topic/#{link:bean.link}" /> 
    <view-id>/faces/topic.jsf</view-id> 
</url-mapping> 

该bean是无状态的(@RequestScoped),并且语言bean是有状态的(@SessionScoped)。两者都是@ManagedBeans。

+0

是否有可能将其添加到您现有的url模式? /topic/#{link:bean.link}/#{lang:languageBean.lang} – 2011-05-12 14:53:54

+0

我已经考虑过了,但是我的教授在uni。所述语言应该在服务器端完全定义,而不在用户的URL中看到,因为它只定义一次。 – 2011-05-12 16:26:21

+0

然而,这是一个巨大的SEO缺点。不同语言的内容将以这种方式标记为重复内容。 – BalusC 2011-05-12 17:04:28

回答

1

下面是一个仍然使用其他网址的选项。这不是非常优雅,但可能完成你在找什么:

<pretty:link mappingId="LanguageTopic"> 
    <f:param name="link" value="#{currentTopic.link}" /> 
    <f:param name="lang" value="eng" /> 
    English 
</pretty:link> 

漂亮-config.xml中:

<url-mapping id="LanguageTopic"> 
    <pattern value="/topic/#{link:linkBean.link}/#{lang:languageBean.lang}/" /> 
    <view-id>/faces/topic.jsf</view-id> 
    <action>#{linkBean.cleanUrl}</action> 
</url-mapping> 

<url-mapping id="Topic"> 
    <pattern value="/topic/#{link:linkBean.link}/" /> 
    <view-id>/faces/topic.jsf</view-id> 
</url-mapping> 

语言豆:

@ManagedBean(name = "languageBean") 
@SessionScoped 
public class LanguageBean implements Serializable { 

    private static final long serialVersionUID = 4460586548949990787L; 

    /** 
    * Stores the users language preference 
    */ 
    private String lang; 

    public String getLang() { return this.lang; } 
    public void setLang(String lang) { this.lang = lang; } 

} 

链接豆:

@ManagedBean(name = "linkBean") 
@RequestScoped 
public class LinkBean { 

    /** 
    * Stores the resource the user is currently accessing 
    */ 
    private String link; 

    public String getLink() { return this.link; } 
    public void setLink(String link) { this.link = link; } 

    /** 
    * Cleans language specific rest urls to non-specific urls 
    */ 
    public void cleanUrl() { 
     final ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 

     try { 
      externalContext.redirect("/topic/" + this.link + "/"); 
     } catch (IOException ex) { 
      //log or whatever you want here 
     }  
    } 
}