- PR -

JSFのページ遷移

1
投稿者投稿内容
tnk4129
会議室デビュー日: 2003/07/16
投稿数: 2
投稿日時: 2006-06-29 19:23
JSFの初心者です。以下の問題で苦しんでいます。助けていただけないでしょうか?

開発環境:RAD6.0、WAS5.1.2 、JSF1.1

hoge1.jspとhoge2.jspがあり
1.hoge1.jspで<commandExButton>の検索実行を行う。
2.検索結果を自ページのhoge1.jspに<datatable>で出力する。
3.<datatable>のカラムに<commandLink>があり、リンクをクリックしするとhoge2.jspに遷移する。
というような遷移で作成しているのですが
2.まではうまく行くのですが、3.のリンククリック時に画面遷移が起きません。commandLinkにあるactionメソッドも呼ばれず、自ページhoge1.jspをリロードしているだけな感じです。
何が原因か分からず途方にくれております。何かピンと来る方教えていただけますでしょうか?

ソースは以下のような感じです。
hoge1.jsp
〜略〜
<h:form>
<h:outputText styleClass="outputText" id="lblSearch" value="検索"></h:outputText>
<h:inputText styleClass="inputText" id="txtSearch" value="#{Do_Hoge.search}" />
<hx:commandExButton type="submit" value="受診者検索" styleClass="commandExButton" id="btnSearch" action="#{Do_Hoge.doSearch}" />
<h:dataTable id="tblhoge" value="#{Do_Hoge.hogeModel}" var="vardata_hoge" styleClass="dataTable">
<h:column id="colhoge">
<f:facet name="header">
<h:outputText styleClass="outputText" value="社員番号" id="headhoge"></h:outputText>
</f:facet>
<h:commandLink action="#{Do_Hoge.toNextPage}" styleClass="commandLink" id="lnkhoge">
<h:outputText id="txthoge" value="#{vardata_hoge.hogename}" styleClass="outputText"></h:outputText>
</h:commandLink>
</h:dataTable>
</h:form>
〜略〜


faces-config.xml
〜略(managedbean)〜
<navigation-rule>
<from-view-id>/jsp/hoge1.jsp</from-view-id>
<navigation-case>
<from-action>#{Do_Hoge.search}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/jsp/hoge1.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{Do_Hoge.toNextPage}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/jsp/hoge2.jsp</to-view-id>
</navigation-case>
</navigation-rule>


Do_Hoge.java(backing bean)
public class Do_Hoge extends Hoge implements Serializable {
private DataModel hogeModel;
private String search;
public String doSearch(){
return "success";
}
public String toNextPage(){
return "success";
}
〜 setter,getter〜
}

よろしくお願いいたします。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-06-30 15:19
一般論ですが、JSFで「何も起きず同じ画面を再表示」という場合は、
(1)入力フィールドのコンバージョンorバリデーションエラー
(2)バインディング式かfaces-config.xmlのミススペル
のどちらかが典型的です。

まず、なにはともあれ、すべてのjspファイルに<h:messages/>を入れましょう。
次にフェーズリスナでトレースを出力して、どのフェーズまで進んでいるか確かめましょう。

MyPhaseListener.java:
public class MyPhaseListener implements PhaseListener {
public void afterPhase(PhaseEvent event) {
printLog(event, "after phase:");
}
public void beforePhase(PhaseEvent event) {
printLog(event, "before phase:");
}
protected void printLog(PhaseEvent event, String msg) {
UIViewRoot view = event.getFacesContext().getViewRoot();
String viewID = "no view";
if (view != null) viewID = view.getViewId();
Logger.global.info(msg + event.getPhaseId() + " " + viewID);
}
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}

faces-config.xml:
<lifecycle>
<phase-listener>MyPhaseListener</phase-listener>
</lifecycle>
tnk4129
会議室デビュー日: 2003/07/16
投稿数: 2
投稿日時: 2006-07-03 20:29
よしだひろゆきさん返信ありがとうございます。
おかげさまで、原因と解決が出来ました。
よしださんの御指摘どおりMyPhaseListener.javaを作成した結果、ビューの復元時にエラーが起きていることが確認できました。
現象としては、
1.hoge1.jspで<commandExButton>の検索実行を行う。
2.検索結果を自ページのhoge1.jspに<datatable>で出力する。
3.<datatable>のカラムに<commandLink>があり、リンクをクリックしするとhoge2.jspに遷移する。

3.から遷移する時にJSFのビューコンポーネントの復元を行っているフェーズでhoge1.jspの<datatable>(DataModel)を取得する場面でエラーとなっていました。
getterでDataModelを取得する時に前Webページのレスポンス情報を元にDBからデータを取得しておりました。そのレスポンス情報がnullになっていた為に
DataModelのgetter時にExceptionが発生していたようです。

レスポンスデータをセッションにすることで解決いたしました。
ありがとうございます。

ただ処理的に問題がある(不必要にDBにデータ取得に行くことになっている)ので、
処理を考えなおす必要がありましたが。。。

JSFでデバッグはできないと思っておりましたが、こんなデバッグの方法があるとは知りませんでした。貴重な教えありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)