web.xmlへのservlet定義
<servlet> <servlet-name>servletName</servlet-name> <servlet-class>packageName.ClassFileName</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletName</servlet-name> <url-pattern>/actionName</url-pattern> </servlet-mapping>
呼び出し例
jsp
<form action="/contextPath/actionName" method="GET"> <input type="submit" value="GO" /> </form>
Servlet
req.getServletContext().getRequestDispatcher(actionName).forward(req, res);
URLダイレクトアクセス
文字列とバイト表現の話
ソースコード上に出現する(生成する/外部から受け取る)文字列については、ソースコードをコンパイルしたOSのデフォルトエンコーディングに従ってバイト変換したものをUnicodeに再変換している。
*eclipseを使って開発をしている場合は、eclipseの設定による。
String str = "あいうえお";
という文字列を宣言したときに、
byte[] bytes = str.getBytes();
として、文字列オブジェクトをbyte配列に変換し、中身を見る。
デフォルトエンコーディングの設定がUTF-8
bytesには次のように格納される。
[0xe3, 0x81, 0x82, 0xe3, 0x81, 0x84, 0xe3, 0x81, 0x86, 0xe3, 0x81, 0x88, 0xe3, 0x81, 0x8a]
0xe3, 0x82, 0xa0 で UTF-8の「あ」。
0xe3, 0x82, 0xa2 で UTF-8の「い」。
(日本語文字は3バイトで表現される)
デフォルトエンコーディングの設定がWindows-31J
[0x82, 0xa0, 0x82, 0xa2, 0x82, 0xa4, 0x82, 0xa6, 0x82, 0xa8]
0x82, 0xa0 で Windows-31Jの「あ」。
0x82, 0xa2 で Windows-31Jの「い」。
(日本語文字は2バイトで表現される)
char配列ではなくbyte配列で見なければいけないことに注意。
文字列を作ったらとりあえず文字コードは気にしない。
String str = "あいうえお";
この時点で「あいうえお」はUTF-16。
Shift_JISの文字コードで表現された「あいうえお」だったり、
UTF-8の文字コードで表現された「あいうえお」だったりするわけではない。
意識しなくてはいけないのは、文字列表現をバイト配列に変換する時。
byte[] bytes = str.getBytes("UTF-8");
この時点で、「あいうえお」がUTF-8の文字コードで
表現されたバイト配列に変換される。
そして、
String str = new String(bytes, "UTF-8");
この時点で、バイト配列をUTF-8の文字コードで表現された文字だと
認識して、Stringの文字列オブジェクトを作成する。
つまり、以下の場合は文字化けする。
String str = "あいうえお"; byte[] bytes = str.getBytes("Windows-31J"); str = new String(bytes, "UTF-8");
理由は、Windows-31Jの文字コードで表現されたバイト配列を、UTF-8の文字コードで表現されたバイト配列だと認識して、Stringの文字列オブジェクトを生成するため。
特にWebプログラミングをしている時に文字化けは起こりがち。
(TomcatのデフォルトエンコーディングがISO-8859-1であるため、上手く文字列を変換させずに日本語文字列を出力したり、送信したりすると文字化けしてしまう等。)
InputSreamReader,FileInputStreamReaderなどで文字コードを明示的に指定し、デフォルトエンコーディングの利用をしないこと。
*FileReaderクラスはデフォルトエンコーディングしか利用できない。
(参考ソース)
import java.io.UnsupportedEncodingException; public class TestMoji { public static void main(String args[]){ String str = "あいうえお"; print(str); print(str,"Windows-31J"); print(str,"euc-jp"); print(str,"ISO-8859-1"); } private static void print(String str){ print(str, System.getProperty("file.encoding")); } private static void print(String str, String encoding){ try{ byte[] bytes = str.getBytes(encoding); System.out.println("encoding:"+encoding); for(int i = 0; i < bytes.length; i++){ System.out.printf("%x",bytes[i]); if(i != bytes.length-1){ System.out.print(", "); } } System.out.println(); } catch(UnsupportedEncodingException e){ e.printStackTrace(); } } }