§@ªÌ  Yuan-Chen Cheng <ycheng@sinica.edu.tw>,              ¬ÝªO  BSD
 ¼ÐÃD  Servlet + JSP + mysql jdbc + chinese
 ®É¶¡  Computing Center, Academia Sinica (Thu Sep 21 00:26:49 2000)
 ¸ô®|  bbs.yzu!news.yzu!news.ncu!news.csie.ncu!netnews.csie.nctu!news.civil.nc
 ¨Ó·½  140.109.7.52

JSP / Servlet «ç¼Ë¤~¯à³B²z¤¤¤å.
        ¶¶«K½Í mysql jdbc + ¤¤¤å

¾G­ì¯u (ycheng@sinica.edu.tw)

Copyright 2000.
¥»¤åª©Åv : GPL or BSD style, ½Ð«O¯d§@ªÌ©m¦W¡C

¥»¤å°²³]§A¤w¸g·|¨Ï¥Î JSP ©Î¬O Servlet ¼¶¼g­^¤åªº Web-Page.
¦pªG§AÁÙ¤£·|¡A©Î¬O®Ú¥»¤£ª¾¹D JSP ©Î¬O Servlet ¬O·F¤°»òªº¡A
¨º³o½g¤å³¹¤£¬O¼gµ¹§A¬Ýªº¡C

¦b Java Servlet Spec v2.0 ¤¤¡A¹ï©ó¦h°ê»y¨¥ªº¤ä´©¡A¨Ã¤£¨¬¡C
§A¥²¶·§ä¨ì Java Servlet Spec v2.2 ªº¹ê§@¤~¦æ¡Aµ§ªÌ¸Õ¹Lªº
¬O Apache Jakarta Tomcat 3.1 ³nÅé(µù¤@¡^¡C

¥»¤å´ú¸Õ¥­¥x¬O Debian Woody, Sun jdk1.2.2, Tomcat 3.1,
        mm.mysql-2.0.2


        Java Server ¦p¦ó³B²z¤¤¤å.

        «e¨¥

­º¥ý, ¦p¦ó¥¿½Tªº¤F¸Ñ§A¤@­Ó Big5 ¤¤¤å¦b Java ¤¤¬O¥¿½Tªº
¤¤¤å Unicode ©O ?

¿é¥X¤@­Ó String("¤µ").length() §a ! ¥Ñ©ó "¤µ" ¦b Big5 ¬O¥Ñ¨â­Ó
byte ²Õ¦¨, ¦ý¹ï java ¨Ó»¡¡Ajava ªº¦r¤¸¬O unicode, ¤]´N¬O»¡,
µL½×¬O¤@­Ó­^¤å¦r©Î¬O¤@­Ó¤¤¤å¦r¡A¨ä length() ³£¬O 1. ¤]´N¬O»¡¡A
(new String("¤µ")).length() ==> 1¡C¤~¬O¥¿½Tªº¡C


        Servlet ¿é¥X¤¤¤åªº¤@­Ó¨Ò¤l.

¤U­±¬O¤@­Ó¨å«¬ªº Java Servlet.

HelloWorldExample.java =>
----------- cut here -----------------
import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorldExample extends HttpServlet {

    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
    {
        response.setLocale(new Locale(new String("zh"), new String("TW")));
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.println("<head>");

        String title = new String("hello ¤j®a¦n");

        out.println("<title>" + title + "</title>");
        out.println("</head>");
        out.println("<body bgcolor=\"white\">");
        out.println("<body>");

        out.println("<p>");

        out.println("<h1>" + title + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}
----------- cut here -----------------
¥i¥H¥¿±`¿é¥X¤¤¤åªºÃöÁä¬O:

        response.setLocale(new Locale(new String("zh"), new String("TW")));

ª`·N³o¤@¦æÀ³¸Ó­n©ñ¦b

        PrintWriter out = response.getWriter();

¤§«e°õ¦æ¡C¥t¥~½sĶ®Éª`·N


        javac -encoding Big5 HelloWorldExample.java

©Î¬O (linux ¤Wªº jdk1.2.2)

        export LANG=zh_TW.Big5
        export LC_CTYPE=zh_TW.Big5
        javac HelloWorldExample.java

ª`·N, ³o­Ó¨Ò¤l¦b jserv v1.1.2 ¨Ã¤£¯à work, ¦]¬°¸Óª©¥»¹ê°µªº
        JavaSoft Java Servlet APIs 2.0, ¦Ó setLocale ¬O¨ì
        Servlet APIs 2.2 ¤~¦³¡C


        Java Server Page ¦p¦ó³B²z¤¤¤å

¦b¦¹Â²²¤»¡©ú¡A¥ý¬Ý¤U­±ªº¨Ò¤l¡G

test.jsp
----------------------
<%@ page contentType="text/html; charset=big5" %>
<html>
<body bgcolor="white">
¤¤¤åTEST.<p>
<%= (new String("¤µ¤Ñ")).length() %>
</body>
</html>
----------------------

ÃöÁä¦b²Ä¤@¦æ¡C¦³¤F³o¤@¦æ´N¦æ¤F¡C

For Hacker:

²z½×¤W³o¤@¦æ¥i¥H©ñ¦b¤å¥óªº¥ô¦ó¦a¤è¡A¦ý¥Ñ©ó Java ®É°µ¤W
¶}Àɮ׫á³q±´N¥²¶·«ü©w encoding¡A·í java jsp engine µo²{ charset
¸ò default ¤£¦P®É¡A³q±`¥²¶·­«·s¶}ÀɮסC©Ò¥H¹ê°µ¤W³o¤@¦æ©ñ¦b¶V«e­±¶V¦n¡C
¤£¹L¸Ü¬O³o¼Ë»¡¡A¥Ñ©ó³q± jsp ·|¦b run time ³Q compile ¦¨ java bytecode,
¤]´N¬O»¡¥u¦³¦b .jsp §ó·s®É¤~»Ý­n recompile¡Coverhead ¹ê¦b¦³­­¡C


        Java ³sµ²¨ì MySql ¦p¦ó¨Ï¥Î¤¤¤å

Java ¥H jdbc ³sµ²¨ì databases server¡AMySql ¦³ Free ªº
jdbc driver. ¥H¤U¤£ÀÀ»¡©ú¦p¦ó¨Ï¥Î jdbc, ¶È»¡©ú¦p¦ó­×§ï
§Aªº code ¨Ï¥i¥H¥Î¤¤¤å¡C

mysql Àx¦s¤¤¤å¸ê®Æ¦³¨âºØ¤èªk, ²Ä¤@ºØ¬O¨Ï¥Î big5 ¤º½XÀx¦s,
¨äÀuÂI¬O¸¬ÙµwºÐ/°O¾ÐÅéªÅ¶¡, ¬Û¸û©ó¨Ï¥Î UTF8 ¤§¤U, ­Y¿é¥X
¬° Big5¡A§ó¬Ù¥h¤@¦¸ªº Unicode (UTF8) »P Big5 »Ý­n¸g¹L
Table lookup ªºÂà´«¡C¦ý¨Ï¥Î Big5 ´N·|¦³ Big5 ¥ý¤Ñ¤Wªº°ÝÃD¡C
¨å«¬ªº°ÝÃD¬O Big5 ¦r¦ê¦b³B²z¦rªºÃä¬Éªº°ÝÃD¡CBig5 ¥ý¤Ñ¤Wªº
°ÝÃD¬O³o¼Ëªº¡A´N¥H "°ÝÃD" ³o­Ó¦r¦ê¬°¨Ò¡A°Ý¦rªº²Ä¤G­Ó byte
¸òÃD¦rªº²Ä¤@­Ó byte ©Ò§Î¦¨ªº¦r¬O "ÝÃ" ¦r¡C©Ò¥H·í§Ú­Ì¦b§@
¤å¦r·j´M§ä¥]§t "ÝÃ" ªº¦r¦ê¡A§Ú­Ì·|³s¥]§t "°ÝÃD" ªº¦r¦ê¤]
¤@°_§ä¨ì¡C¦ý UTF8 ¤º½X¦b³]­p¤W´NÁ×¶}¤F³o­Ó°ÝÃD, Ä묹ªº¬O
¥²¶·¥Î¸û¦hªº byte (octets) ªí¥Ü¡C

§Ú¥u¦³¸Õ¹L MySql ¤ºªº Data ¥Î UTF8, Big5 ¨S¸Õ¹L¡C­nª`·Nªº
¬O¡A¦b UTF8 ¤¤¡A¤¤¤åªºªø«×¬O 3 ­Ó bytes, ¥Ñ©ó MySQL ©T©w
¦r¦êÄæ¦ì°e¶i¹Lªøªº¸ê®Æ®É¡A·|µo¥Í¹Lªø³B³QºIÂ_¡C¦ý MySql ¤£À´
UTF8, ©Ò¥H¥i¯àµo¥Í¤@­Ó UTF8 ¦r¤¸²Ä¤G or ¤T­Ó byte ³QºI±¼
°ÝÃD¡A¦b ASCII ¤¤°ÝÃD¤£¤j¡A³»¦h¥X²{¤@­Ó "I Love Yo", "u" ¤£
¨£¤F¡C¦ý¦b java §â¸ê®ÆÅª¶i¨Ó¡A§â UTF8 Âন java ¤º³¡ªºªí¥Ü
ªk®É¡A´N·|µo¥Í¦³¨Ç Byte µLªkÂন¥\ªº°ÝÃD¡AÀ³¸Ó·|³y¦¨
Exception. (µù¤G)

¦n, ¦^¨Ó¡A¦b jdbc ¤¤¡A¨Ã¨S¦³³W½d¦b Database ¤¤ªº¦r¤¸ªº¤º½X¡A
¦Ó§â³o­Ó°ÝÃD¯dµ¹¦U­Ó jdbc driver ³B²z¡Cmysql jdbc driver
­n¦b database ¤¤³]¬° utf8 ªº³]©w¤è¦¡¦p¤U:

        Properties pr;
        Connection db;

        pr = new Properties();
        pr.put("characterEncoding", "UTF8");
        pr.put("useUnicode", "TRUE");
        Class.forName("org.gjt.mm.mysql.Driver").newInstance();
        db = DriverManager.getConnection("jdbc:mysql:///test", pr);

¨ä¾l½Ð¦Û¦æ°Ñ¦Ò¤@¯ë jdbc µ{¦¡¼g§@ªº¸ê®Æ¡C·íµM, compile ¦¹ Servlet ®É»Ý
­n¦b©I¥s javac ®É¥[¤W "-encoding Big5"¡C

­Y­n¨Ï¥Î Big5 ªº¸Ü, ¤W­± "UTF8" §ï¦¨ "Big5" §Y¥i¡C¦ý³o¼Ë§@·|¥X²{¥t¤@­Ó
°ÝÃD, ´N¬O¤¤¤å²Ä¤G­Ó byte ¦³ '\' ªº°ÝÃD¡C³o­Ó°ÝÃD§Ú¤£ª¾¹D¦³¨S¦³¤è«Kªº¸Ñ
ªk¡A¤£ª¾¹D compile mysql ®É±N encoding ³]¬° big5 ¥i§_¸Ñ¨M³o­Ó°ÝÃD¡C(µù¤G)

µù¤@¡G½Ð¨ì http://jakarta.apache.org/ ¤U¥h Download.
µù¤G¡G³o­Ó§Ú¨S¦³´ú¸Õ¹L¡A½Ö­n´ú¤F¸ò¤j®a»¡µ²ªGªº¡H