Javaの最近のブログ記事

S2JDBCの関連はHibernateとかと違って、対象のキーもエンティティに指定する必要があります。
その辺りの話はここから。

OneToOneやManyToOneの場合、先に関連付けする方を登録しないと、関連付けされる方に設定する識別子が判らない気がするんだけど、どうなんだろう。
もしくは勝手に登録されるんかなぁ。

試してみよう。

もう乱発状態のJavaのWebアプリケーションフレームワークですが、また新しい名前を聞いたのでちょっとつまみ食いです。

Click Framework

フレームワークのたぐいとしてはWiketに似ている感じ。設定地獄をなくすために、「コンポーネント指向」という名の下に、ページ遷移やHTMLのオブジェトをJavaで記述するようです。Swing作ってる感じで。

感想はというと、「ま~そんなものも有りかなぁ。」とは思いますが、Viewの実装方法としてクラスでも書くし、jspでも書くし、どちらでもかけるので中途半端。
  • 結局MVCの部分的な所だけを解決しようとしているのであまりソリューションに力がない。
  • 我がものに使う分には問題ないが、人の為には選択肢としてはいらない。
  • 分離が中途半端。classフォルダとrootフォルダのどちらにもhtmlが発生している。
  • HTMLのオブジェクトをjavaで書くなんて邪魔くさすぎる。
感じたことはwicketの時とさほど変わりません。
でもでも一番良くないのは名前。普通「Clickがぁ~」ってしゃべったら、マウスのクリックの事だからね。

なんかStrutsを超えるフレームワークはでてこないのかなぁ?

詳しくは

Jruby on Rails on Tomcatを参照しながら。

環境は
  • JRuby-1.1.1
  • Rails2.0.2
  • GoldSpike
Rails2だけど、GoldSpikeでやってみる。というのは、「Rails2は Warblerで」みたいに書いてあるけど、
Copy the generated file $YOUR_APP_NAME.war to $TOMCAT_HOME/webapps and it should auto deploy
らしいので、それはめんどくさい。GoldSpikeはjettyつかって、webrickみたいに単体で起動できる。
jruby -S rake war:standalone:run
普通にrailsアプリ作って、scaffoldでgenerateして、migrateするとエラー。jdbcのconnector(今回はmysqlのコネクター)が見つからないそうです。mysql.comからダウンロードしてきて、以下に置く。
RUBY_HOME\lib
migrateは成功し、テーブルが作られたので起動してみる。
起動は成功したが、ここでもconnectorがClassNotFoundExceptionとなる。う~んなんで、RUBY_HOME\libにおいたんだろう??
ま~深く考えずWEB-INF\lib以下にコネクターを置いて、再度起動。インデックスは表示できたけど、newにアクセスすると以下のエラー
ActionController::InvalidAuthenticityToken in People#new

う~んよくわからんから、ググってみるとGoldSpikeのせいみたい。Goldspike怪しいって書いてるし。
Tomcat6+Rails2.0.2(Goldspike)な環境で色々問題が

今更ですが、タスクリストに隅の方に残ってたのでやってみました。
タスクに追加したときの元記事はこちら。だいぶ古いので新しい情報を探したんですが、Beehive自体が2006年12月のが最新版のようなのでどうも落ちぶれた組っぽい。

でもせっかくタスクに入っていたので、やってみる。(新しい発見があるかもしれないし)
ちなみにこっちの情報が新しそう

Beehive Project

EoDが機能としてあるみたいだけど、Seasarみたいにhotではなく、docletみたいにcoldでやるみたい。antでファイルがはかれるみたいな事書いてあるし。

DBFluteの0.6.8からどうもNotInScopeがデフォルト出力されないようになってる。

dfpropのincludeQueryMap.dfpropが

# /--------------------------------------------------------------------------- # [Include Query] (NotRequired - Default 'map:{}') # map:{ ; String = map:{ ; NotInScope = map:{} } ; Number = map:{ ; NotInScope = map:{} } ; Date = map:{ ; NotEqual = map:{} } } # ----------------/
となってる。

あんまり使う機会がないだからだそうです。
出力する条件メソッドを取捨選択

「Javaで書かれたプログラムの設計」というのがよくわからんけど、どうやるんやろ。


Javaプログラムの設計をテストするツールArchitecture Rules 2.0.3 - builder by ZDNet Japan

Architecture Rulesでは、Javaで書かれたプログラムの設計を、ユニットテストやAntタスクとしてテストすることが可能だ。


architecture rules

PEARのNet_UserAgent_MobileをJavaにポーティングした、JpMobileUtilsをリリースしました。

以下から取得できます。
https://sourceforge.jp/projects/jpmobileutils/files/

mavenからは以下をpomに追加してください。

    <repository>
      <id>JpMobileUtils</id>
      <name></name>
      <url>http://jpmobileutils.sourceforge.jp/m2-repo/</url>
    </repository>

Net_UserAgent_Mobileをホントにポーティングしただけなので、それ以上もそれ以下の機能もありません。

今後、以下の機能の追加を予定しています。
  • Net_UserAgent_Mobileのバージョンアップへのキャッチアップ
  • Net_UserAgent_Mobile2への対応
  • キャリア毎の絵文字コンバータ
  • キャリア毎のアクセス元判定
  • 全角文字を半角へ
  • TrimWhiteSpace機能

WicketでFormを作成すると、action属性の値が変です。

<form id="form1d" action="?wicket:interface=:14:form::IFormSubmitListener::" method="post">

変というかなんじゃこれって感じです。どうも内部のキャッシュのために変なパラメータがついてる。

でもこんな勝手につけられたら使えない・・・。
一応リソース的には一意なっているけど、これはRESTfulと言うのだろうか。

JPA

最近書籍なんかも出てきて、俄に流行っていて噂はをちらほらと見聞きしていましたが、やっとさわってみました。

感想はというと
  • hibernateじゃん。(APIの多くはhibernateの思想がそのまま)
  • でもhibernateよりマッピングは楽ちん。
  • 程度の低い処理であればhibernateのnativeよりも簡単かも。
  • でもそれはhibernateを知らない人にとってじゃない。
  • なんでこんな余計な仕様をつくるんだろう。
  • hibernateはjavaの仕様に取り込まれることで更にうけるんだろうか。
  • やっぱりhibernateは大げさだ

ま〜hibernateの仕様を無理矢理というかいい感じでパクった仕様だし、試した実装がhibernate-jpaだしそう感じるのはそのままな気がします。

疑問点
  • マッピングはJPAで実装はnativeでっていうのができるんかなぁ?
  • hibernate3はアノテーションでマッピングできたよね。

ひがさんのブログにもエントリーがなんかありました。もう1年も前だけど。
問題点は改善されたのだろうか?

正規表現のメタ文字で「¥d」ってあるやん。大体説明が「[0-9]と同じ」になってるんだけど、javaのregexとoroでどうも困ったことに。

java.util.regexは全角数字にマッチしないのに、org.apache.oro.text.perl.Perl5Utilのほうはマッチするんだよね。
それだけならまだ許せるけど、commonsのvalidatorのmatchRegexはPerl5Utilを使ってるので全角数字が通ちゃんうんだよねぇ。

まじめに[0-9]って書けばいいんだけど・・・

S2StrutsでFormの中にjava.util.Date型のプロパティがある場合、どうも自動でvalidationgが動くみたい。
null許容したいんだけど・・・

S2StrutsのHotDeploy環境でPOJOのFromBeanをセッションスコープに設定するとセッションの内容がリセットされる。
どうも既知([#STRUTS-51] HotDeployでSessionスコープのFormがクリアされる)様なのだが修正されてない。

なんかむずかしいんかなぁ?

初めてまともにHotDeployを使って、結構気持ちよく造ってたのにこれはHotDeployを使うのに凄いネックになる。速くなおんないかなぁ~。

時間があったので久しぶりに@ITの記事なんかをしらみつぶしに読んでると、こんな記事を発見。

例えば、Webアプリケーション内で利用されている関数に、バイナリセーフの関数と非バイナリセーフの関数が混在している際に「abcd%00efg」という文字列が渡されたとすると、以下のような挙動となってしまうことが想定される。ここでは、例として、「入力チェック」と「処理の実行」を対にして説明を行うが、この限りではない。

まずFormに入力された内容を何かしら送信する場合はエンコード処理がされるのであまり関係が無いんだと思う。
問題はURLにクエリもしくはパラメータがくっついてきた場合ですかね。

Javaで試してみました。
String型の項目に「%00」をはめてみましたが、NULL値にはならず、長さ0の文字列になってます。
但し、ダンプしてみるときちんと文字コード00が入ってるので、問題が起きることはあるかもしれませんね。
制御コードは文字列から省くようにしないといけないのかなぁ?

SeasarはHotDeployが凄い。とは聞いていたんですが、僕は勝手に「それってtomcatのauto reloadじゃないの。Seasarが頑張ってるんじゃなくて、Tomcatがやってるんでしょ。」みたいな食わず嫌いと言うか誤解をしていた。

たまたまひがさんのブログでrailsについての言及がされててその中で、

小規模な開発だとRailsがJavaより圧倒的に生産性が高いかというと、今のJavaには、HOT deployのできるSeasar2がある。フレームワークのできは、SAStrutsのドキュメントを見ていただければ、Rails同様の生産性が出せることもわかってもらえると思う。

とあって、やけに強気だなぁとおもって、ちょっとまじめに調べたら、以下のエントリーを発見。
[Seasar]HOT deploy完成

まじめに読んで、まじめに試してみたら、autoreloadとは比べられんくらい快適だった。
食わず嫌いでごめんなさい。

今まで4か月ぐらいSeasar2使っててautoreloadで動かしてたので、何という時間の無駄遣い。
ショックです。

次使うときは、おいしく食べさせていただきます。

乱立するJavaのWebApplicationのframeworkですが、流れとしてはRORに流れに乗って設定を行わない方向で進んでいます。

そんななかで、Apacheプロジェクトに移っていたWicketが1.3でリリースされてます。
ざっとさわってみましたが、以下感想(と言っても、撫でた程度ですが・・・)
  • htmlベースでviewが作れる。(velocotyみたいな感じ)
  • アクション毎にクラスを作るのはstruts1と変わらない
  • viewで使用するのコンポーネントはまだ貧弱みたい。最後の砦JSPが使えないのは現場では痛いかも
  • viewとactionのファイルが物理的に近いところにあるのはうれしい

気になるので、後日まじめにサンプルで遊んでみます。

Apache Wicket

自分で定義しちゃ、ダメよ。

System.getProperty("line.separator")

確かOS毎のline separatorを取得も出来たと思うんだけど忘れた。

名前を見た瞬間SoftDeleteを判断するメソッドかと思いきや、実は1行取得時のnull値判断を内包してるだけらしい。

つまり、該当レコードが無い場合

Behavior.selectEntity()
はnullになるが、
Behavior.selectEntityWithDeletedCheck()
はnullにならず、EntityAlreadyDeletedExceptionが発生するらしい。


via

オブジェクト指向のデータベース。リレーショナルではないのでORマッピングみたいな余分な作業がいらない。この分野ではCachéが結構有名だけれども何せ高い。
4年前ぐらいにセミナー言ったけど、そのとき「ざっくり200万ぐらいからですかね。」とか言ってた様な気がする。

で最近はdb4oがオープンソースなのでWEBでも結構オブジェクトデータベースの話を見ます。(developerWorksにも出てたし)

で一通りチュートリアルをやろうとしたけど余りリアリティがなかったので途中で放置。
ただオブジェクトDBなのでRDBを使うよりはいろいろと面倒がない。その辺はCachéと一緒でまーそんなもんでしょ。

あとは複雑なネイティブクエリの場合のパフォーマンスと運用ツール(RDBはSQLでアプリとは別次元で操作できるから運用はアプリとは別にできる。これが良い悪いは別として)がそれなりになれば結構いいとこ行きそうな気がします。

db4o Developer Community - Formula One Tutorial

Active RecordのJava実装は最近多いですが一番まともに行きそうなactiveobjectsというのを試してみました。

以前にActiveRecordJavaを試してみましたが、まだまだ始まったばっかりって感じで、開発者自ら「infant」といっていましたが、こちらは結構出来てるみたいです。(まだ全然でしょうけど)

Exampleページの言うとおりにやってみたところ、Typesクラスがまさかjava.sqlのを使ってるとは思わずにちょっと迷いましたが、activeobjectsで作られてるblogシステムのソースを見て判りました。

まだ単にCRUD動かしただけですが感想を。

■ポジティブな感想


  • hibernateみたいにマッピングファイルは書かなくていい

  • 型の指定もアノテーションでできるのがいい

  • リレーションの設定もアノテーション

  • SQLを発行できて、その結果を型にmappingしてくれる

■ネガティブなな感想


  • hibernateみたいにマッピングファイルは書かなくていいけど、アノテーションで結局設定を各必要がある

  • やっぱりmodelのクラスを作る必要がある。(Javaみたいな静的コンパイルでは難しいのかもしれないけど)

  • モデルがProxyオブジェクトでラッピングされてるので、デバッグなんかはやりにくそう

  • コネクションプールを自分でつくっちゃうので、データソースの指定ができない。これはまだ知らないだけかもしれないけど

などなど、早くActiveRecordの様なActive Record実装がJavaでも出てくることを期待します。


リクエストを取得するために、fieldとsetterを事前に用意しておくと、以下のように取得できます。

MessageResources resources = ((MessageResources) getRequest().getAttribute(Globals.MESSAGES_KEY));

StrutsのTaglibを使って、ループ処理をする場合、初回を条件指定するのはIndexIdプロパティを用いてできすが、最後を条件にするのにこまってました。

taglibにbean:sizeというのを見つけました。

コレクションのサイズをPageスコープに設定できるので、これ使えばできます、

S2StrutsでカスタムValidatorを作る際の手順。いつも忘れて悩むから

  1. validateメソッドを実装
  2. validator.xmlに追加。 ココまではStrutsと同じ。
  3. annotationインタフェースクラスを追加
  4. ConfigRegisterをimplementsして、レジスタクラスを追加
  5. validator.diconに設定を追加

これで初めて動き出します。

S2Strutsはフォワード先をアノテーションで指定できるので設定が減っていいんですが、フォワード先あるいはリダイレクト先を動的に作りたい場合、堅物で困る。
アノテーションだったりスタティック定数だったりするので仕方ない面も感じますが。

でも、どうしても動的にリダイレクトしたかったので調べると以下のようにすればできるみたい。

ActionForwardのパスにパラメータを動的に埋め込むことはできません。。。 requestやsessionを利用することで回避していただけないでしょうか。 もし、別アプリケーションに遷移したいのであれば、 下のように直接responseを利用しredirect後、nullを返却するか、 または、Forward先のJSPでredirectしていただけないでしょうか。 ---- private HttpServletResponse response;

public void setResponse(HttpServletResponse response) {
this.response = response;
}

public String goApp() {
try {
this.response.sendRedirect("http://www.xxxx.com");
} catch (IOException e) {
throw new RuntimeException(e);
}
return null;
}
----


RORがはやってますが、RORがすごいのは確かに認めますがもっとすごいのはRubyのORマッパーのActiveRecordの方がすごいと思います。
ActiveRecordのおかげでRORは流行ったといっても過言じゃ無いでしょう。

で、JavaでActiveRecordの実装をしてる人がいたので動かしてみました。
作者曰く「This project is in infant stage」らしいので動かすだけ動かしてみました。

sourceforgeからDLし、Eclipseのプロジェクトに取り込みます。
sqlファイルが含まれているのでMySQLの設定を行い、データベース接続設定のファイルが絶対パスでreadされるようになっているので修正し、いざテストクラスを実行。
データが一件も無い場合、ResultSetでエラーになりますが、データがあればうまいこと取得できます。
マッピングの設定は一切なしです。

但し、取得したプロパティはgetterやsetterでの参照では無く、MAPでの参照になってます。
う~んこれだとJavaである意味が無くなるような気も・・・

Active Record Java
Active Record Java - II

作者blog
Java N Coffee

丸めなんだから丸めなんだよ!!

お題

0.51000001を小数点以下第3位で切り上げないさい。

人間の感覚(多分)

0.51

丸め

0.52

0.51にしたければ、第4位以下を切り捨ててから、やるのが正しい。

間違って使うと数値狂うよ。

ページング処理って毎度毎度面倒臭いです。

railsはActiveRecordで実装されてるし、phpはPEARでpagerあるし、CakePHPでもBakeryで既に実装方法が書いてあったりと自前で実装することは無くなってきます。

Javaでもいくつかあるんだけど、古参としてjsptagsにあるPagerが結構使いやすい。
いろんなオプションがよういされているので中々。
但し、2003年からメンテナンスされてないのでちょっと困ったことも起こります。

困ったことその1
ページングのurlに日本語が入った場合、URLエンコードをページのエンコーディングではなくプラットフォームのエンコードでやっちゃっています。
要は

URLEncoder.encode(String, String)

ではなく
URLEncoder.encode(String)

を使っちゃってます。

困ったことに。連絡するのも面倒なので自前で修正してしまいました。

修正版はここからどうぞ。

・Actionの中で取得するとき
org.apache.struts.action.Action#getResources(HttpServletRequest)

MessageResources resources = getResources(req);
String msg = resources.getMessage("key.string");


・ActionFormの中で取得するとき
org.apache.struts.validator.Resources#getMessageResources(HttpServletRequest)

MessageResources resources = Resources.getMessageResources(req);
String msg = resources.getMessage("key.string");

S2StrutsでPOJOでActionを作った場合、validatorでのエラー表示とActionでのエラー表示を同じタイミングで出すことができません。

actionのPOJOをあきらめてValidatorFormをextendすると以下の様にaction内でmessegeを取得できます。

ActionMapping mapping =(ActionMapping)getRequest().getAttribute(Globals.MAPPING_KEY);
ActionMessages errors = orderForm.validate(mapping, getRequest());
MessageManager.addErrors(errors);
MessageManager.saveErrors();
if(!MessageManager.getErrors().isEmpty()){
return FAILED;
}

でもextendしてとれるなら、無理矢理とれるんじゃないかと言うことでValidatorFormをextendしない場合でも以下のようにすればとれました。


ActionMapping mapping = (ActionMapping) request.getAttribute(Globals.MAPPING_KEY);
mapping.setValidate(true);
BeanValidatorForm o = (BeanValidatorForm) this.request.getAttribute("getParamForm");
ActionErrors errors = o.validate(mapping, request);
MessageManager.addErrors(errors);
MessageManager.saveErrors();

via [Seasar-user:5933] [S2Struts] validateのエラー表示のタイミングについて

JavaでOracleのPL/SQLをコールしている場合、PL/SQLをコンパイルした後にコールするとORA-6508でエラーになる場合があります。おそらくJavaでコネクションプールを使用しているせいで(リ)コンパイルが正しく反映できていないようです。

そんな場合は素直にJavaのコンテナを再起動してみましょう。

Tomcat5.0→5.5でDataSourceの設定方法が変わってる。うっとい。

MySQL Test App DB Connection jdbc/TestDB javax.sql.DataSource Container

#5.5でのDataSource


JNDI Datasource HOW-TO

StrutsのメジャーバージョンアップはどうやらWebWorkベースらしい。
マニアック好きな僕はWebWork好きだったので結構うれしい。

Strutsめんどくさいことが多すぎる。

Is that all there is? Not by a long shot! Soon, we will also offer a new Action 2 framework, based on WebWork technology. Essentially, Struts Action 2.0 will be WebWork 2.3.

Hibernateの2から3になったことでネイティブSQLのメソッドが変更されています。
ザックリとはQueryから分離され、SQLQueryで実装されています。

実装は以下の通り

SQLQuery query = getSession().createSQLQuery(sql);
query.addEntity("abc", Abc.class);

詳しくは元ネタへどうぞ

JDK5の拡張ループは配列に対する場合は添え字アクセス、Coellectionに対する場合はIteratorでの処理に変換されるみたい。
AllayListなどランダムアクセスが有効な場合は遅くなるらしい

どう考えたってIteratorでやる方が遅くなるだろうけど、人間の感覚からしたらわからんやん。
10万件Loopするならまだしも。

JDK5からは拡張ループにより記述を短くできます。
List系は覚えられるんだけど、Mapはなかなか頭に残らないので

import java.util.*;

public class For3 {
public static void main(String[] args) {

// マップにキーと値を格納する
Map map=new HashMap();
map.put("JVM", "Java Virtual Machine");
map.put("JDK", "Java Development Kit");
map.put("JRE", "Java Runtime Environment");

// キーの一覧を表示する
for (String s : map.keySet()) System.out.println(s);

// 値の一覧を表示する
for (String s : map.values()) System.out.println(s);

// キーと値の一覧を表示する
for (Map.Entry e : map.entrySet())
System.out.println(e.getKey()+" : "+e.getValue());
}
}

source

日本語処理っていつも思うけど、もっとスマートにならんの?
その点Perlはマルチバイト処理がいい感じでかける。

見ても思い出すのに時間がかかるけど

public static boolean containsHalfWidthKana(String str) { if (str != null) { char[] chars = str.toCharArray(); for (int i = 0; i < chars.length; i++) { char target = chars[i]; if (0xff61 <= target && target <= 0xff9f) { return true; } } } return false; }
InputStream in = request.getInputStream(); int k; int aBuffSize = 1123123; String StringFromWS=""; byte buff[] = new byte[aBuffSize]; OutputStream xOutputStream = new ByteArrayOutputStream(aBuffSize);

while ( (k=in.read(buff) ) != -1)
xOutputStream.write(buff,0,k);

// I can now grab the string I want
StringFromWS = StringFromWS + xOutputStream.toString();
System.out.println(StringFromWS);

InputStream in = req.getInputStream();

DataInputStream dis = new DataInputStream(in);

StringBuffer sb = new StringBuffer();
String line;
while ((line=dis.readUTF()) != null) {
sb.append(line+"\n");
}
String finalSring = sb.toString();


source

J2SE1.5でターゲット指定してコンパイルすると以下のエラーがでちゃいました。

ターゲットリリース1.1がデフォルトのソースリリース1.5と競合しています

だそうです。

SUNのJavaはVer.1.1から1.2に変わるときに大きな変更があって、新しいバージョン(2005/3/20ではVer.1.5になっている)でコンパイルしたJavaアプレットの表示が古い環境しかないPCだとうまく表示されないという問題があった。 この問題を回避するため  javac -target 1.1 Nantoka.java というようにすると、古い形式でコンパイルしてくれるのであった。

ところが、Java 1.5でこれをやると「ターゲットリリース1.1がデフォルトのソースリリース1.5と競合しています」というエラーが出て、コンパイルしてくれない。
こういうときは
javac -target 1.1 -source 1.2 Nantoka.java
というように、-targetオプション以外に -sourceオプションをつけてやれば旧形式でコンパイルしてくれる。(source のバージョンは1.3でも可)

だそうです。

JSPでの画像処理をやってくれるTaglib探してたらsandboxにありました。
早速試してみましたがどうもリサイズとかでは一旦servletにリクエスト投げてる模様。何故??

でちょっといじったら

絶対URI: http://jakarta.apache.org/taglibs/image-1.0 はweb.xmlまたはこのアプリケーションを配備したJARファイルのどちらかでも解決できません

とか連発されてしまった。やっぱり自前かなぁ

コーディングルールに反した記述をチェックしてくれます。
デフォルトでSunのJavaルールが入っているので、まずは慣れ程度に気にするのがいいかと。

なれてきたら、まじめにルールセット作ってみるのもありかも。


本家
日本語リソース

JK2

だいぶ前からだったのね。mod_jk2のサポート終了&開発停止は。



JK2 has been put in maintainer mode and no further development will take place. The reason for shutting down JK2 development was the lack of developers interest. Other reason was lack of users interest in adopting JK2, caused by configuration complexity when compared to JK.
The latest official JK2 release is 2.0.4.
JK2 will have it's successor within core Apache2.1/2.2 distribution. We have developed new proxy_ajp that is an addition to the mod_proxy and uses Tomcat's AJP protocol stack. It is developped in httpd-2.1 and integrated in it. We have also developed a new proxy_balancer module for load balancing http and ajp protocol stacks.
JK will be fully supported for all other web servers. The next JK release is planned for the end of November. Lots of code from JK2 has been ported to JK

The Apache Jakarta Tomcat Connector - Documentation Index

EJB使わんでもええやんかぁ~~

O-Rマッピングのツールとしてこんなのもあります。
まだ試してないけど・・・

http://www.ibatis.com/

Cayenneを試して見ました。
Hibernateよりは簡単です。DAOは結局のところ独自実装??

Cayenne: Overview

@IT:話題のO/Rマッピングツール「Cayenne」を使う

assertが予約語になった関係でassertメソッドがassertTrueに置き換わってます。

テストケースコンパイル時に警告が発生します。以下はその例。
警告: リリース 1.4 では assert はキーワードなので識別子として使うことはできません。
assert(true);
^ 注: JunitAssert.java は推奨されない API を使用またはオーバーライドしています。
注: 詳細については、-deprecation オプションを指定して再コンパイルしてください。
警告 1 個

JDK1.4から「assert」が予約語になりました。したがって、「assert」という文字列は識別子として利用する事ができません。
assert()ではなく、assertTrue()を利用してください。(JUnit3.7APIのjunit.framework.Assertクラスを参照)

Webでの排他制御では最近こんな事をするらしい。
簡単にいうとselect時に対象レコードのversionを取得(当然レコードにはそんなcolumnをもつらしい)し、それをSessionに保持して、更新のタイミングで保持したVersionと現在レコード上のVersionを比較し、保持Version≠レコードVersionであれば他のセッションで更新されているとし、更新処理を破棄(レコードの再取得)するらしい。
→イメージでいうとCVSっぽい感じ。

PofEAA's Wiki - PessimisticOfflineLock

いまいちのような気がするが、偉い人がゆってるのでいいんでしょう。でも排他はやっぱりSelect時に判断したほうがいいようなきがするけど・・・

なんとかできひんのかなぁ。他にものTagをオーバライドしてるとかいうのも見たけど・・・
ダサイ。

初回アクセス時になどで生成されるURLに"jsessionid="が付加されてしまう問題ですが、一応解決しました。 Strutsのタグのクラスを継承して独自タグを作りました。URL文字列をコンテキストに出力する部分をオーバーライドし、String#replaceAll(";jsessionid=.*(\\?|$)", "")しています。うーん、ad-hocだ。 色々調べた結果、javax.servlet.HttpServletResponse#encodeURL()が諸悪の根元のようです。このメソッドの中でCookieの有無を調べ、存在しない場合はURLにセッションIDを付加するという処理が行われています。 結局、「Cookieが送られてこなかったら、そのリクエストに対するレスポンスコンテンツに含まれるリンクにはセッションIDを付加することでセッションを維持しよう」というJava Servletの設計思想のせいです。たしかにCookieをサポートしないクライアント(携帯電話とか)に対しては有効な方法だとは思いますが、そのためにセッションIDが漏洩するリスクを抱えてしまっているわけで、どうも納得がいきませんね。少なくとも、URL-Rewritingをオフにする手段は提供してほしいものです。 ところで、";jsessionid=xxx"の先頭のセミコロンがずっと気になっていたのですが、HTTPのリクエストURL表記において、";"(セミコロン)で連結するのは"parameter"、"?"(クエスチョンマーク)で連結されるのは"query"と呼ぶのだそうですね。恥ずかしながら初めて知りました。 http_URL = "http:" "//" host [ ":" port ] [ abs_path [ ";" parameter ] [ "?" query

こんな感じですね。

■日本語
 fontがないのか日本語がでない。Laszloのサイトで調べてみると

The LPS doesn't support multi-byte characters at the moment, although this is planned for a future release.

Right now the LPS does not support Unicode (only ASCII and some extra characters).
Full Unicode support is planned, but I don't know exactly when it will be impletemented.

だそうな。

Ant

メンドクサイのでbinaryでインストール
Apache Antからapache-ant-1.6.2-bin.tar.bz2をDL

$tar jxvf apache-ant-1.6.2-bin.tar.bz2
$mv apache-ant-1.6.2 /usr/local
$ln -s apache-ant-1.6.2 ant

■環境変数
/etc/profileに以下を追加

export ANT_HOME=/usr/local/ant
export PATH=$PATH:$ANT_HOME/bin

■configure & make

$tar zxvf jakarta-tomcat-connectors-jk2-src-current.tar.gz
$cd jakarta-tomcat-connectors-jk2-2.0.4-src/jk/native2/
$./configure --with-apxs2=/usr/local/apache2/bin/apxs

■binaryでインストール
Apache Jakarta Tomcat からjakarta-tomcat-5.0.28.tar.gzをDL

$tar zxvf jakarta-tomcat-5.0.28.tar.gz
$mv jakarta-tomcat-5.0.28 /usr/local
$ln -s jakarta-tomcat-5.0.28 tomcat

このアーカイブについて

このページには、過去に書かれたブログ記事のうちJavaカテゴリに属しているものが含まれています。

前のカテゴリはIISです。

次のカテゴリはJavascriptです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01