2012-03-29 68 views
1

我创建了因输入可以将它发送到多个具有不同的支持bean中的每个页面各种各样的微控制器。我这样做是因为一个页面,它接受一个案件编号,验证病例数,然后将其传送到任意数量的这就需要一个有效的情况下,页数。JSF传递一个bean到页面

这是我caseSelector页:

<h:form id="form1"> 
    <h:inputText value="#{caseSelectorBean.caseNumber}"/> 
    <h:inputHidden value="#{caseSelectorBean.nextPage}"/> 
    <h:commandButton action="#{caseSelectorBean.gotoNext}" value="submit"/> 
</h:form> 

我的豆正确验证casenumber并填写下一页面豆,并将其转发到该页面。

//CaseSelectorBean 
public String gotoNext() { 
    logger.debug("In the caseChooser, going to xpage"); 
    logger.debug("caseNum=" + caseNumber); 

    if(!validateCaseNumber(caseNumber)) { 
     return "caseNotFound"; 
    } 

    if(nextPage.equals("page1")) { 
     CaseDAO caseDAO = new CaseDAO(); 
     caseInfo = caseDAO.getCaseInfo(caseNumber); 
     CaseInfoBean caseInfoBean = new CaseInfoBean(); 
     caseInfoBean.setCaseInfo(caseInfo); 
     caseInfoBean.setCaseNumber(caseNumber); 
     FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(
        "caseInfoBean", caseInfoBean); 

    } 

    logger.debug("done with gotoNext(), returning " + nextPage); 
    return nextPage; 
} 

问题是当我尝试从下一页访问bean时,它是空的。我可以通过构造函数看到它创建了一个新的而不是在会话中使用的。我如何让页面使用我为它创建的bean?

谢谢!

+0

什么是你的bean的范围。它应该是SessionScoped。 – 2012-03-29 17:59:14

+0

我确实有这个要求。当我将其更改为会话,我 javax.servlet.ServletException:无法创建托管bean caseSelectorBean。发现以下问题: - 表达式#{param.caseNumber}引用的对象的请求范围比会话 的引用托管bean(caseSelectorBean)范围短,因为我有一个托管属性, \t <托管财产> <属性名称> caseNumber #{} param.caseNumber 2012-03-29 18:39:59

+0

有没有更好的方式来传递从JSP页面的caseNumber参数? – 2012-03-29 18:43:41

回答

0

#{param}的ManagedProperty仅适用于请求范围豆。使用f:viewParam更广泛的范围:

<f:metadata> 
    <f:viewParam name="caseNumber" value="#{caseSelectorBean.caseNumber}"/> 
</f:metadata> 

然后你只需要在你的bean getter和setter一个简单的属性caseNumber。

相关问题