けんとのブログ

ぼやき&開発メモ

MySQLの文字コードutf8の扱いについて

2009年01月29日 13時36分55秒 | MySQL
MySQLの文字コード設定全てutf8の状態では、
windowsでMySQLコマンドラインから日本語データの格納はできない。→エラーが出る。

ただし、CSEから、CSEの文字コード設定をcp932にしておくと格納できる。→CSEで日本語データとして表示もできる。
この格納したデータをMySQLコマンドラインで表示すると文字化けした状態で表示される。

MySQLコマンドラインから格納、MySQLコマンドラインで表示するには、
クライアントの文字コードと、結果の文字コードをsjisに設定する。

SET character_set_client = sjis;
SET character_set_results = sjis;

これで、OK。
sjisで渡された日本語を内部的にはutf8で格納し、表示させる際にはsjisとして表示するので、
格納も、表示も日本語が正常に扱えるようになる。

※前述の「MySQLインストール」でも文字コードについて語っています。

Struts1.3導入

2009年01月29日 09時18分27秒 | Struts
Struts1.3.10を使用。
本家「http://struts.apache.org/」からDL

解凍→libディレクトリ内のjarファイルを全て、WEB-INF下のlibディレクトリにコピーし、ビルドパスに追加


~jspをstrutsタグを使って作成~

・先頭に、使うstrutsタグの種類を指定
%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
など、そのページで使うやつだけ書き足す。

・外部ファイルの指定方法が変わる
通常
<link rel="stylesheet" type="text/css" href="../css/style1.css"/>
としてたのを、
<link rel="stylesheet" type="text/css" href=""/>
とする。


~Formクラスを作成~

・ActionFormを継承させて、パラメータ名と一致するgetter,setterを作成。



~Actionクラスを作成~

・Actionを継承させて、

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) {

を使用し、パラメータの値を何かしたい時はFormから呼び出す。

LoginForm lform = (LoginForm) form;
String id = lform.getId();
String pass = lform.getPass();


セッションに保持させる際は、

HttpSession session = req.getSession();
session.setAttribute("id", "id");

の様にして保持させる。
最後に必ず、Forwardを返す。

return mapping.findForward("result");



web.xmlファイルをWEB-INF直下に作成

web.xml

xml version="1.0" encoding="utf-8" ?>

!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<servlet>

<servlet-name>act</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>

<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>

<servlet-name>act</servlet-name>

<url-pattern>*.do</url-pattern>
</servlet-mapping>


<welcome-file-list>
<welcome-file>/jsp/login.jsp</welcome-file>
</welcome-file-list>

</web-app>


WEB-INF直下にstruts-config.xmlを作成

struts-config.xml

?xml version="1.0" encoding="utf-8" ?>

!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>

<form-beans>
<form-bean name="loginForm" type="form.LoginForm"/>
</form-beans>

<action-mappings>

<action path="/test"

<forward name="result" path="/jsp/result.jsp"/>
</action>
</action-mappings>

</struts-config>

遷移先のjspをstrutsタグで作成。

tomcat6、eclipse3.4では、フレームワークを使わず、servletだけでアプリを作成した際は、自動で<Context>が書かれたxmlを作ってくれるのだが、
Strutsを使ったアプリでは自動で作成されなかった。なので、手書きで作る必要がある。
$CATALINA_HOME/conf/Catalina/localhost/内にプロジェクト名.xmlを作成し、

<Context path="/StrutsTest" reloadable="true" docBase="C:workspaceStrutsTest" workDir="C:workspaceStrutsTestwork" />

※StrutsTestはプロジェクト名 pathはプロジェクトの置き場所。
を作成した。

tomcatを起動させ、「http://localhost:8080/StrutsTest/」で最初の画面がでる。StrutsTestはプロジェクト名

最後に、
このままでは扱うパラメータが文字化けするので、
Strutsで扱う文字コードの設定をしておく。
filrersパッケージ作って、文字コード設定クラスをつくる。

package filters;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


//文字コード設定クラス。
public class SetCharacterEncodingFilter implements Filter {

public void init(FilterConfig arg0) throws ServletException{
}

public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException{

request.setCharacterEncoding("utf-8");
chain.doFilter(request,response);
}

public void destroy(){
}
}

んで、web.xmlにこのクラスを起動時に読み込むように設定する。

<filter>
<filter-name>EncodeFilter</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>EncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

以上

※一部<>を使うとweb上で表示されない箇所は<>を省略しています。