ログ日記

作業ログと日記とメモ

Wicket

Wicketで素のAjax

WicketはAjaxBehaviorなどを使えば簡単にAjaxが実装できる。 しかし、内部システムだとこれでも良いが、一般公開のページだと都合が悪い。なぜならWicketに搭載されているAjaxクラスを使うと、ページは必ずステートフルになるからだ。 ステートフルのページ…

Wicket で Bookmarkable な PagingNavigator

ステートレスにする方法は https://cwiki.apache.org/WICKET/seo-search-engine-optimization.html ここに書いてある。 PagingNavigatorの部分は return your bookmarkable link here とだけ書かれているので、共通で使えるようなものを書いた。 http://nish…

CayenneからS2JDBCに戻した

これの続き(?) http://d.hatena.ne.jp/n314/20111129/1322592759 ブラウザバックでPersistent Object が Hollow 状態になる件は解決した。 http://nishimura-note.blogspot.com/2011/12/way-of-preventing-state-of-persistent.html 検索しても英語の記事…

WicketとCayenneとGuice

Guiceを使うための設定を getComponentInstantiationListeners().add(new GuiceComponentInjector(this, new GuiceModule())); このように書いていた。 ここで何が行われているかというと GuiceComponentInjector 初期化、GuiceFieldValueFactoryを生成する …

Cayenne + Wicket のシリアライゼーション

もやもやしていたのでCayenneのデシリアライズとHollowの状態についてメモ。 http://cayenne.apache.org/doc/persistent-object-lifecycle.html CayenneDataObject.java private void writeObject(ObjectOutputStream out) throws IOException { out.writeIn…

s2wicket と リストの入れ子 と injectDependency

wicket で リストのネストで li を階層表示する。 <ul wicket:id="treeFragment"></ul> <wicket:fragment wicket:id="fragmentBody"> <li wicket:id="tree"> <a wicket:id="link"><span wicket:id="text">link</span></a> <ul wicket:id="treeFragment"></ul> </li> </wicket:fragment> Panel か Fragment を使う。 ループの中から自分自身を再帰呼び出しするとliタグを階層化…

Wicket1.5がリリースされていた

既に Wicket 1.5.2 になっている。 それから s2wicket も 1.5.0 が出ている。 依存関係に s2wicket だけ指定すると wicketの方も1.5.0がダウンロードされるので、1.5.2も個別に指定して使ってみる。 前に自分用に作ったs2wicket*1 は破棄で。 Tomcatのメモリ…

wicket:messageの入れ子ってどうするんだろう

<wicket:message key="myKey"> This text will be replaced with text from the properties file. <span wicket:id="amount">[amount]</span>. <a wicket:id="link"> <wicket:message key="linkText"/> </a> </wicket:message> https://cwiki.apache.org/WICKET/wickets-xhtml-tags.html あと一歩。 wicket:message > wicket:id …

DropDownChoiceで全て選択

DropDownChoiceの選択項目として「全て選択」を例外的に追加したい場合がある。 nullで代用する方法もある 「すべてのXXX」などを表示させるシーンではsetNullValid(true)を使用して表示させました。 http://koohzi.sakura.ne.jp/blog/?p=55 が、今回の場…

モデルの状態とInputの状態と表示

この前書いた内容 http://d.hatena.ne.jp/n314/20110804/1312430270 あとあと考えてみると、フォームが一つの場合は起きない。 submit時にコンポーネントをPageクラスなどからコードで操作しようとすると起きる。ときがある。詳しくはまだ分からない。 フォ…

setModelObjectとmodelChanging / modelChanged

メモ。PropertyModelなどを使ってフィールドをモデルの値に設定している場合、その値を直接書き換えてもモデルに値が反映しない。 この場合はsetModelObjectを使う。 ただしsetModelObjectを使っていても値が反映しない場合がある。 それはエラー後に前の値…

画像もDBに格納して管理する - Wicket編

PHPからJavaに移ると、アップロードされたファイルの格納場所に戸惑う。 画像をアップした場合、PHPならindex.phpと同じ階層にuploadImageとかいうディレクトリを作ってそこに置けばいい話なんだが…。 大抵はコンテキストルートの外にディレクトリを作ってそ…

wicket-auth-rolesをカスタマイズする その2

昨日の続き。 権限の一カ所集約はやめて、リンク先ページクラスの権限がないBookmarkablePageLinkに非表示処理を追加する。 AppAnnotationsRoleAuthorizationStrategy.java public class AppAnnotationsRoleAuthorizationStrategy extends AnnotationsRoleAu…

wicket-auth-rolesをカスタマイズする

wicket-auth-rolesは便利なんだけどもう少し痒いところに手が届かない感がある。 wicket-auth-rolesを使った場合はページクラスに対して@AuthorizeInstantiationを使用すれば簡単に認証制御が可能なのですが「全てのPageクラスに対してアノテーション付ける…

Wicket 1.5 では今のところはReloadingWicketFilterを使わない方針で

Tomcatの起動ログで 致命的: The web application [/myapp] registered the JBDC driver [org.postgresql.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregi…

IComponentResolverとpropertiesファイルのtips

以前IComponentResolverについて書いたんだけど *1 *2 、この必須チェックが予想以上に便利で使いやすい。 それで、リスト表示でも使いたくなったので少しだけ汎用化した。 EntityComponentResolver.java import java.lang.reflect.Field; import javax.pers…

ModalWindowにキャンセルボタン

ModalWindowにOKボタンとCancelボタンを作るとする。そしてonSubmitで何かの処理を行いウィンドウを閉じる。 このとき、WindowCloseCallbackの中で問答無用でAjaxRequestTarget#addしていると、Cancelボタンを押したときに処理を中断するっていうことができ…

Wicket 1.5 でファイルダウンロード

Wicket 1.5 になってAbstractResourceStreamWriterがかなり変わってる。 AbstractResourceStreamWriterはwicket-coreにあるんだけど、IResourceStreamやAbstractResourceStreamはwicket-utilにある。 rc2だからまだ作ってる最中なんだろうか。 取り敢えずAbs…

s2wicketとかブラウザバックとか

Not serializable exception や injectDependencyのエラー や ClassCastExceptionが出て数日ハマった…。 最終的には以下のパッケージ構成と設定でやることになりそう。 com.example.app | +- service +- entity +- wicket +- session +- page NamingConventi…

Wicketで現在アクセスしているページのURLを取得する

RequestとかWebRequestとかのメソッドを調べたけどそれらしいメソッドはない。 getUrlで得られるURLにはホスト名などは入っていないようだ。 正解はUrlRendererクラス。 RequestCycle.get().getUrlRenderer().renderFullUrl( Url.parse(urlFor(MyPage.class,…

Wicket1.5でIComponentResolverを使ってフォームコンポーネントをadd

public boolean addForRender(Component component, MarkupContainer container, MarkupStream markupStream) { container.internalAdd(component); component.prepareForRender(); try { if (markupStream == null) { component.render(); } else { compone…

S2WicketがWicket1.5の自動リロードonで動いた

前回*1の続き。 原因が分かった。 Wicket1.4のFilter#initは public void init(FilterConfig filterConfig) throws ServletException { initIgnorePaths(filterConfig); this.filterConfig = filterConfig; String filterMapping = filterConfig.getInitPara…

S2Wicket難しい

昨日はコンパイルが通って1ページ表示できるところまでやったが、どうもそれだけじゃ無理っぽい。 WebPageを継承したクラスを更に継承し、それをmountPage()で変えたURLにアクセスすると Last cause: Parameter clazz must be an instance of com.mycompany.…

Wicket1.5に挑戦中

ダウンロードしたファイルにはwicket-core-1.5-rc2.jarが入っていなかったのでmavenで入れた。 何も考えずにmavenプロジェクトに変換したら、GWTやs2jdbc-genを使っているのでハマるハマる…。 m2eclipseなどを入れたらpom.xmlが開けなくなるし、設定解決で数…

WicketでEntityからコンポーネントを自動生成+必須フィールド設定

今GWTからWicketに移ろうとしていてちょっと感動している。 ラベルやフィールドを生成して無名クラスで拡張していくやり方はGWTと同じだから移行は問題なさそうだし、セッション周りの使い勝手が素晴らしい。 今気になるのはmountBookmarkablePageを羅列して…