- - PR -
JSFのページ遷移
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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〜 } よろしくお願いいたします。 |
|
投稿日時: 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> |
|
投稿日時: 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