可隐含的&显式bean声明一起工作

时间:2012-12-31 12:39:57

标签: xml jsf-2 managed-bean

是否有可能同时使用隐式和&显式bean声明在同一个应用程序中,我的意思是@ManageBean和faces-config.xml中的显式托管bean,我知道它很少使用,但我觉得尝试一下,好奇心杀了我,结果得到空值,任何光棚对此非常感激。

更新:抱歉没有使用代码段备份我的问题。

从managedbean开始:

package pck;
import javax.faces.bean.*;
import java.io.*;
@ManagedBean   
public class SimpleController implements Serializable{
private String message="";

public String getMessage() {
return(message);
}

public void setMessage(String message) {
this.message = message;
}

public String doNavigation() {
 if (message.trim().length() < 2) {
  return("too-short");
 } else {
  String[] results =  { "page1", "page2", "page3" };
  return(RandomUtils.randomElement(results));
 }
 }
 }

faces-config.xml stuff:

<?xml version="1.0"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
 version="2.0">

 <managed-bean>
<managed-bean-name>messageHandler</managed-bean-name>
<managed-bean-class>
  pck.SimpleController
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<navigation-rule>
<from-view-id>*</from-view-id>
<!--     <navigation-case>
  <from-outcome>too-short</from-outcome>
  <to-view-id>/error-message.xhtml</to-view-id>
 </navigation-case> -->
<navigation-case>
  <from-outcome>page1</from-outcome>
  <to-view-id>/result-page-1.xhtml</to-view-id>
</navigation-case>
<navigation-case>
  <from-outcome>page2</from-outcome>
  <to-view-id>/result-page-2.xhtml</to-view-id>
</navigation-case>
<navigation-case>
  <from-outcome>page3</from-outcome>
  <to-view-id>/result-page-3.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
 <navigation-rule>
<from-view-id>*</from-view-id>
  <navigation-case>
 <from-outcome>too-short</from-outcome>    
  <to-view-id>/error-message.xhtml</to-view-id>
</navigation-case>
</faces-config>

欢迎facelet:

<h:form>
 <!-- If I used implicit bean declaration, It heads to error-page.xhtml, however I insert 
  more-than-letter word -->       
 <h:inputText value="#{messageHandler.message}"/> 
<br/>
<!-- If I used implicit bean declaration along with condition above, It heads successfully to
     a random result page, But with a null expression value -->
 <h:commandButton value="Show Results" action="#{messageHandler.doNavigation}"/>
</h:form>

结果facelet:

只有表达式值的页面,但这次使用显式bean声明

  <h2>Your message: "#{messageHandler.message}"</h2>

它完美地工作如果使用隐式或显式bean声明。

1 个答案:

答案 0 :(得分:1)

您忘记了将托管bean范围与@ManagedBean一起声明。然后默认为@NoneScoped,这实际上意味着在#{messageHandler}的每个EL表达式评估上创建一个全新的实例。输入字段将获得自己的实例。命令按钮将获得自己的实例。结果页面中的“您的消息”行将获得自己的实例。你实际上最终得到了三个完全不同的实例而不是一个。

鉴于您通过XML将bean放在会话范围中,您应该使用@SessionScoped注释执行相同的操作。这样,将在整个HTTP会话中使用同一个bean实例。

@ManagedBean(name="messageHandler")
@SessionScoped

(请注意,我指定了托管bean名称以及类名称不是MessageHandler,而是SimpleController;您忘记了问题,这可能只是粗心大意)< / em>的

请注意,XML声明始终优先于注释声明。因此,如果两者都存在,则XML声明将始终覆盖注释声明。