FAQ

S2JSF

formのdisabled指定でsessionコンポーネントが破壊される

S2サポーター (2006-04-29 (土) 19:54:01)

Question
instance="session" としたコンポーネントのデータを
form の input タグで disbaled指定して表示すると、
表示そのものは元々の値が表示されるのですが、
その後、submit するとそのデータが壊されてしまいます。

表示している元々の内容にかかわらず、セッターが null で
呼ばれてしまうのが原因ですが、これは仕様でしょうか?

また、仕様だとすると回避する方法はありませんでしょうか?

セッターが呼ばれないか、せめて表示している値で再度
呼ばれればいいのですが、
null で呼ばれて壊されてしまうと
困ってしまいます。

− hoge.html −−−−−−−−−−
<html xmlns:m="http://www.seasar.org/maya">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
<title>Hoge</title>
</head>
<body>
<form>
  <input type="text" disabled="true" m:value="#{hogeDto.hoge}"/>
  <input type="submit" value="submit"/>
</form>
</body>
</html>

− hoge.java −−−−−−−−−−
package examples.jsf.dto;

public class HogeDto {
        private String hoge;
        public String  getHoge() {
                return hoge;
        }
        public void setHoge(String hoge) {
            System.out.println(hoge);
            this.hoge = hoge;
        }
}

− hoge.dicon −−−−−−−−−−
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
        "http://www.seasar.org/dtd/components21.dtd">
<components>
        <component name="hogeDto" class="examples.jsf.dto.HogeDto" instance="se ssion">
                <property name="hoge">"foo"</property>
        </component>
</components>



Answer
S2JSFを修正完了しました。
S2JSF 1.0.10から反映されています。

参考投稿
http://ml.seasar.org/archives/seasar-user/2005-November/000367.html
http://ml.seasar.org/archives/seasar-user/2005-November/000428.html

ファイルダウンロード後にIllegalStateExceptionエラー発生

S2サポーター (2006-04-29 (土) 19:47:12)

Question
ダウンロードのプログラムを下記のように実装しファイルのダウンロードは問題なく行えましたが、
その後の処理でIllegalStateExceptionエラーが発生して落ちてしまいます。

・環境
Java 1.5.0 Update5
Tomcat 5.5.12

Seasar2 2.2.11
S2JSF 1.0.28
Myfaces 1.0.8


・ソース

static public void download(HttpServletResponse response, String[] line, String fileName) throws IOException{

    response.setContentType("application/octet-stream;charset=Windows-31J");
    response.setHeader("Content-Disposition","attachment;filename=\""+fileName+"\"");
    
    
    PrintWriter out = response.getWriter();
    
    try{
    	// 各行の内容を繰り返し出力
    	for(int i = 0; i < line.length; i++){
      
    		out.print(line[i]);
    		out.print(System.getProperty("line.separator"));
    	}
    }
    finally {
    	if(out != null){
    		out.close();
    	}
    }
}



Answer

 下記2つの方法で対応可能

【Answer1】
プログラム中で
response.getWriter();
している個所を、
response.getOutputStream();
へ変更するとどうでしょうか?

OutputStreamWriter osw = new
OutputStreamWriter(response.getOutputStream(), encoding);
PrintWriter out = new PrintWriter(osw);

といった具合に。

【Answer2】
web.xmlのfilter-mappingを変える方法でもうまくできそうな気が
します。

現状はs2filterの後にextensionsFilterが適用されるようになって
いますが、extensionsFilterの後にs2filterが適用されるよう順序
を変更してみて頂けますか?


参考投稿
http://ml.seasar.org/archives/seasar-user/2005-November/000440.html
http://ml.seasar.org/archives/seasar-user/2005-November/000464.html
http://ml.seasar.org/archives/seasar-user/2005-November/000471.html

S2JSF1.0.8とmyfaces 1.1.0以降を組み合わせて使うと日付がずれる

S2サポーター (2006-04-29 (土) 19:43:46)

Question

S2JSF1.0.8とmyfaces 1.1.0以降を組み合わせて使うと日付がず れて表示されます。

例えば
s2jsf-exampleのmyfacesを1.1.0以降に入れ替えます。
Employee Managementのcreateを押し、Hire Dateを
2005/12/01で新たに登録します。
その後、登録したものを検索するとHire Dateを
2005/11/30と表示されます。
データベースには2005/12/01で登録されています。

myfaces 1.0.9では問題ありませんでした。
myfacesの問題なのでしょうか?

s2jsf-exampleのallconverter.diconに登録されてあるoutputDateTimeConverter
を指定してみましたが同じ現象でした。

ちょっと改造し時間まで表示させてみると2005/12/01 00:00:00のはずが、
2005/11/30 15:00:00となっています。

9時間ほど前の時間が表示されているようです。


Answer

ちょっとmyfacesのソースを見てみました。
myfaces 1.1.1だと、javax.faces.convert.DateTimeConverterのTimeZoneがnull
だとデフォルトのタイムゾーン(GMT)を返すようです。
myfaces 1.0.9だと、nullかどうかは判定せずそのまま返しています。
myfaces 1.0.9がどこでDateTimeConverterにタイムゾーンを設定しているかは追
いきれていませんが・・・

diconのConverterに以下のようにデフォルトのタイムゾーンを設定してやれば、
きちんと表示されるようになりました。


参考投稿
http://ml.seasar.org/archives/seasar-user/2005-November/000320.html
http://ml.seasar.org/archives/seasar-user/2005-November/000323.html
http://ml.seasar.org/archives/seasar-user/2005-November/000325.html

S2JSF1.0.9でページを継承しないで初期化アクションを実行するとエラーになる

S2サポーター (2006-04-29 (土) 19:41:59)

Question
S2JSF1.0.9でページを継承しないで初期化アクションを実行するとエラーになります。

s2jsf-exampleではemployeeSearch.htmlのm:extendsを削除し、

<html xmlns:m="http://www.seasar.org/maya"
	m:action="#{employeeSearchInitAction.initialize}">

として実行すると

[ESSR0065]クラス(examples.jsf.action.impl.EmployeeSearchInitActionImpl$$EnhancedByS2AOP$$ce2c57)のプロパティ(initialize)が見つかりません

というエラーが出力されます。

とりあえず初期化アクションが必要なものは、必ず何かのページを継承すれば回避できるようです。

Answer

問題に対応しました。
次バージョンから反映されます。

参考投稿
http://ml.seasar.org/archives/seasar-user/2005-November/000348.html
http://ml.seasar.org/archives/seasar-user/2005-November/000397.html

message タグでのメッセージ表示時に改行したい。

S2サポーター (2006-04-29 (土) 19:41:10)

Question
リソースファイルにメッセージを定義した内容を、S2JSFの h:message タグで表示する際に、
改行(brタグ)をしたいのですが、URLエンコードされてしまうためにうまく改行できません。

message タグでのメッセージ表示時に、改行する方法があれば、ぜひご教授ください。

Answer
対象ブラウザがIE5.5以上でしたら、次のようなCSSを指定してみてはいかがでしょうか?

table {
    max-width: 100%; 
    table-layout: fixed;
}

pre{
    word-wrap: break-word;
}


参考投稿
http://ml.seasar.org/archives/seasar-user/2005-November/000344.html
http://ml.seasar.org/archives/seasar-user/2005-November/000366.html

span m:valueで表示した内容が消える

S2サポーター (2006-04-29 (土) 19:31:42)

Question
S2JSFにおいて、<span m:value>によって表示した内容が消える
という問題が発生しています。

■現象

 select → edit → confirm のような画面の流れがあます。

 ・select画面では、何かしらの項目をドロップダウンリストにより選択する
 ・edit画面では、select画面で選択された値を以下のように表示している

  <span m:value="#{testDto.testValue}"/>
  <input type="hidden" m:value="#{testDto.testValue}"/>

 ・edit画面の他の入力項目にvalidationエラーが存在する場合、
  confirm画面に遷移せずにedit画面を再度表示する

 このような時に、<span m:value>で表示している内容が消えてしまいます。
 #hiddenで持っている値はHTMLのソースには出力されています。

 <input type="text" m:value="#{testDto.testValue}"/>で表示した場合は、
 内容は消えません。しかし、これでは編集できてしまいます。

 また、<input type="text" m:value="#{testDto.testValue}" m:disabled="true"/>
 とすると内容は消えてしまいます。

回避策などありましたら、教えてください。

Answer
※下記はMLの投稿に記載されていたBlogの内容である。
 BlogのUML:http://d.hatena.ne.jp/higayasuo/20051027#1130408672


JSFでhiddenで保持している項目を表示しているときに、バリデーションでエラーになってしまうと消えてしまうという問題が起きることがあります。
ここでは、S2JSFをサンプルにして説明しますが、JSFでもあてはまります。
あるデータの編集画面があり、その画面は、hogeというJavaBeansと関連付けられているとします。また、hogeにaaaというプロパティがあって、表示専用だとします。
この画面のhtmlは次のように作りがちです。

<form>
  <input type="hidden" m:value="#{hoge.aaa}"/>
  <span m:value="#{hoge.aaa}"/>
  ...
</form>


残念ながら、上記のように作ると、項目のどこかでバリデーションエラーが起きると、hoge.aaaを表示している部分が消えてしまいます。
なぜなら、hiddenで保持している項目をJavaBeans(hoge)に反映させる処理は、バリデーションがOKの場合にしか実行されないため、バリデーションエラーが起きたときは、hiddenで保持している値はJavaBeans(hoge)に反映されないためです。
じゃどうすれば良いのかというと、表示用のspanは、hiddenで保持されているリクエストのパラメータを直接参照するようにするのです。

<form id="hogeForm">
  <input type="hidden" id="aaaHidden" m:value="#{hoge.aaa}"/>
  <span m:value="#{param['hogeForm:aaaHidden']}"/>
  ...
</form>


これで、確かに、バリデーションエラーになったときに、hiddenの項目を表示できるようになりました。
でも、問題があります。画面が最初に表示されるときは、hiddenの値がリクエストで飛んでこないため、表示できないのです。
最終的な解決策は、次のようになります。

<form id="hogeForm">
  <input type="hidden" id="aaaHidden" m:value="#{hoge.aaa}"/>
  <span m:value="#{hoge.aaa != null ? hoge.aaa :
    param['hogeForm:aaaHidden']}"/>
  ...
</form>


最初に画面が表示されるときは、hoge.aaaが設定されているので、それを使い、バリデーションエラーでhoge.aaaが設定されていないときには、リクエストのパラメータを使うのです。

参考投稿
http://ml.seasar.org/archives/seasar-user/2005-October/000589.html
http://ml.seasar.org/archives/seasar-user/2005-October/000637.html

HttpServletRequest の自動バインディングを行うとエラー

S2サポーター (2006-04-29 (土) 19:28:37)

Question
S2JSF-Examples の、ForEach2ListActionImpl に、

private HttpServletRequest request = null;
public void setRequest(HttpServletRequest aRequest) {
    request = aRequest;
}


と定義して、サンプルを実行すると、

java.lang.UnsupportedOperationException: getInstanceMode
    at org.seasar.framework.container.impl.SimpleComponentDef.getInstanceMode(SimpleComponentDef.java:272)
    at org.seasar.jsf.util.InvokeUtil.exportVariables(InvokeUtil.java:108)
    :
   (以下、省略)


と、例外が発生し、画面が遷移しません。

JDK1.4.2、Tomcat5.0.28、S2JSF1.0.8 です。


Answer
原因わかりました。
HttpServletRequest に対して、setter だけではなく、getter を定義していたためのようです。
setter だけにしたら、発生しなくなりました。

参考投稿
http://ml.seasar.org/archives/seasar-user/2005-October/000608.html
http://ml.seasar.org/archives/seasar-user/2005-October/000620.html

ActionへHttpServletRequestがインジェクトされません

validatorでNGの時のメッセージをalertで出力したい

S2サポーター (2006-04-29 (土) 19:25:07)

Question
validatorでNGの時のメッセージをalertで出力したいのですが、どのように
したらよいでしょうか?

Answer
JavaScriptでの入力チェックならalert出力するのは容易ですがサーバ側での入力チェックの結果を
JavaScriptで出力するとなると少々、力技が必要かなと思います(S2JSFに限った事では無く)
考えられるのは、画面のonload処理でバリデーションエラーがあったかどうかを判断しalert表示する。

バリデーションエラーがあったかどうかの判断はformのhiddenを利用する等になるかと思います。

例えば、Action内でsessionに"ErrorMsg"というキーでエラーメッセージを
格納した場合、hiddenには以下のように記述し

<input type="hidden" id="err" m:value="#{sessionScope['ErrorMsg']}"/>


onload時に、上記のhidden値をチェックして値があればalert表示。

参考投稿
http://ml.seasar.org/archives/seasar-user/2005-December/000269.html
http://ml.seasar.org/archives/seasar-user/2005-December/000272.html

m:passthrough="true"を指定すると、convert属性が効かなくなる。

S2サポーター (2006-04-29 (土) 19:23:00)

Question

m:passthrough="true"でいくつかの属性が無効果になってしまうことはあ
りませんか?
現在、以下の記述(そのまま写したので取り留めの無い形になっていますが)で
convert属性がききません。m:passthroughをとるとうまくいきます。仕様でしょ
うか?

<input type="text" size="15" maxlength="10" 
   m:value="#{xp001_6.code}" 
   m:onchange="changeCode(this, 'name');"
   id="code" name="code" 
   m:converter="#{rightPad10}" 
   m:passthrough="true"
   onfocus="this.select();" 
   m:onKeyPress="return Help(this,event,'承認ルート一覧')"/>


Answer

m:passthrough="true"をタグの属性に追加すると
m:passthrough="true"以外の部分を、そのまま出力するというのが
現在の仕様ですね。
#m:passthorugh="true"にした場合とそうでない場合での
 出力されたHTMLのソースを見ると分かると思います。

ちなみに下記ソースでm:passthrough="true"を使用したい目的は
JavaScriptでformのcode.value等を利用したいからでしょうか?
そうであれば、formのidがhogeの場合、JavaScriptからは
下記textの値は、document.hoge['hoge:yone2'].valueで利用出来ます。


参考投稿
http://ml.seasar.org/archives/seasar-user/2005-December/000268.html
http://ml.seasar.org/archives/seasar-user/2005-December/000271.html

selectボックスのクリックイベントにてm:immediate=trueとするとDTOに値がセットされなくなる

S2サポーター (2006-04-29 (土) 19:17:05)

Question

以前[seasar-user:2550]で、S2JSFでselectボックスから選択した際
javascriptでsubmitする方法を教わりました。

それに対し追加で質問がございます。

上記の方法でsubmitした場合、m:immediate="true"とすると値を受け取りません。
つまり、リストから選択した値がm:valueで指定のプロパティにセットされません。
なぜこの現象が発生するのか教えてください。
画面の挙動としては、submitはされますが選択する前と全く同じ状態で表示されます。
m:immediate="true"の記述を削除すると正常に受け取れます。

Answer

m:immediate="true"の場合、updateModelフェーズがスキップされるので、
値を受け取ることはできません。
これは、JSFの仕様です。


参考投稿
http://ml.seasar.org/archives/seasar-user/2006-February/005192.html
http://ml.seasar.org/archives/seasar-user/2006-February/005195.html

コンポーネントの名前によってactionのセッタが呼ばれない

S2サポーター (2006-04-29 (土) 19:11:26)

Question

コンポーネントの名前によってactionのセッタが呼ばれなくなるようです。

s2jsf-example の Add で
AddDtoのコンポーネントネームを addDto から hogeAddDto に変更した場合、

具体的には add.diconの

<component name="addDto" class="examples.jsf.dto.AddDto" instance="request"/>

AddActionImpl.javaの

void setAddDto(AddDto addDto)

add.htmlの

#{addDto.arg1}

などを、それぞれ、

<component name="hogeAddDto" class="examples.jsf.dto.AddDto" instance="request"/>

void setHogeAddDto(AddDto addDto)

#{hogeAddDto.arg1}

などと変更した場合、

問題なく動作しますが、addDto を hAddDto に変更すると動作しなくなります。

<component name="hAddDto" class="examples.jsf.dto.AddDto" instance="request"/>

void setHAddDto(AddDto addDto)

#{hAddDto.arg1}


setHAddDto()が呼ばれなくなってしまうようなのですが、
コンポーネント名には、つけてはいけない名前が存在するのでしょうか?


Answer

JavaBeansのネーミングルールにより、setHAddDto()のプロパティ名は、
HAddDtoです。hAddDtoではありません。
コンポーネントの名前を変える必要があります。

参考投稿
http://ml.seasar.org/archives/seasar-user/2006-February/005116.html
http://ml.seasar.org/archives/seasar-user/2006-February/005117.html

カスタムコンポーネント用tldファイルの配置場所について

S2サポーター (2006-04-29 (土) 19:10:15)

Question

独自に作成した、JSF のカスタムコンポーネントをS2JSF で使用するとき、
TLDファイルは、どこに置き、どのような宣言をすればいいのでしょうか?

たとえば、/WEB-INF/tlds/MyTag.tld を作成し、jsf.dicon に、

<initMethod name="addTaglibUri">
    <arg>"my"</arg>
    <arg>"/WEB-INF/tlds/MyTag.tld"</arg>
</initMethod>


 と宣言したところ、[Seasar-user:2453] でも報告されているような
エラーとなります。
 [Seasar-user:2454] のように、jar ファイルを作成して配置する、という
方法が取れない場合、たとえば、Webアプリケーションの中の一機能として、
カスタムコンポーネントが存在し、その機能を、繰り返しテストしたい
といったような場合です。


Answer

1.0.13以前のバージョンは、tldは、jarファイルの中にあるものしか見つけられません。
1.0.14で、利用できるようになりました。

■利用方法

1. WEB-INF/tlds/some.tldへtldファイルを配置
2. web.xmlへtaglib要素を追加

# web.xml

<taglib>
  <taglib-uri>/some_uri</taglib-uri>
  <taglib-location>/WEB-INF/tlds/some.tld</taglib-location>
</taglib>


taglib-locationは、実際に配置する箇所にします。

3. jsf.diconへエントリを追加

org.seasar.jsf.runtime.JsfConfigImplへinitMethodを追加。

# jsf.dicon

<initMethod name="addTaglibUri">
  <arg>"some"</arg>
  <arg>"http://somedomain/"</arg>
</initMethod>


第2引数はsome.tldのtaglib/uriとあわせます。

4. jsf.diconを修正

上部にある記述を変更します。

# jsf.dicon

<component class="org.seasar.jsf.runtime.ServletContextTaglibManagerImpl">
  <initMethod name="init"/>
  <destroyMethod name="destroy"/>
</component>


↓変更

<component class="org.seasar.jsf.runtime.CompositeTaglibManager">
  <initMethod name="addTaglibManager">
    <arg>
      <component class="org.seasar.jsf.runtime.ServletContextTaglibManagerImpl">
        <initMethod name="init"/>
        <destroyMethod name="destroy"/>
      </component>
    </arg>
  </initMethod>
  <initMethod name="addTaglibManager">
    <arg>
      <component class="org.seasar.jsf.runtime.WebappConfigTaglibManagerImpl">
        <initMethod name="init"/>
        <destroyMethod name="destroy"/>
      </component>
    </arg>
  </initMethod>
</component>



参考投稿
http://ml.seasar.org/archives/seasar-user/2006-January/000164.html
http://ml.seasar.org/archives/seasar-user/2006-February/005049.html
http://ml.seasar.org/archives/seasar-user/2006-February/005065.html

validatorタグを利用すると例外が発生する

S2サポーター (2006-04-29 (土) 19:07:17)

Question

s2jsf 1.0.13 でS2ホットスワップモードを有効にしてvalidatorタグを利用するとRu
ntimeExceptionが発生します。無効だと正常です。S2JSF Example 1.0.13で確認しま
した。実行環境はWindows XP SP2、J2SDK1.4.2.10、Tomcat5.0.28 です。

RuntimeException:

 java.lang.RuntimeException: Could not restore StateHolder of type
$Proxy53 (missing no-args constructor?)



Answer

diconファイルにValidatorを登録すると、hotswapは利用できません。
faces-config.xmlに登録して使う分には大丈夫ですので、
hotswapを使う場合は、そちらの方法をお試しください。


参考投稿
http://ml.seasar.org/archives/seasar-user/2006-February/005144.html
http://ml.seasar.org/archives/seasar-user/2006-February/005146.html

Firefoxブラウザでプロパティ設定に失敗する

S2サポーター (2006-04-29 (土) 19:00:53)

Question

作成中のシステムで、FireFox を使用したときにプロパティの設定に失敗する場合があります。

たとえば、html に、

<input type="button" value="送信" m:action="#{testAction.sendMail}" />


とあり、TestActionBean に、

private int selectedScheduleTimeID = 0;
private int selectedLocationID = 0;

(と、それぞれのsetter)

が定義してあるような場合です。
この場合、送信ボタンを押すと、sendMail() は実行されるのですが、この画面を再表示する際に、FireFox だと、

TestActionBean$$EnhancedByS2AOP$$17d2d70)のプロパティ(selectedLocationID)の設定に失敗しました。
理由はjava.lang.NumberFormatException: For input string: ""


とのエラーになります。

リクエスト内容を調べてみると、IE の場合、

SelectScheduleComplete.html_SUBMIT=1&selectedScheduleTimeID=null&selectedLocationID=null&selectScheduleCompleteViewForm%3A_link_hidden_=null
(リクエストの前半は省略しています)

と、selectedScheduleTimeID、selectedLocationID に対して、"null" が送られていますが、
FireFox の場合、

SelectScheduleComplete.html_SUBMIT=1&selectedScheduleTimeID=&selectedLocationID=&selectScheduleCompleteViewForm%3A_link_hidden_=

のように、"" が送信されています。
これはブラウザに依存するのでどうしようもないと思うのですが、S2JSF側でこの2つを同じ扱いにすることはできないでしょうか?



Answer

S2JSFを修正しました。
S2JSF 1.0.14から反映されています。

■修正内容
hidden値のクリアの際に、明示的に'null'を指定するよう以下のRendererを修正しました。

org.seasar.jsf.render.html.HtmlCommandLinkRenderer.java
org.seasar.jsf.render.html.HtmlFormRenderer.java

参考投稿
http://ml.seasar.org/archives/seasar-user/2006-February/005041.html
http://ml.seasar.org/archives/seasar-user/2006-February/005056.html

<body>タグにJavaScriptを埋め込む方法

S2サポーター (2006-04-29 (土) 18:58:13)

Question

■出力形式例

<body onunload="">


s2jsf-exampleに存在するlayout.htmlのbodyタグに「onunload=""」を記載し、layout.htmlを継承しているHTMLファイルを持つサンプルを実行しました。
実行したサンプルにて表示しているHTMLを確認したところ、「<body>」のみを出力してしまいます。
(onunload=""が表示されていない)


Answer

<body onunload="a">

のように、属性値があれば出力されます。
(現状では、属性値がnullや""の場合は属性自体を出力していません)


参考投稿
http://ml.seasar.org/archives/seasar-user/2006-February/005060.html
http://ml.seasar.org/archives/seasar-user/2006-February/005061.html

ページの初期化処理で無限ループ発生

S2サポーター (2006-04-29 (土) 18:49:05)

Question
ページの初期化処理で無限ループが発生して困っています。

 s2jsf-example では、完全に再現ができないのですが、次のような感じ
です。

 1. EmployeeSearchInitActionImpl#initialize を、以下のように変更.
    ----------------------------------------------------------------
   public String initialize() {
       System.out.println("初期化処理");
       if(1 == 1) {
           return "errorPage";
       }
       departmentDtoList = employeeLogic.getAllDepartments();
       return null;
   }
    ----------------------------------------------------------------

 2.faces-config.xml に、以下を追加
    ----------------------------------------------------------------
   <navigation-rule>
       <navigation-case>
           <from-outcome>errorPage</from-outcome>
           <to-view-id>/employee/errorPage.html</to-view-id>
           <redirect/>
       </navigation-case>
   </navigation-rule>
    ----------------------------------------------------------------

 3. /employee/errorPage.html を作ります。中身はなんでもいいです。


 この状態で、メニューからEmployee Management をクリックすると、
EmployeeSearchInitActionImpl#initialize が2回実行されています。

 この2回実行されている現象が関係しているのかどうかはわかりませんが、
こちらの作成中のシステムだと、2回目に同じ処理(上の例だと、もう1度
Employee Management をクリックする)をすると、ページの初期化処理が
無限に実行されてしまいます。
 
 org.seasar.jsf.runtime.ErrorPageManagerImpl を使っていない理由は、
エラーログに余計なログを吐きたくないため(log4j で、ERROR の場合は
管理者へメールが送信される設定になっている)なのですが、
ためしに、org.seasar.jsf.runtime.ErrorPageManagerImpl を使った方法
にしてみると、1回めは正しくエラーページが表示されるのですが、
2回目以降はブラウザに例外情報が表示されてしまい、エラーページへ遷移
されません。

 ちょっと原因も回避方法もわからず困っているのですが、手がかりになる
ような情報があれば、教えていただけると大変助かります。


Answer
※本件のバグフィックスリリースはS2JSF 1.0.14で行われた。

現象を修正しました。

■原因

dispatchでsubmitした画面へ遷移した際に、再度decode処理が行わ
れていたことでした。

■修正内容

リクエスト内で初回のLifecycleでのみ

  • APPLY_REQUEST_VALUES (2)
  • PROCESS_VALIDATIONS (3)
  • UPDATE_MODEL_VALUES (4)
  • INVOKE_APPLICATION (5)

のフェーズを実行するように変更しました。
(dispatch後のLifecycleではスキップします。)
初期化Actionは RENDER_RESPONSE (6) フェーズで行っているため、
この変更の影響を受けません。


参考投稿
http://ml.seasar.org/archives/seasar-user/2006-January/000203.html
http://ml.seasar.org/archives/seasar-user/2006-January/000204.html
http://ml.seasar.org/archives/seasar-user/2006-January/000206.html

m:rendered使用時のActionが呼ばれない

S2サポーター (2006-04-29 (土) 18:43:04)

Question

<input type="submit" value="追加" m:action="#{maintenanceProject.confirm}" />

というボタンがあり、押すと、バリデーション → confirm アクションの実行となります。

これを、

<span m:rendered="#{projectForm.mode == 'add'}" >
<input type="submit" value="追加" m:action="#{maintenanceProject.confirm}" />
</span>

とすると、バリデーションは実行されますが、confirm アクションが実行されず、画面が再表示されます。

Answer
原因がわかりました。
ボタン押下時にActionが実行されないのは、押下のタイミングでは
27行目のrenderedがfalseと評価されるためです。

  • viewLogFormはREQUESTスコープにあるので、ボタン表示時と押下時でインスタンスが異なります。
    押下時にはselectedLogFile属性は初期値""になっています。
    結果、押下時にはspanのrenderedはfalseになります。
  • renderedがfalseのUIComponent配下は、encodeがスキップされます。
  • ボタンのencodeがスキップされるため、Actionが実行されません。

ということが起こっています。

回避策としては、viewLogFormをSESSIONスコープへ置くか、hiddenと組み合わせるか(←詳しく検討してい
ませんが)といった方法があるかと思います。


参考投稿
http://ml.seasar.org/archives/seasar-user/2005-November/000400.html
http://ml.seasar.org/archives/seasar-user/2005-December/000302.html
http://ml.seasar.org/archives/seasar-user/2006-January/000178.html

S2JSF AOPによるページ遷移の方法

S2サポーター (2006-04-29 (土) 18:34:55)

Question
現在S2JSFでいろいろと試しています。
やりたい事は、

AOPでログイン判定
ログイン未なら
ページパスを指定して遷移

を考えているのですが
S2JSFでは何を呼び出して画面の遷移をしたらいいのかがわかりません。


Answer
AspectをActionへ掛けることを想定されているのですよね?

JSFでの画面遷移は、ActionがreturnするStringで決まります。
ですので、Aspectで次画面を示すStringをreturnすればOKと思います。

簡単な例をあげますと...
faces-config.xmlへ次のように書いている場合には、Actionへ仕掛
けたAspectにて"login"をreturnすることで/login.htmlへ遷移でき
ます。

<navigation-rule>
  <navigation-case>
    <from-outcome>login</from-outcome>
    <to-view-id>/login.html</to-view-id>
  </navigation-case>
</navigation-rule>


参考になれば幸いです。


参考投稿
http://ml.seasar.org/archives/seasar-user/2006-March/005226.html
http://ml.seasar.org/archives/seasar-user/2006-March/005232.html

formのaction属性を指定したい

S2サポーター (2006-04-29 (土) 17:59:10)

Question
S2JSFでは自動的にform actionを自画面のREQUEST URIか何かを挿入してくれると
考えてよろしいでしょうか。

また、actionを手動で設定することはできるのでしょうか。


Answer
m:passthrough="true"を属性に指定する事でHTMLのタグがそのまま出力されます。
以下を参考に試して頂けますか?

<form name="hoge" method="post" action="/add.html" m:passthrough="true">


参考投稿
http://ml.seasar.org/archives/seasar-user/2006-March/005306.html
http://ml.seasar.org/archives/seasar-user/2006-March/005307.html

<input type="password">のm:value属性で指定されたDtoの値が空で表示される

S2サポーター (2006-04-29 (土) 16:40:29)

Question

  • 環境
    • S2Container 2.3.7
    • S2JSF 1.0.14
    • S2JSF-example 1.0.14
    • Apache-Tomcat-5.5.12
    • JDK1.5.0_03

  • 現象
    input type="password">のm:value属性で指定されたDtoの値が
    HTMLに反映されず空で表示される。(value属性がHTMLに出力されない)

  • 期待する動作
    Dtoの属性値が<input type="password">のvalue属性に設定された状態で
    HTMLが生成される。

Answer
inputの属性に m:redisplay="true" を追加してみていただけます
か? 値が表示されると思います。

password値がデフォルトで表示されない(redisplay="false")のは、
JSFの仕様です。

参考投稿
http://ml.seasar.org/archives/seasar-user/2006-April/005416.html'
http://ml.seasar.org/archives/seasar-user/2006-April/005417.html

HTMLを書いたとおりに出力したい

m:passthrough="true" による素のHTML出力

次に示すhtmlを s2jsf-example/test/test.html として作成します。

01:<html xmlns:m="http://www.seasar.org/maya">
02:<body>
03:<form>
04:Test
05:</body>
06:</html>

実際の出力結果は以下のようになります。

01:<html xmlns:m="http://www.seasar.org/maya">
02:<body>
03:<form id="_id9" name="_id9" method="post" 
       action="/s2jsf-example/test/test.html" enctype="application/x-www-form-urlencoded">
04:Test
05:</body>
06:</html>

ここで任意にname属性やaction属性を指定したい場合には、次に示すようにm:passthrough="true"をformタグに指定します。

01:<html xmlns:m="http://www.seasar.org/maya">
02:<body>
03:<form name="testForm" action="hoge.html" method="post" m:passthrough="true">
04:Test
05:</body>
06:</html>

m:passthrough="true"を指定した場合の出力結果は以下のようになります。

01:<html xmlns:m="http://www.seasar.org/maya">
02:<body>
03:<form action="hoge.html" name="testForm" method="post">
04:Test
05:</body>
06:</html>

m:passthrough="true"を指定した場合は、m:passthrough="true"以外の属性が全てそのまま出力される事が分かります。 formタグだけではなく、他のinputタグ等に関しても同様の指定が可能です。

JavaScriptから任意のActionを実行したい

ラジオボタンやチェックボックスのクリック時に指定したActionメソッドを呼び出す方法をs2jsf-exampleのaddを例にとって見てみましょう。

add.htmlのformタグ以降を以下のように変更します

01:<form id="form1">
02:<a id="dummy1" m:action="#{addAction.calculate}"/>
03:<input type="checkbox" onclick="doAction();"/>calculate<br/>
04:<script type="text/javascript">
05:<!--
06:function doAction() {
07:  var f=document.forms['form1'];
08:  f.target='';
09:  f.elements['form1:_link_hidden_'].value='form1:dummy1';
10:  f.submit();
11:  return false;
12:}
13://-->
14:</script>

1行目でformタグにid属性を設定します(今回は"form1")。 2行目で呼び出したいactionを設定したダミーのanchorを記述します。この際、anchorにもid属性を設定します(今回は"dummy1")。 4行目から14行目に呼び出したいJavascriptを記述します。 8行目でformのtargetをクリアします。 11行目で呼び出したいactionのidを指定しています。指定方法は formのid:_link_hidden_ となり :_link_hidden_ の部分は固定です。 これによりJavascriptから指定アクションを呼び出す事が可能です。

カスタムバリデータにおける他の入力値参照方法

TODO

ファイルをアップロードしたい

ファイルアップロードサンプルを紹介します。

jsf.diconに以下のMyFacesの拡張タグを追加します

<initMethod name="addTaglibUri">
   <arg>"x"</arg>
   <arg>"http://myfaces.sourceforge.net/tld/myfaces_ext_0_9.tld"</arg>
</initMethod>

次にHTMLを作成します

01:<html xmlns:m="http://www.seasar.org/maya">
02:<head>
03:<meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
04:<title>UploadSample</title>
05:</head>
06:<body>
07:<form enctype="multipart/form-data">
08:<span m:inject="x:inputFileUpload" m:value="#{hogeDto.uploadedFile}" />
09:<input type="submit" value="uploadSample"/>
10:</form>
11:</body>
12:</html>

08行目のhogeDtoを定義します

package examples.jsf.dto;

import java.io.Serializable;

import org.apache.myfaces.custom.fileupload.UploadedFile;

public class HogeDto implements Serializable {
    public static final String uploadedFile_BINDING = "bindingType=none";

    private UploadedFile uploadedFile;

    public UploadedFile getUploadedFile() {
        return this.uploadedFile;
    }
    
    public void setUploadedFile(UploadedFile uploadedFile) {
        this.uploadedFile = uploadedFile;
        System.out.println("uploadFileSize["+uploadedFile.getSize()+"]");
    }
}

これでファイルのアップロードが可能です。ファイルを指定してuploadSampleボタンを押すとuploadFileSizeが標準出力に出力されるはずです。

「〜設定をスキップします」のWARNログを出力を出力しないようにBindingアノテーションを指定しています。

詳しくはBindingAnnotationを参考にして下さい。

ファイルダウンロードをしたい

TODO

FacesContextをDIしたい

まず以下のようにdiconファイルにFacesContext#getCurrentInstanceのコンポーネントを登録します。

<component name="facesContext" instance="request">
    @javax.faces.context.FacesContext@getCurrentInstance()
</component>

あとはFacesContextを利用したいコンポーネントでsetFacesContextを定義します

private FacesContext facesContext;

public void setFacesContext(FacesContext facesContext) {
  this.facesContext = facesContext;
}

※注意事項としましては、FacesContextを利用するコンポーネントでは、 コンポーネントのinstance属性を"request"または"prototype"に設定する必要があります。

JavaScriptを使用したくない

Question

ブラウザがJavaScriptをOFFにしている場合でも、アプリケーションを利用できるようにしたい。

Answer

JavaScriptを使用するJSFタグを使用しないようにしましょう。 そのJSFタグはCommandLinkです。

とすればOKです。

S2JSFでは

<a m:action="fooAction">foo</a>

のようにa要素にaction属性があるとCommandLinkとして扱います。

action属性が無い場合↓はOutputLinkとして扱います。

<a href="foo.html">foo</a>

画面から"null"を入力すると、対応するBeanのプロパティにnullがセットされてしまう

メモリ消費量を抑えるためにSessionにキャッシュされるコンポーネントツリーの数を制限したい

Question

メモリ消費量を抑えるために Sessionにキャッシュされるコンポーネントツリー(SerializedView)の数を制限したい。

Answer

web.xmlに以下のように設定することで、Session上にキャッシュされるコンポーネントツリー(SerializedView)の数を制限することができます。

<context-param>
 <param-name>
  org.seasar.jsf.UI_VIEW_ROOT_CACHE_SIZE
 </param-name>
 <param-value>10</param-value>
</context-param>

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-01-24 (水) 11:11:24