2014-03-31 32 views
1

以下XHTML在<p:selectOneMenu>选定值设置为一个请求通过<p:remoteCommand>作用域bean。提供参数:remoteCommand到一个Spring bean

<h:form id="languageForm" prependId="true"> 

    <pe:blockUI target=":body" widgetVar="blockBodyUIWidget"> 
     <h:panelGrid columns="2"> 
      <h:graphicImage library="default" name="images/ajax-loader1.gif" class="block-ui-image"/> 
      <h:outputText value="#{messages['blockui.panel.message']}" class="block-ui-text"/> 
     </h:panelGrid> 
    </pe:blockUI> 

    <p:selectOneMenu id="languages" value="#{localeBean.language}" onchange="changeLanguage([{name:'language', value:this.value}]);"> 
     <f:selectItem itemValue="en" itemLabel="#{messages['languages.english']}" /> 
     <f:selectItem itemValue="hi" itemLabel="#{messages['languages.hindi']}" /> 
    </p:selectOneMenu> 

    <p:remoteCommand name="changeLanguage" process="@this" update="@none" onstart="PF('blockBodyUIWidget').block();" oncomplete="PF('blockBodyUIWidget').unblock();" action="#{intermediateLocaleBean.localeAction}"/> 
</h:form> 

相应JSF托管bean:

@ManagedBean 
@RequestScoped 
public final class IntermediateLocaleBean 
{ 
    @ManagedProperty("#{param.language}") 
    private String language; 
    @ManagedProperty("#{localeBean}") 
    private LocaleBean localeBean; //Injecting another session scoped bean here. 

    public IntermediateLocaleBean() {} 

    public void setLanguage(String language) { 
     this.language = language; 
    } 

    public void setLocaleBean(LocaleBean localeBean) { 
     this.localeBean = localeBean; 
    } 

    public String localeAction() 
    { 
     localeBean.setLocale(language.equals("hi")?new Locale(language, "IN"):new Locale(language)); 
     return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true"; 
    } 
} 

language属性在<p:selectOneMenu>初始化为选择的语言。这完全是因为它是一个JSF托管bean。


如果这个bean由Spring维护,如下所示呢?

@Controller 
@Scope("request") 
public final class IntermediateLocaleBean 
{ 
    //Do something to initialize the property - language. 
    //@ManagedProperty would not work as this bean is managed by Spring. 
    //It is not initialized to the selected language in <p:selectOneMenu>. 
    //It is null. 

    private String language; 

    //The session scoped bean is injected using the @Autowired annotation as follows. 

    @Autowired 
    private final transient LocaleBean localeBean=null; 

    public IntermediateLocaleBean() {} 

    public void setLanguage(String language) { 
     this.language = language; 
    } 

    public String localeAction() 
    { 
     localeBean.setLocale(language.equals("hi")?new Locale(language, "IN"):new Locale(language)); 
     return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true"; 
    } 
} 

如何初始化language属性来选择语言<p:selectOneMenu>在这个bean?

回答

2

传统的language参数值 - 请求参数,可以使用

FacesContext context = FacesContext.getCurrentInstance(); 
String language = context.getExternalContext().getRequestParameterMap().get("language"); 

像下面,

@Controller 
@Scope("request") 
public final class IntermediateLocaleBean 
{ 
    @Autowired 
    private final transient LocaleBean localeBean=null; 

    public IntermediateLocaleBean() {} 

    public void setLanguage(String language) { 
     this.language = language; 
    } 

    public String localeAction() 
    { 
     String language = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("language"); 
     localeBean.setLocale(language.equals("hi")?new Locale(language, "IN"):new Locale(language)); 

     return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true"; 
    } 
} 

提供资料,但我个人不喜欢暴露使用FacesContext除非整个请求这是绝对必要的。


有一个org.springframework.beans.factory.annotation.Value注释在Spring可与弹簧表达式语言被用于获得请求参数如下。

@Controller 
@Scope("request") 
public final class IntermediateLocaleBean 
{ 
    @Value("#{request.getParameter('language')}") //Exposing the value of language. 
    private String language; 

    @Autowired 
    private final transient LocaleBean localeBean=null; 

    public IntermediateLocaleBean() {} 

    public void setLanguage(String language) { 
     this.language = language; 
    } 

    public String localeAction() 
    { 
     localeBean.setLocale(language.equals("hi")?new Locale(language, "IN"):new Locale(language)); 
     return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true"; 
    } 
} 

language通过<p:remoteCommand>作为请求参数提供的值现在是在使用@Value注解这个bean可用的(未在我的情况下所需的language getter方法)。

请提出或添加其他答案,如果别的东西可用!

相关问题