0

我正在从 JSF1.2 迁移到 2.1,我将 faces-config.xml 中的 bean 条目更改为注释。我尝试使用@ViewScoped 代替@RequestScoped 和@ManagedProperties(对于几个类中的许多参数),但是每次我单击提交时,我的表单bean 都会重新创建注释为@ViewScoped。对于@SessionScoped,一切正常。

我在这里阅读了一些问答和这篇文章,但我没有强迫它工作。

我将 JSTL 标记更改为呈现的属性,或 c:if 与 ui:param 呈现。

在我的 web.xml 中,我设置了参数:

<context-param>
  <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
  <param-value>false</param-value>
</context-param>
<context-param>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>CLIENT</param-value>
</context-param>

我试过 javax.faces.PARTIAL_STATE_SAVING = true,但也没有用。与 javax.faces.STATE_SAVING_METHOD = SERVER 相同的问题。

我删除了标签处理程序进行测试,但它也没有帮助。

在项目中使用:Mojarra 2.1.13、hibernate 3.6、spring 3.1(据我所知,我的前任更新了 2.x 形式)、acegi-security-1.0.5、tomahawk20、urlrewrite-3.2.0。

我用tomcat 6

编辑:

这是我的 bean:package my.package;

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;

import my.package.MyOtherBean;

@ManagedBean(name="someNameBean")
@ViewScoped
//@SessionScoped
public class MyBean extends MyOtherBean {

public MyBean(){
    super();
    //XXX
    System.out.println("-->> someNameBean is being created");       
}
}



package my.package;

@ManagedBean(name="someNameMyOtherBean")
//@ViewScoped
@SessionScoped
public class MyOtherBean extends BaseBean {

private ClassWithFormFields dataIn; //getter & setter exist
//a lot of code here

}

bean 的使用示例

<h:selectOneMenu value="#{someNameBean.dataIn.currencyId}" id="currencyId" tabindex="2" >
<f:selectItems value="#{someNameBean.dataIn..availableCurrencies}"/>
</h:selectOneMenu>

更新 serviceLocalizator 由 Spring xml 文件和 JSF 注释管理

@ManagedBean
public class BaseBean implements Serializable {

private static final long serialVersionUID = 1L;

protected transient Logger log = Logger.getLogger(this.getClass());

@ManagedProperty(value="#{serviceLocalizator}")
protected transient ServiceLocalizator serviceLocalizator;

    //few more lines

}

更新2: 这是我的错。感谢@kolossus,他指出了方向。我一直在寻找答案,我找到并阅读了BalusC 文章现在我不应该在支持 bean 操作中返回字符串。使用 null 而不是 string 它可以工作。我对视图的概念理解得很差,我认为只要选项卡/窗口相同,ViewSoped bean id 就会存在。现在我知道那是 JSF 视图。我很抱歉给您添麻烦了。

也许是一种使用@ViewSoped 重定向到新页面的方法?

4

1 回答 1

1

注意:如果您从 2 个不同的视图引用相同的(非会话范围的)bean,则会创建该 bean 的两个实例

无论哪种类型的 bean 支持 JSF 视图,在 JSF 中导航都是非常基本和直接的。

  1. 返回您尝试导航到的页面的名称(视图 ID)作为公共方法的返回值

      public String navigateAway(){
       //Do whatever processing you want here
       return "page2"; //where page2 is the name of an actual .xhtml file in your application     
       }
    
  2. faces_config.xml返回文件中指定的 JSF 导航案例结果

      public String navigateAway(){
        //Prior processing
        return "go somewhere else" ;  //where go somewhere else is a navigation outcome you've specified in your faces_config.xml file
       }    
    

    在您的faces_config.xml文件中,您将拥有这个

      <navigation-rule>
    <from-view-id>/register.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>go somewhere else</from-outcome>
        <to-view-id>/review_registration.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
    

但是,如果您想在某个操作后保持在同一页面上,只需null在您的方法中返回而不是字符串,您将不会被带到另一个视图。此外,根据您的支持 bean 的范围,如果您返回 null 值,您可以确定您将使用相同的 bean 实例

更多细节看这里

于 2012-10-27T20:46:09.323 回答