[[FAQ]] *Teeda [#q6e5781b] #contents **インクルードしたhtmlで前ページからのプロパティを参照したい [#n61605b9] - A: http://ml.seasar.org/archives/seasar-user/2007-June/010238.html **Tomcat起動時にParserConfigurationExceptionが発生する [#z2ade9df] Tomcat起動時に次のようなエラーが発生する場合、 > org.seasar.framework.exception.ParserConfigurationRuntimeException: [ESSR0053]パーサの設定に問題があります。理由はjavax.xml.parsers.ParserConfigurationException: Feature 'http://apache.org/xml/features/xinclude' is not recognized. $TOMCAT/common/endorsedにある、xercesImpl.jarとxml-apis.jarを削除してください。 (Tomcat 5.5.20で確認) **TeedaExtensionでFormにInputTextが一つしかないとsubmit時にname属性が飛ばない。 [#m1fce656] 以下のように、formに1つのInputTextしか無い場合に、inputTextにfocusして Enterキーを押すとname属性がわたらず、doXxxが呼ばれない。 この現象はIEの場合のみ発生する。 <form id="form"> <span>hogehoge</span> <input type="text" id="arg1" title="INPUT1" /> <input type="submit" value="calculate" id="doCalculate"/> </form> これを解消するには、 <input type="text" style="display: none"/> をひとつ追加する **TeedaをWAS6.1で動かす [#c3390567] TeedaをWAS6.1で動かすには、 -WEB-INF/libにServletのjarが含まれていたら消去してWARにする. -WASの設定で、WARのクラスローダーに「最初にアプリケーションクラスローダーをロードしたクラス」を選択する **動的にHTMLタグの属性を設定を行うには [#o0388425] DynamicPropertyを使用してください。 http://teeda.seasar.org/ja/extension_features.html#dynamicproperty **TeedaのPageClass からコンポーネントをスコープに置くには [Seasar-user:5581] [#ad708177] service,dtoなどの適当なパッケージにコンポーネントを作り、 @Component(instance=InstanceType.SESSION) public class ... のようにインスタンス属性を指定してください。 **個別の例外に応じてエラーページを設定する [#p89be55a] teedaErrorPage.diconに個別の例外に応じてエラーページの設定を記述します。 <component class="org.seasar.teeda.extension.util.TeedaExtensionErrorPageManagerImpl"> <!--ここから追加--> <initMethod name="addErrorPage"> <arg>@org.seasar.framework.exception.SRuntimeException@class</arg> <arg>"/view/error/custom.html"</arg> </initMethod> <!--ここまで--> <initMethod name="addErrorPage"> <arg>@java.lang.Throwable@class</arg> <arg>"/view/error/error.html"</arg> </initMethod> </component> この場合、個別の例外の設定のほうが上にくるようにしてください。 **NullLabelの「選択してください」という文面を変更するには [#m9ca05ec] propertiesで切り替えることが出来ます。 まずpropertiesファイルを作成して、faces-config.xmlに定義します。 (名前は一般的には、appMessages.propertiesがよく使われます) このあたりはteeda-html-exampleを参考にしてください。 そこに、 org.seasar.teeda.extension.component.TSelect.NULL_LABEL というキーで値を設定すればこのNULLラベルが使用されます。 **Pageクラスでrequest/response/session/context/FacesContextを使用するには [#xfc0eff8] pageクラスに、以下のプロパティを用意してください。 |クラス|プロパティ名| |HttpServeltRequest|-| |HttpServeltResponse|-| |HttpSession|-| |ServletContext|-| |FacesContext|facesContext| **Pageクラスから直接エラーメッセージを設定する [#q79cd033] javax.faces.internal.FacesMessageUtilを使用して、 FacesMessageUtil.addErrorMessage("E0000002"); のようにしてください。 メッセージは、 WEB-INF/faces-config.xmlで指定したプロパティファイルに記述します。 **実体参照を表示するには [#m215ddb5] 例えばノーブレークスペース(non-breaking space, NBSP)を表示したい場合、テンプレートHTML上では次のように記述します。 -Teeda 1.0.12以降で[[CLASSIC>http://teeda.seasar.org/ja/extension_customize.html#parse-xhtml]]以外の場合はそのまま記述します -Teeda 1.0.11 以前またはTeeda 1.0.12以降で[[CLASSIC>http://teeda.seasar.org/ja/extension_customize.html#parse-xhtml]]の場合は一段階エスケープします & -outputTextでノーブレークスペースを表示する場合は、Pageクラスのプロパティに'\u00A0'を設定します。 this.message = "\u00A0" **conditionコンポーネントの<div>タグにDynamicPropertyを設定したい [#z6f06f15] <div id ="isNotCreate" style="〜"> なタグにDynamicPropertyを設定する場合、 public String getIsNotCreateStyle() { //略 } となります。 **静的HTMLをTeedaの処理対象から外す [#h66c0434] TeedaはHTMLファイルをXMLとして解析するので、静的なHTMLをそのまま出力する場合にXMLとしてwell-formedでないと例外になります。 静的なHTMLは拡張子を.htmにすれば、Teedaの処理対象ではなくなるのでひとまず出力することができます。 **LogicやHelperにFacesContextをDIしたい [#u29c5deb] Teeda は FacesContext を外部コンテキストに設定するので、creator.dicon で、 <component class="org.seasar.framework.container.creator.LogicCreator"> <property name="externalBinding">true</property> </component> とすれば Logic にも FacesContext が DI されるようになります。 Helperも同様です。 **バリデーションのエラーメッセージに id ではなく日本語を使うには? [#r01c25bf] Label機能を使用して、idに対する日本語名称を設定します。 http://d.hatena.ne.jp/dewa/20070720#1184920170 **別サーバーのCGIを呼び出したい [#r2aaf4e6] Pageクラスで普通にリダイレクトしてもらえれば 問題ありません. FacesContextのresponseComplete()だけは呼び出してください. 下記のような感じです. public String doHoge() throws IOException { response.sendRedirect("http://www.yahoo.co.jp"); response.sendRedirect("http://www.example.com/"); facesContext.responseComplete(); return null; } **PageクラスでCSVダウンロードをさせたい [#u67e358f] 流れとしては以下のような手順になる -ダウンロードするFileを生成 -ContentTypeやヘッダ情報の付加 -ServletOutputResponseStreamに書き出す -FacesContext.responseComplete()を呼び出す public void doDownload() { final File file = downloadHelper.getFile("javaexpert-sample.csv"); response.setContentType("application/octet-stream"); response.setHeader("content-disposition", "attachment; filename=\"" + file.getName() + "\""); OutputStream os = null; try { os = response.getOutputStream(); os.write(FileUtil.getBytes(file)); } catch (IOException e) { throw new AppFacesException("E0000002"); } finally { try { os.close(); } catch (final IOException e) { } } this.facesContext.responseComplete(); } **ファイルアップロード [#iac58710] 1.0.13 からは Teeda の FileUpload コンポーネントを使うことができます. http://teeda.seasar.org/ja/extension_features.html#fileupload 1.0.12 以前の場合は,TomahawkのFileUploadを使います。 http://d.hatena.ne.jp/shot6/20061122#1164175683 Teeda 1.0.8-RC1までは上記方法で動作するのを確認しています。 **Validationエラーのメッセージを変更する [#r5f769a3] http://d.hatena.ne.jp/dewa/20070808#1186573480 **foreachの中身が表示されない [#r6c95bf4] foreachを使う場合、DTOやMapで持っているIDと同じフィールドを、Pageの方にも持たせる必要があります。 **特定のPageにだけ(もしくは特定のPage以外のPageに)Interceptorをかけるには [#wc5e353d] 特定のPageだけなら、Pageクラスに @Aspect(インターセプタ名) public String doHoge() { ... } のようにアノテーションを指定します。 **Pageにaspectが適用されない [#h4f2ce5c] Seasar2のデフォルトでは、aspectはそのクラスのインターフェースで定義されているメソッドに適用されます。 TeedaのPageクラスはインターフェースを持ってないので、cunstomizer.diconでcustomizerの設定をするときに <property name="pointcut">"do.*, initialize, prerender"</property> のようにポイントカットを指定する必要があります。 **ForEach内でチェックボックスを使用する [#td33d48d] http://d.hatena.ne.jp/yone098/20070122/1169446352 をご参照ください。 **foreachでリストを展開したときに、一部のプロパティだけ表示されない [#i14a8060] Pageがもっているプロパティの型とDto/Mapのプロパティの型が一致しているか確認してください。