2009-01-05
■[なつやすみのWicket]ふゆやすみもおわってVelocityがったい
9がつのなつやすみからはじめたコーディングきかくですけども、コツコツやってるうちにはっきょうしそうなくらいとつぜんなにもかもがいやになったりしつついいぐあいにおいつめられてそして2009ねん、みなさまあけましておめでとうございます。きぶんてきにはまだあけきってないyuripopです。
どうかんがえてもみつもりもりあまかったよね……ほんとにね。Javaなのでラインかずはまあそれなりにおおくてあたりまえですけど、かんかくてきにいま1.5にんげつぶんくらい(←しゅみでなくふつうにはたらいたとして)のきぼで、まだふくらむかなーとおもっているところ。とうしょ「いや2しゅうかんくらいあればできそうなきがしますよ」とかたったごろからはしようもなんかほんとね、いろいろあって、マジでみつもりもりはたいせつだとじっかんしているしだいです。あと、かっこうつけたりとかいいかげんにしたい。
さて、なげやりすぎてブログにかくのもあれだったなかで、いくつかこれはとおもったはっけんや、WicketとVelocityについてかきます。
ちいさいはっけん - CheckGroupのしょきち
Wicketでは、がめんびょうがけいのコンポーネントのあたいは Model にせっていするようになっているとおもいます。コンポーネントにしょきちをもたせたいときは、びょうがまえに Model にセットしておきます。この「しょきち」でちょっとつまった。
たとえば TextField だったら、こんなかんじで String でもいれておけばいいわけですが。
final TextField input = new TextField("input", new Model("しょきち!"));
DropDownChoice や CheckGroup だとどうなるの? というハマりポイントです。JavaDocなりソースなりよめばいいのに、へんなあせりがあってちょっかんだけでやろうとするので、5じかんぐらいなやみました。けっか、ふくざつなかんじのコンポーネントのしょきちはここらへんとわかったです。
CheckGroupにしょきちをせっていする
public static CheckGroup createChecks( CHECKBOX[] array, List<CHECKBOX> before, String groupid, String listid, final String checkid, final String labelid) { CheckGroup group = new CheckGroup(groupid, Arrays.asList(array)); if (before != null) { Model model = new Model(); /* setObjectにListViewにいれるのとおなじかたでかつしょきちのいっったオブジェクトをいれる! */ model.setObject((Collection<CHECKBOX>) before); /* んで、さらにこのグループにモデルをセット! */ group.setModel(model); } final ListView list = new ListView(listid, Arrays.asList(array)) { private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem item) { item.add(new Check(checkid, item.getModel())); item.add(new Label(labelid, item .getModelObjectAsString())); }; }; group.add(list); return group; }
ちなみに、なぜここまでしょきちにこだわるのかというと、けいたいむけアプリだからです。というとらんぼうすぎるな、たとえばとうろくずみみのユーザデータをこうしんさせるがめんなどでは、すでにとうろくされているじょうほうがフォームにいっっているとやりやすいとおもって。これがPCブラウザぜんていなら、しょきちなんかよこにでもたてにでもなべておけばいいだろとか、ユーザにたよるきまんまんだったのですけど、けいたいむけでそれはかっこわるいな、とおもったらもうやるしかなかった。
なお、Wicket は JavaDoc よりソースよむかステップするかしたほうがわかりやすいですね。
ActiveObjectsをやめた
migrateもできるようにしよかなルンルン、とうたいながらやってたんですが、エラーですぎです。かいせきしていくと、たとえば net.java.ao.DatabaseProvider.java の881ぎょうめくらいにある renderTable (DDLTable table) っていうメソッドのなかみがなんかどうもふにおちない。
DatabaseProvider#renderTable
protected String renderTable(DDLTable table) { /* しょうりゃく(※primaryKeys は LinkedList<String>) */ if (primaryKeys.size() > 1) { throw new RuntimeException("Entities may only have one primary key"); } if (primaryKeys.size() > 0) { /* しょうりゃく(ここでDDLのうちプライマリキーぶぶんをつくっている) */ } /* しょうりゃく */ }
なんか、0よりおおきく1よりちいさいばあいいがいはすべてExceptionがスローされるようなじっそうです。というか、エラーないようからもあきらかなように、プライマリキーがきっかり1つでなければかならずエラーになります。プライマリキーしていはテーブルにかんれんがあったりするとふえることもありますから、ちょっとふあんです。
で、まあそんなふあんくらいこのかんたんさにくらべたら、とおもうところではあるとおもうんですが、どういうわけかこのエラー、「Mutator」というアノテーションをつかってるとかならずでるんですよ。Mutatorはカラムめいとgetter/setterにおけるフィールドめいがちがうときにきじゅつするアノテーションです。
れい
@Mutator("url") public void setURL(URL url);
カラムめいはこもじでくぎりにアンダーバーをいれない、などのじぶんルールをもっているため、Mutatorけっこうべんりにつかってたんですが、EntityManager#migrate をよぶとなぜか Mutator アノテーションにたいしてプライマリキーようのチェックがはしる。Mutatorをふくすうつかってるだけでエラー。ふしぎ!!! これふしぎだけど、たぶんさくしゃきづいてない!!! (そしてActiveObjectsはそういうのがちょくちょくある)
こういったかなしいかいせきにつかれて、ActiveObjects をつかうのはやめにしました。せつないなァ!
S2JDBCをつかってみることに
がくしゅうコストのひくさだけをおいもとめてS2JDBCです。よめなくはないにしてもよむとつかれるえいごをできるだけさけたかったのがほんねです。あとじっせき。
S2JDBCのかんそうはまたどこかでかきたいとおもいますが、どうにゅうだんかいでは pom.xml になにをついかしたらさいていげんうごくのかわからなくて、とりあえずぜんぶいれたらえらいファイルがおもくなったとか、そんなこともあったりしました。ActiveObjectsはとにかくすごいかるかったのよねー。せつないわァ!
Wicket1.3けいとS2Containerをむりにつなげるとたいへんなことに
S2Wicket が1.2でとまっているのをしらず、そのうえ S2Wicket の1.2けいは Wicket1.3 けいでもうごくとおもいこんでいたために、あれあれというかんじにいっしゅんなりました。となると、じりきでDIするしかないのか。
ActiveObjects のときは DI に Wicket-Guice をつかってたから、あんいに S2JDBC でも Guice をつかおうとするものの、これがうまくいかないのです。DBかんけいのしょりをまとめたサービスクラスの DI は Guice でせいこうするわけですけど、そのさきの JdbcManager が DI されない。よくつかうのに、おうようできるほどにはGuiceをしらないじぶんがつらい!
ここでいったん Guice をあきらめ、S2Container にサービスクラスをかんりさせて Wicket のページクラスからつかおうとする。と、こんなことになりました。
1.サービスインタフェース
public interface Service { }
2.サービスクラス
public class ServiceImpl implements Service, Serializable { private static final long serialVersionUID = 1L; private transient JdbcManager jdbcManager; public ServiceImpl() { if (jdbcManager == null) { //コンストラクタいがいもnullチェック jdbcManager = SingletonS2Container.getComponent("jdbcManager"); } } }
3.ページクラス
public class TestPage extends WebPage { private Service service; public TestPage () { service = SingletonS2Container.getComponent("service"); } }
4.diconファイル
<component name="jdbcManager" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl"> <!-- しょうりゃく --> </component> <component name="service" class="org.test.s2jdbc.service.ServiceImpl" />
ものすごいひどいくにくのさくなので、きょうみあるほうにはみていただきたいのですが、きほんてきに Pageクラスからつかわれる(PageクラスにDIされるべき)オブジェクトは Serializable をじっそうしています。いいのかなこれとおもいながら。そんで、JdbcManagerなどの、じぶんでじっそうをかえられないものについては、 transient をしていし、シリアライズをむしするようにします。ただし、そうするとちゃんといみをもって Serializable チェックをきびしくしている Wicket なので、しょりによっては transient なものだけきえて null になってしまう、そのためしんぱいなところはむりやり null チェックいれてやった。
ふもうなおいかけっこみたいで、すごいつらいしたぶんこんなやりほうではまたべつのふぐあいがだそうでしんぱいでしょうがないんですけど、いまのところ null チェックさえおこたらなければなんとかなっています。ここらへんはTwitterでなやんでると @t_yano さんがちょくちょくこえをかけてくださり、いろいろべんきょうすることができました! ラブ・やんやんていとく!!
まあでもひまをみつけてはWicket-GuiceとT2けいのソースよんだりして、もっとうまいほうほうがないかどうかもさくちゅうではあります。ごりむちゅう。たんじゅんにS2かんりかのコンポーネントがうまいことWicketにわたってくれればいいだけなのに、えらいめいそうしてますことよ。
ちなみに、public フィールドならじどうでDIっていうやつができなかったですね。なぜだろう。(←ほんすじにかんけいないとおもってすぐあきらめたらしい)
WicketでVelocity!
wicket-velocityなんてのもあったりするんですが、やりたいことは、メールほんぶんのさくせいなんかでかんたんなテンプレートエンジンをつかいたい、というかんじ(ようはこうきのうなメールフォームをつくってるイメージ)なので、びょうがもくてきの wicket-velocity や template けいではやくにたちません。もういいよハードコーディングしてやれよっていうあくまのささやきがきこえるものの、あとでくろうするのはいやだ、メールのないようとかいちばんかわりやすいとこだからテンプレートかしたい。
で、やっぱVelocityつかいたいなとおもって、wicket-velocityをさんこうにして(というかややコピーして)つくった。
1.WebApplication
public class WicketApplication extends WebApplication { @Override public void init() { super.init(); Properties prop = new Properties(); InputStream propIn = WicketApplication.class.getClassLoader() .getResourceAsStream("velocity.properties"); try { prop.load(propIn); Velocity.init(prop); } catch (Exception e) { throw new WicketRuntimeException(e); } } }
2.ページクラス
public class HomePage extends WebPage { public HomePage() { VelocityContext ctx = new VelocityContext(); StringWriter writer = new StringWriter(); VmTester test = new VmTester("こんなかんじ"); ctx.put("tester", test); try { Template template = Velocity.getTemplate("example.vm", "utf-8"); template.merge(ctx, writer); } catch (Exception e) { throw new WicketRuntimeException(e); } this.add(new Label("test", writer.toString())); writer.flush(); } }
RuntimeExceptionなげほうだい!
3.example.vm
$tester.test です
VmTesterというクラスはtestというStringかたのフィールドが1こあるだけのへぼいbeanですのでしょうりゃくします。
で、WebApplication#init のほうでよんでいる「velocity.properties」は、wicket-velocity にいっっているものをてきとうにコピーしまして、src/main/resources のしたにおいて maven2 でビルド。log4j.properties とかとならぶかんじですね。そこにおいておけばよみこんでもらえます。.vmファイルもどうように、src/main/resourcesのしたにおいておきます。
じょうきがうまいことじっこうされると、テンプレートと bean のなかみがマージされて「こんなかんじ です」とひょうじされます。
じつはずっとファイルがよみこめずにすごくなやんだんだけど、たぶん velocity デフォルトの loader じゃだめなんだろね。なので、ちゃんとvelocity.propertiesてきなものをよういして、FileResourceLoaderとかClasspathResourceLoaderをせっていしてあげるといいとおもいます。
そんなわけで
なんだかもうけっていてきにプログラミングセンスがないのがろていしてますが、ゆりぽはゆりぽなりに、ていねいにせっけいしてコーディングして、ここまできたよー。もうゆりぽー。いま6.5KL overです。Javaはいいね。
ほかにもメールしょりにJamesをつかってるよとか、ApacheでこまかくアクセスせいぎょしながらリバースプロキシでAPサーバへとばしているよとか、DoCoMoたまにIEのつぎくらいにしねとおもうとか、DBせっけいのしょうさいとか、ソートのロジックがむずかったとか、ComplexWhereがあんがいながれにくいとか、XML-RPCつかいましたとか、まだまだかきたいことたくさんあるんですが、こんにちはもうえらいながくかいたのでこのへんにします。
しんちょく、いまで84%くらい。
2008-12-31
■さよなら2008ねん
java-jaにとってもおせわになった1ねんだったなーとおもいます。1がつにymsrせんせいのごうていでかいさいされたしんねんかいからこっち、ほとんどかいきんではないだろうか。そろそろちょっとウザがられているのではないだろうか。と、いつもビビりながらさんかして、さんかしたのちはきがおおきくなってダメだしばかりしていますが、しょうじきjava-jaへのあいはマリアナかいこうよりふかいとおもいます。(とうしゃひ)
でもいつもしゅうでんにおびえてなかなかふかいはなしもできず、そのうえひどいひとみしりのためだいたいなれてきたほうとばかりつるんでしまうので、こんごはもっといろんなほうとおはなししたいなあなんておもいつつ、2008ねんをふりかえりました。
java-jaとであってなかったら、なつやすみのWicketをはじめることもなかったろうし、ゆりキャラをマイナーチェンジすることもなかったろうし、TopHatenerでせいのぶんやだい1くらいをかくとくすることもなかったでしょう。
java-jaのおかげでゆりブログがせいてきでいやらしいブログになってよかったですね! ぜんいん×○●△!!!
2009ねんのことは2009ねんがきてしんしゅんバーゲンがおわったごろにまたかんがえたいとおもいます。そんで、なつやすみのWicketをふゆやすみなかにかんせいさせたいとおもって、じっかにもどってからもまいにちまんがきっさかよいで、まんがだらけのわなのおかげでもう20さつくらいよんでしまった。まんがおもしろすぎる!!
いつもとおりしりめつれつですけど、ゆりブログにおつきあいくださったみなさんどうもありがとです!! よいおねんを!





