JSFのコメント文の書き方
JSFは
<!-- コメント文 -->
ちなみに、CSSは、
/* コメント文 */
javaは、
// コメント文
JSFは
<!-- コメント文 -->
ちなみに、CSSは、
/* コメント文 */
javaは、
// コメント文
【ERROR】
ERROR org.apache.catalina.core.ApplicationDispatcher:704 - サーブレット jsp のServlet.service()が例外を投げました
java.lang.IllegalStateException: Client-id : _idJsp46 is duplicated in the faces tree. Component : start:_idJsp46, path: {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /faces/start.jsp][Class: javax.faces.component.html.HtmlForm,Id: start][Class: javax.faces.component.html.HtmlPanelGrid,Id: _idJsp45][Class: javax.faces.component.html.HtmlOutputText,Id: _idJsp46]}
【解決策】
(1)tomcatを停止する
(2)workフォルダーのファイルを削除する
*Eclipseで開発している場合は、F5のリフレッシュを実行してからファイル削除
(3)tomcatを起動する
【原因/要因】
・変更前のキャッシュが残っているので、変更箇所が反映されていない模様
tomcatを起動すると、こんなエラーメッセージが表示されます。とりあえず作ったプログラム(JSF)の動作は確認できる状態です。
ちなみにtomcatの終了時は、以下のようなエラーが表示されます。
2006/08/04 21:15:18 org.apache.coyote.http11.Http11BaseProtocol pause
情報: Coyote HTTP/1.1を http-8080 で一時停止します
2006/08/04 21:15:19 org.apache.catalina.core.StandardService stop
情報: サービス Catalina を停止します
2006/08/04 21:15:23 org.apache.catalina.core.StandardContext stop
情報: コンテナ org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/prototype] はまだ起動されていません
2006/08/04 21:15:23 org.apache.coyote.http11.Http11BaseProtocol destroy
情報: Coyote HTTP/1.1を http-8080 で停止します
2006/08/04 21:16:07 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
情報: Failed shutdown of Apache Portable Runtime
tomcatが「beanがアクセス可能ではありません」といったエラーを出した場合のチェック項目:
- beanの初期化でエラーが発生したが、そのまま実行が進み、JSPのところでエラーが表示された場合
→エラーログをチェックする。
- beanがpublicでない場合
→beanの宣言を確認する。特に、内部クラスはわかりにくいので注意。下記の例では、LocalClassはpublic宣言されていないので、JSPからはアクセスできない。
public class TestBean {
LocalClass data;
class LocalClass {
}
public LocalClass getData() {
return data;
}
}
- tomcatのエラーがブラウザに表示される
-- faces-config.xmlで、URL中の「&」をエスケープしていなくてエラーになったことがありました。
- url-patternは、ディレクトリかワイルドカードのどちらかとする。
- managed-beanへの初期値設定で、Stringクラスが見つからないと言われる。
-- java.lang.Stringと指定して解決しました。
- JSFのテストケースの作り方
++ ソースフォルダ「/WEB-INF/test」を作る
++ ソースと同じパッケージをtestの下に作る
++ JUnitテストケースを「AaaAaaTest」のようなクラス名で作る(コンストラクタ等を全部ONにする)
- JSFプロジェクトのはじめ方
++ Tomcatプロジェクトを新規作成
++ パッケージを/WEB-INF/src/に作成
++ コマンドラインから、必要なjarファイルを/WEB-INF/lib/にコピー
++ プロジェクトのプロパティの「Java Build Path」で「Add JARs...」を選択し、自プロジェクトのWEB-INF/libの下を全選択して追加
++ WEB-INFの下に、faces-config.xmlとweb.xmlを作成
ブラウザでリロードすると発生しなかったりするのでかなり謎。
19:09:35,109 ERROR org.apache.catalina.core.ApplicationDispatcher:704 - サーブレット jsp のServlet.service()が例外を投げました java.lang.NullPointerException: null values not allowed at org.apache.commons.collections.map.AbstractReferenceMap.put(AbstractReferenceMap.java:251) at org.apache.myfaces.application.jsp.JspStateManagerImpl$SerializedViewCollection.add(JspStateManagerImpl.java:717) at org.apache.myfaces.application.jsp.JspStateManagerImpl.saveSerializedViewInServletSession(JspStateManagerImpl.java:493) at org.apache.myfaces.application.jsp.JspStateManagerImpl.saveSerializedView(JspStateManagerImpl.java:332) at org.apache.myfaces.taglib.core.ViewTag.doAfterBody(ViewTag.java:122) at org.apache.jsp.faces.toppage_jsp._jspx_meth_f_view_0(toppage_jsp.java:219) at org.apache.jsp.faces.toppage_jsp._jspService(toppage_jsp.java:162) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301) at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:416) at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234) at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:138) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:97) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Unknown Source) 19:09:35,125 ERROR org.apache.catalina.core.StandardWrapperValve:253 - サーブレット Faces Servlet のServlet.service()が例外を投げました javax.faces.FacesException: null values not allowed at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:435) at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234) at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:138) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:97) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException: null values not allowed at org.apache.commons.collections.map.AbstractReferenceMap.put(AbstractReferenceMap.java:251) at org.apache.myfaces.application.jsp.JspStateManagerImpl$SerializedViewCollection.add(JspStateManagerImpl.java:717) at org.apache.myfaces.application.jsp.JspStateManagerImpl.saveSerializedViewInServletSession(JspStateManagerImpl.java:493) at org.apache.myfaces.application.jsp.JspStateManagerImpl.saveSerializedView(JspStateManagerImpl.java:332) at org.apache.myfaces.taglib.core.ViewTag.doAfterBody(ViewTag.java:122) at org.apache.jsp.faces.toppage_jsp._jspx_meth_f_view_0(toppage_jsp.java:219) at org.apache.jsp.faces.toppage_jsp._jspService(toppage_jsp.java:162) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301) at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:416) ... 23 more
JSF で、新規作成ボタンを押したら別ウィンドウが出て、 入力した結果を保存し、 元ウィンドウに戻り、画面を再表示する、という流れ。 (ajax を使ってできそうな気はするが、未対応。)
このときの画面遷移は、 (1) メイン画面で新規作成ボタンを押すと、別画面に入力フォームが表示される。 (2) 入力フォーム画面で入力して、[保存]を押すと、 保存の処理を行って、ウィンドウを閉じる。 (3) メイン画面が再表示される。
(2) のところで、 こういう怖いことをやっている。
<h:commandButton id="button4" styleClass="commandB" value="【保存】"
action="#{userBean.scenario.form.save}"
onclick="window.opener.location.href='#{userBean.url}';javascript:window.close()" />
保存ボタンを押すと、 action に指定した save が実行されるが、 onclick で指定された、 元のウィンドウの location を変更して、windows を閉じる、という処理も行われる。 ここの順序が怪しくて、 現象から想像すると、 元ウィンドウの画面を作成する処理で、 Managed bean である userBean のフィールドになっている scenario が再構築されていて、 その中にフォームで入力した情報が保持されている form というオブジェクトがあるのだが、 これを action で処理する前に、 (3) の処理中で初期化してしまって、 入力された情報が消滅したのではないか。
修正案はいくつかあるが、 保存した結果がよくない(保存できなかった)ときに元に戻れる方がいい、 ということもあるので、 action で save を呼び出すときに、 いきなり元ウィンドウの表示を更新せずに、 結果を画面に表示して確認させてから更新するようにした。 つまり、onclink のところは除去して、 この次の画面遷移で行うようにして解決。
onclick の中で location.href を指定してメイン画面を再表示しているのは、 (a) 単に reload だと、「form に情報を再送信するか」というダイアログが出てしまう。 (b) reload しても、追加されたデータが表示されない(状態がキャッシュされている?)。 のような問題があるため。 location.href で解決するというのは邪道だと思うのだが、 本道としてはどうすればいいのだろう?
http://localhost:18080/prototype/faces/dataBean.jsp
↓
http://localhost:18080/prototype/faces/dataBean.jsf
本来は、jsfの拡張子のモノをjspで指定してしまった場合に起こる。
jspだと、jspのタグしか解釈できず、jsfのタグが入っているとエラーになる模様
それにしても、エラーメッセージがわかりずらい
JSFで開発中、EL式の値が取得できないというエラーが発生しました。しかし、何が原因で発生したのかがわからなかったので、以下のように対応しました。
-問題のメソッドに以下のコードを入れて、例外の詳細が表示されるようにする
try {
} catch (Exception e) {
e.printStackTrace();
}
-このままだとこのメソッドが何度も呼ばれてログがスクロールアウトしてしまうので、System.exit(1);を追加して、tomcatごと落とす
結局、原因は不正なキャストでした。
jmeter2.2を実行中に、左側のツリーが表示されなくなり、あとで確認したらコンソールにエラーが表示されていました。「テーマの切り替え」をおこなったところ、操作可能な程度には回復しました。
エラーの詳細は、以下の通りです。
JMeterの評価で社内ページ(EUC)にアクセスしたときに、不正なUTF-8コードがあるという例外が多数出力されました。そこで、delegateを文字コード変換用のプロクシとして使ってみました。なお、delegateはコンテンツをキャッシュしますので、JMeterの本来の目的である負荷試験をおこなうには注意が必要です。
次のような warning が出ていた。
WARN org.apache.myfaces.renderkit.html.util.ReducedHTMLParser:566 - Invalid tag found: unexpected input while looking for attr name or '/>' at line 444
何のことか分かりにくいが、 jsf (jsp) のファイルの中の HTML 的エラーがあるという警告である。 今回の場合は、 次のような行があった。
<div id="lay_function"">
次のように修正すると warning が出なくなった。
<div id="lay_function">
ツリー表示のノード名の右に、子ノードの数が表示されるのだが、 この表示を消す方法が分からない。 よく調べると分かるのかもしれないが、 とりあえずそれ用の attribute とか見つからないので、 css で次のように指定してごまかしている。
.childCount
{
color: #FFFFFF;
font-size: 1%;
}
#FFFFFF はツリーを表示している箇所の背景色である。
ログインしても無視されて、もう一度ログインしたらログインできる、という現象があるというので考えてみた。
JSF で用意した login page に username と password を入力できるように Managed bean を置いておくと、入力した内容が入ったオブジェクトがプログラムに渡り、おきまりの手順の処理が行われる。
では、この login page を放置しておくとどうなるか。クライアントを放置しておくと、servlet (tomcat) は session timeout に指定された時間待って、その後 session が開放される。このとき、JSF の View も開放され、Managed bean も行き場を失う。しかし、ブラウザ上には、かなり前に表示したままの login page が残っている。ここに username と password を入力して、login ボタンを押すとどうなるか?
当然、action に指定されたメソッドを呼び出すためのオブジェクトは存在しない。そもそも、view が消滅しているから、JSF の Lifecycle としては、Phase 1 の Restore View が実行されたときに、デフォルトの状態をとりあえず用意するだけで、いきなり Phase 6 の Render Response フェーズまでスキップする。その結果、入力した username と password は無視され、再びログイン画面が表示される。
つまり、ログイン画面が session timeout していなければ、ログインの処理は成功する。さて、ここで問題なのだが、ログイン画面が表示された状態で長時間放置して、session timeout が発生したときも、username と password を 1度だけ入力してログインするようにしたい。
ブログ「三田ブログ」のカテゴリ「JSF MyFaces Tomahawk」に投稿されたすべてのエントリのアーカイブのページです。新しい順番に並んでいます。
前のカテゴリはJiroSearchです。
次のカテゴリはMovable Typeです。