【问题标题】:Pass values between Managed Beans of different pages [duplicate]在不同页面的托管 Bean 之间传递值 [重复]
【发布时间】:2012-02-07 17:49:38
【问题描述】:

我无法在不同页面的两个托管 bean 之间传递值。 我正在主页中实现一个搜索框 JSF 组件。我请求一些值,当用户点击搜索时,它会转到搜索结果页面。 搜索结果页面有一个 JSF 组件 SEARCH RESUKTS 需要访问托管 bean 中与主页搜索框对应的选择。

我尝试过使用注入,但它显示托管 BEan 框已重新初始化,显示默认值。我从搜索框中选择了一个兴趣,即电影,然后我点击搜索,我会看到搜索结果,我希望看到电影,但我看到的是默认值 Sport。 请在下面找到代码。

搜索结果管理的 Bean

import javax.el.ELContext;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

@ManagedBean
@ApplicationScoped
public class ExpSearchResultsMB {

    /** Creates a new instance of ExpSearchResultsMB */
    public ExpSearchResultsMB() {
    }


 @ManagedProperty(value="#{expSearchBoxMB.selectedValue}")
      private String  selectedValue; // +setter
    @ManagedProperty(value="#{expSearchBoxMB.text}")
    private String prova;

    public String getProva() {
        return prova;
    }

    public void setProva(String prova) {
        this.prova = prova;
    }
    public String getSelectedValue() {

        return selectedValue;
    }

    public void setSelectedValue(String selectedValue) {
        this.selectedValue = selectedValue;
    }
}

搜索框管理的 Bean

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedProperty;


@ManagedBean
@ApplicationScoped
public class ExpSearchBoxMB {
    public Date date;
   public List<String> interests=new ArrayList<String>();

      public String selectedValue="Sport";
    public String getSelectedValue() {
        return selectedValue;
    }
    public void setSelectedValue(String selectedValue) {
        this.selectedValue = selectedValue;
    }

    public List<String> getInterests() {

        interests.add("Sport");
        interests.add("Musin");
        interests.add("Art");
        interests.add("Thatre");
        interests.add("Cinema");
        return interests;
    }

    public void setInterests(List<String> interests) {
        this.interests = interests;
    }

我将不胜感激。

干杯

【问题讨论】:

    标签: jsf communication managed-bean


    【解决方案1】:

    我会说调试并检查是否在兴趣选择更改时设置了正确的值。

    如果一切都正确,但您仍然看到不正确的结果,请尝试在 ExpSearchResultsMB 中使用以下代码

    FacesContext context = FacesContext.getCurrentInstance();
    ExpSearchBoxMB expSearchBoxMBBean = (ExpSearchBoxMB) context.getApplication().evaluateExpressionGet(context, "#{expSearchBoxMB}", ExpSearchBoxMB.class);
    
    expSearchBoxMBBean.getSelectedValue() 
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      <h:panelGrid columns="2" >
         <h:form>
      
            <h:outputLabel for="prova" value="Prova: " />
            <h:inputText binding="#{prova}" id="prova" />
      
            <h:outputLabel for="interest" value="Interest: " />
            <h:selectOneMenu binding="#{interest}" id="interest" >
               <f:selectItems value="#{expSearchBoxMB.interests}" var="i" 
                              itemLabel="#{i}" itemValue="#{i}" />
            </h:selectOneMenu>
      
            <h:button value="Search" outcome="Result">
               <f:param name="prova"    value="#{prova.value}" />
               <f:param name="interest" value="#{interest.value}" />
            </h:button>
      
         </h:form>
      </h:panelGrid>
      

      然后在你的ExpSearchResultsMB,你可以得到这样的值:

      @ManagedBean
      @ViewScoped
      public class ExpSearchResultsMB {
          private String interest;
          private String prova;
          private String statusMsg;
      
      
          @PostConstruct
          public void prepareResult() {
              HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
              this.interest = request.getParameter("interest");
              this.prova    = request.getParameter("prova");
      
              if (interest == null || prova == null) statusMsg = "Please provide all information";
              else {
                  // Prepare result to show to the user
              }
          }
      
          // Getters and Setters
      }
      

      如果您使用@RequestScoped 作为ExpSearchResultsMB 而不是@ViewScoped,则可以使用@ManagedProperty 获取提交的值,如下所示:

      @ManagedProperty(value="#{param.prova}"})
      private String prova;
      @ManagedProperty(value="#{param.interest}"})
      private String interest;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-09
        • 2013-07-05
        • 2015-03-25
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多