ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2010年9月1日水曜日

GETメソッドで渡されたパラメータの値を文字化けさせずにサーブレットで修得する方法

サーブレットの開発中に,GETメソッドで渡されたパラメータの値が文字化けしてしまうという問題に遭遇しました.とりあえず,解決したので,その方法をメモしておきます.

String encoding = request.getCharacterEncoding();
if(encoding == null) {
    encoding = "ISO_8859_1";
}
byte[] b = request.getParameter(parameterName).getBytes(encoding);
String parameterValue = new String(b, "UTF-8");


[1] 日本語パラメータの対応(getBytes)

2010年8月24日火曜日

クラスパスワイルドカードを用いたjavacコマンドでのトラブル

Cygwin上でjavacコマンドを実行する際にクラスパスワイルドカードを使うとコンパイルできないというトラブルにあいました.コマンドラインに入力した内容は次のようなものです.

javac -cp "lib/*" src/*.java

Windowsのコマンドプロンプトで上記のコマンドを実行すると,エラーで中断せず無事にコンパイルされます.しかし,Cygwinで実行すると,失敗するのです.自分の知識不足が原因のような気がしますが,思いついたので,アスタリスクの後にセミコロンを付けて実行すると,コンパイルされるようになりました.具体的には,次のような感じです.

javac -cp "lib/*;" src/*.java

セミコロンがない状態では,ワイルドカードがシェルに展開されているような感じです.

2009年6月6日土曜日

JNIにてjava.lang.UnsatisfiedLinkError

「java.lang.UnsatisfiedLinkError」という例外に遭遇した場合の対処方法をメモしておきます.

この例外は,JNIを通して利用するDLLが環境変数PATH等にない場合に生じるみたいです.したがって,解決方法は以下のようになります.

・環境変数PATHにDLLが置かれたディレクトリのパスを追加する.

[1] JNIメモ(Hishidama's Java native interface Memo)

2009年1月30日金曜日

Webアプリケーション起動時にサーブレットを開始する方法

Webアプリケーション開始時にサーブレットを開始する方法をメモしておきます.

servlet 要素内に load-on-startup 要素を記述します.load-on-startup 要素の内容には開始する順番を表す0以上の整数値を指定します.小さい値ほど早く開始されます.

<web-app>
  <servlet>
    <servlet-name>servlet</servlet-name>
    <servlet-class>hogehoge.Servlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
</web-app>

2008年12月9日火曜日

VelocityにてResourceNotFoundException

Velocityを使い始めたのですが,早々にResourceNotFoundExceptionという例外に遭遇してしまいました.ちょっと調べると解決できたので,その方法を以下にメモしておきます.

資料[1]を参考に以下のようなコードを書いて実行すると,テンプレートファイルが置かれた正しいパスをVelocity#getTemplateメソッドに指定しているにもかかわらず(ちなみにこれは自分の間違った解釈です),そのファイルがないことが原因でResourceNotFoundExceptionが発生し,プログラムが異常終了します.

Velocity.init();
VelocityContext context = new VelocityContext();
context.put("sensorName", sensor.getName());
Template template = Velocity.getTemplate(this.rootPath +"chart.vm", "UTF-8");
StringWriter writer = new StringWriter();
template.merge(context, writer);
buffer.append(writer.toString());


ライブラリに添付されていたドキュメントを読むと,Velocity#getTemplateメソッドの引数に指定するテンプレートファイルのパスは,Velocityのfile.resource.loader.pathというプロパティからの相対パスになるとのことでした.

そういうわけで,必要なプロパティ(file.resource.loader.path以外にもいくつかあります)をセットしたPropertiesクラスのインスタンスをVelocity#initに与えてやると,うまくテンプレートファイルを読み込むことができました.

Properties properties = new Properties();
properties.setProperty("resource.loader", "file");
properties.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
properties.setProperty("file.resource.loader.path", this.rootPath);
properties.setProperty("file.resource.loader.cache", "true");
properties.setProperty("file.resource.loader.modificationCheckInterval", "2");
Velocity.init(properties);
VelocityContext context = new VelocityContext();
context.put("sensorName", sensor.getName());
Template template = Velocity.getTemplate("/chart.vm", "UTF-8");
StringWriter writer = new StringWriter();
template.merge(context, writer);
buffer.append(writer.toString());


[1] Velocity
http://www.techscore.com/tech/ApacheJakarta/Velocity/index.html

2008年11月30日日曜日

java.util.Calenarクラスへの値の設定

java.util.Calenarクラスへの値の設定に関する注意点についてメモしておきます.

java.util.Calenarクラスへの値の設定には,setメソッドを使います.
  • 年の値の場合,set(Calendar.YEAR, 年の値)
  • 月の値の場合,set(Calendar.MONTH, 月の値) .月の値は1月を表す0から始まる.
  • 日の値の場合,set(Calendar.DAY_OF_MONTH, 日の値)
  • 時の値の場合,set(Calendar.HOUR_OF_DAY, 時の値)
  • 分の値の場合,set(Calendar.MINUTE, 分の値)
  • 秒の値の場合,set(Calendar.SECOND, 秒の値)

2008年7月19日土曜日

Apache Commons HttpClient 3.1で「host parameter is null」

Apache Commons HttpClient 3.1でとあるサイトにアクセスすると,次のメッセージが表示されてエラーとなりました.

host parameter is null

少しググってみると,どうも下記のメソッドにスキーマを省いたURLを記述すると,そうなるとのことでした.

HttpMethod method = new GetMethod(url);

つまり,url=www.google.co.jpだと,上記のエラーが発生し,url=http://www.google.co.jpだと,成功します.

2008年6月15日日曜日

Seasarでjava.lang.UnsupportedOperationException

Seasarを使ったプログラムを作成中に次のようなメッセージのエラーに遭遇してしまいました.

致命的: getInstanceDef
java.lang.UnsupportedOperationException: getInstanceDef


とあるActionクラスにHttpSessionオブジェクトのgetterを設けていたのですが,どうもそれがあると,上記のような症状(Seasarの不具合ではなく,単に自分の知識不足によるものだと思います)に遭遇するようです.当該クラスからgetterを削除すると問題は解消しました.

[1] [Seasar-user:2720] [S2JSF] HttpServletRequest の自動バインディングを行うとエラー
http://ml.seasar.org/archives/seasar-user/2005-October/002719.html

[2] ■[S2JSF]S2JSF1.1での例外発生について2
http://d.hatena.ne.jp/wataka/20060807#1154924242

2008年3月29日土曜日

HttpUnitの実行に必要なライブラリ

HttpUnitの実行に必要なライブラリを以下にメモしておきます.

httpunit.jar
nekohtml.jar(Tidy.jarでもいいみたい)
xercesImpl.jar
xmlParserAPIs.jar
js.jar(JavaScriptが含まれていなければ必要がないみたいだけど,コンソールにメッセージが出るので含めました)

2008年3月24日月曜日

JettyをWebサーバとして実行する方法

JettyをWebサーバとして実行する方法を以下にメモしておきます.


public class WebServer {

static int PORT = 8080;

static String DOCUMENTROOT = "./WebContent";

public static void main(String[] args) throws Exception {
Server server = new Server(PORT);

ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setResourceBase(DOCUMENTROOT);

HandlerList handlerList = new HandlerList();
handlerList.setHandlers(new Handler[] {resourceHandler,
new DefaultHandler()});
server.setHandler(handlerList);

server.start();
}

}

2008年3月23日日曜日

MetaWeblog APIを使ってRollerに記事を投稿する方法

MetaWeblog APIを使ってRollerに記事を投稿する方法を以下にメモしておきます.


Hashtable<Object, Object> entry = new Hashtable<Object, Object>();
entry.put("title", title);
entry.put("description", content);

Vector<Object> parameterList = new Vector<Object>();
parameterList.add(this.blogId);
parameterList.add(this.username);
parameterList.add(this.password);
parameterList.add(entry);
parameterList.add(true);

String endpoint = this.url + this.endpoint;
XmlRpcClient client = new XmlRpcClient(endpoint);
Object result = client.execute("metaWeblog.newPost", parameterList);

2008年3月13日木曜日

JUnitによる例外のテスト

例外がスローされることをチェックしたい場合,Assertクラスのfailメソッドを使うそうです.

public void testXXXX() {
try {
// 例外 XXXXException をスローするコードを書く
Assert.fail("例外がスローされないときに表示するメッセージ");
}
catch(XXXXException expected) {
Assert.assertTrue(true);
}
}


Tips02 例外が正しく投げられることをテストする――例外のテスト手法の基本形――
http://www.itarchitect.jp/technology_and_programming/-/34141-2.html

2008年3月7日金曜日

javadocの文字コードに関するオプション

javadocの文字コードに関するオプションをメモしておきます.

-locale ja ナビゲーションバーなどのメッセージの言語を指定
-charset UTF-8 HTMLファイルのヘッダで文字コードを指定
-encoding UTF-8 ソースファイルの文字コード
-docencoding UTF-8 HTMLファイルの文字コード

Javadocで日本語APIリファレンスを作る
http://endeavour.cocolog-nifty.com/developer_room/2008/01/javadocapi_0b61.html

2008年1月12日土曜日

ログ

commons logging + log4jでログを出力するコードを書きました.簡単な手順を以下に記しておきます.

1. commons loggingとlog4jのライブラリを入手し,classpathの通ったフォルダに配置する.
2. classpathに通ったフォルダにlog4jの設定ファイルを配置する.
3. ログを出力したいクラスにLogクラスのインスタンスを持たせる.
private Log log = LogFactory.getLog(Shinobi.class);
4. ログを出力したい位置でLogクラスの該当するメソッドを呼び出す.
if(this.log.isInfoEnabled()) {
this.log.info(this.targetUrl);
}

ログについては思いのほか簡単に実装できたのですが,ログファイルの場所の設定がうまくいきませんでした.具体的には,下記のように記すと,
<param name="file" value="shinobi.log"/>
Tomcatのルートディレクトリに出力されてしまいます.絶対パスで決め打ちすることもできるのですが,そうなると異なる環境では動作できなくなります.一応,解決方法を見つけはしたのですが,なんかすっきりしないので,とりあえず放置しておきます.

以下に参考にしたページを記しておきます.
http://www.atmarkit.co.jp/fjava/rensai2/jakarta09/jakarta09.html
http://www.atmarkit.co.jp/fjava/rensai4/programer10/programer10_1.html