0

同じアプリで暗黙的および明示的な Bean 宣言を一緒に使用する可能性はありますか? @ManageBean と、faces-config.xml 内の明示的なマネージド Bean を意味します。めったに使用されないことはわかっていますが、試してみると、好奇心に殺され、終了しましたnull値を取得するまで、これに光を当てると非常に高く評価されます.

更新: コード スニペットに関する問題をバックアップしておらず申し訳ありません。

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 のもの:

<?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>

結果ファセット:

式の値だけを持つページですが、今回は明示的な Bean 宣言を使用しています

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

暗黙的または明示的な Bean 宣言が使用されている場合は、完全に機能します。

4

1 に答える 1

1

とともにマネージド Bean スコープを宣言するのを忘れていました@ManagedBean@NoneScopedこれは、のすべての単一のEL式評価で真新しいインスタンスが作成されることを効果的に意味するデフォルトになります#{messageHandler}。入力フィールドは独自のインスタンスを取得します。コマンド ボタンは独自のインスタンスを取得します。結果ページの「あなたのメッセージ」行は、独自のインスタンスを取得します。1 つだけではなく、実質的に 3 つの完全に異なるインスタンスになります。

XML によってセッション スコープに Bean を配置した場合は、@SessionScopedアノテーションを使用して同じことを行う必要があります。このようにして、HTTP セッション全体で同じ Bean インスタンスが使用されます。

@ManagedBean(name="messageHandler")
@SessionScoped

(マネージドBean名とクラス名を指定したことに注意してくださいMessageHandler、しかしSimpleController;あなたは質問でそれを忘れました。これはおそらく単なる不注意です)

XML 宣言は常に注釈宣言よりも優先されることに注意してください。したがって、両方が存在する場合、XML 宣言は常にアノテーション宣言をオーバーライドします。

于 2012-12-31T13:51:39.230 に答える