カスタムコンバータと既存のコンバータ

DateTimeConverter.java
import java.util.TimeZone;
public class DateTimeConverter extends javax.faces.convert.DateTimeConverter {
     public static final String CONVERTER_ID =xxx.xxxx.xxxxx.DateTimeConverter.class.getName();

     public DateTimeConverter() {
          setTimeZone(TimeZone.getDefault());
     }
}

こんなカスタムコンバータ作ってみました。
xxx.xxxx.xxxxxはパッケージ名。
で、faces-configにもで設定。
はgetDefaultTimeにしたとします。

<h:outputText  value="#{entry.time}" converter="getDefaultTime"  />

こーするとキチンとタイムゾーンが修正されて出力されます。
がっ

<h:outputText  value="#{entry.time}" converter="getDefaultTime" >
<f:convertDateTime  dateStyle="short" pattern="yyyy年MM月dd日" />
</h:outputText>

出力用パターンのため既存のコンバータと併用すると

GMTに戻ってやがるorz

そんなわけで毎回timeZone="Asia/Tokyo"を指定することに…。
faces-configので設定できないんだろーか。
最初はできそうな気がしたんだけどなあ。

converterDateTime

日付入力をStringで「7月27日」などと入力していて、表示の際は降順で持ってきてたわけですが
これだと同じ月なら「7月9日」が最上位にきてしまうとゆー…。
つことで日付はDate型にすることに。
そこで問題発生。
なぜか実際に入力してある日付と表示される日付にズレが生じる。
色々調べたところJSFの時間表示はGMT(グリニッジ標準時)がデフォらしい。
これを日本時間にするには

<h:outputText value="#{entryBean.entry.time}" >
     <f:convertDateTime dateStyle="short" timeZone="Asia/Tokyo" pattern="yyyy年MM月dd日" />
</h:outputText>

timeZone="Asia/Tokyo" コレ重要。
この方のブログ参照、ちまちまお世話になってます。
しっかし日付表示のある場所ごとに毎回指定するのもぬるぽっぽ。
デフォルトで東京時間に指定する方法ないか調べてみます。これから。

研修覚え書き

見た目のほーもなんとかなってきました。
ほんとはグラデーションとか使いたいんですけどねー。
フィルター使用しないとなると自分でgif画像作らないといけないのかな?

で、細かい問題が数点残ってます。

sessionで保持しているBean情報の取り出し方

public Object getManagedBean(String beanName) {
		FacesContext context = FacesContext.getCurrentInstance();
		Object object = context.getApplication().getVariableResolver().resolveVariable(context, beanName);
		return object;
}

これでreturnされているobjectはBean自体なので注意。
明示してないのにBeanの中のドレを参照してるんだーとゆーマヌケなハマりかたをしてましたorz
beanNameはfaces-config.xmlで設定した名前を入れる。
あとは必要になったところで

LoginBean login = (LoginBean)getManagedBean("loginBean");
user = login.getUser();

みたいに使えばOK!