2007年10月7日日曜日

Javaの勉強 - Post1.

 ひっそりと長らく停止していたJavaの勉強.
 今日からまた週2時間くらいの勢いで再開予定 orz

 まぁ、アレです.
 仕事が忙しいので.
 明日も休日出勤だし.
 本当は毎晩ビール飲んだ暮れてるのが原因だけど orz

 と、それは置いておき、以前勉強した6時間分はすっかり頭の中から抜け落ちていたので、また第1歩からJavaを検証してみます.
 今回はStrutsをいきなり使ったりせず、Java(JSP/Servlet)そのものをいじくります.
 未だにTomcatとGeronimoの違いがよく分かりませんが(前者がJSP/Servletコンテナ・サーバ、後者がJ2EEコンテナ・サーバー(Application Server)…と言われてもねぇ)、それは今のところ無視して、普通にJSPとServletを動かして.

 で、再開1日目にして早速つまづきましたw

 Servletを触っていて、ふと「あれ?POSTされたデータのエスケープって、全部自分でやらないとダメなの?(自動で処理してくれるクラスって無いの?)」と言う疑問が沸き上がり、ちょろちょろと調べてみましたが、いまいち的を得た回答ページを見つける事が出来ず、『取り敢えず』以下の様なクラスを書いてみる事に.

package com.blogspot.lightmaterial.core.String;

import java.util.regex.*;

/**
* 文字列に対するセキュリティ処理を実装します.
*/
public class SecureString {
    /**
     * Property.
     */
    protected String value = null;


    /**
     * Constructor.
     */
    public SecureString() {
    }
    public SecureString(String strValue) {
        this.setValue(strValue);
    }


    /**
     * Accessor.
     */
    public String getValue() {
        return this.value;
    }

    public void setValue(String strValue) {
        this.value = strValue;
    }


    /**
     * Htmlタグをエスケープします.
     * @access public
     * @param void
     * @return String
     */
    public String toEscape() {
        //-> Local variable.
        int nIndex = 0;
        String strTarget = new String();
        String[] strPattern = {"<", ">", "'", "\""};
        String[] strReplace = {"&lt;", "&gt;", "&#039;", "&quot;"};

        //-> Check value property.
        if (this.value == null) return "";

        //-> Preserve value property.
        strTarget = this.value;

        //-> Replace value.
        for (nIndex=0; nIndex<strPattern.length; nIndex++)
            strTarget = this.doReplace(strTarget, strPattern[nIndex], strReplace[nIndex]);
        strTarget = Matcher.quoteReplacement(strTarget);

        //-> Set return value.
        return strTarget;
    }


    /**
     * 文字列をそのまま返します.
     * @access public
     * @param void
     * @return String
     */
    public String toString() {
        return this.value;
    }


    /**
     * 文字列を置換します.
     * @access protected
     * @param String Target
     * @param String Pattern
     * @param String Replace
     * @return String
     */
    protected String doReplace(String strTarget, String strPattern, String strReplace) {
        //-> Local variable.
        Pattern objPattern = null;
        Matcher objMatcher = null;

        //-> Replace target value.
        objPattern = Pattern.compile(strPattern);
        objMatcher = objPattern.matcher(strTarget);
        strTarget = (objMatcher.replaceAll(strReplace));

        //-> Set return value.
        return strTarget;
    }
}

 Stringを使いまわしてるので、メモリが無駄になってる上にエラー処理を一切していないと言う恐怖のコードですが、Java自体よく分かってない上に適当に書いてるので気にせず行きましょう.

 上記のコードを書き終わり、ServletのgetParameterの戻り値に適用.
 「…一応普通に動いてるな…」とは思ったのですが、何しろこんな書き方で正しい訳が無い.
 と言うか、書き方以前にきっとどこかにエスケープするクラスなりメソッドがあるはずなんですが、それが見つけられません.

 そう.
 それもこれもJavaのドキュメントが原因です.
 Javaのドキュメントって、親切そうでいて、以外と使い勝手が悪い様な気がしてなりません.
 それともPHPの親切なドキュメントに慣れすぎているのが悪いんでしょうか?
 正直、あの悪名高きMSDN(サブスクリプションじゃなくてヘルプの方)よりも『個人的には』使い勝手が低い様な気がします.
 いや、クラスの把握とかメソッドの把握にはいいんですが、何しろサンプルが異様に少ない.
 javadocで生成しているが故の制限なのかもしれませんが、正直私の様な初心者にはヘルプにサンプルが載ってないのは致命傷です orz

 こんな調子じゃ、これから先のJava勉強は茨の道確定ですね.
 明日も仕事だし、今日は諦めてさっさと寝よっと.

0 件のコメント: