[ トップ | 一覧 | 更新履歴 ]
SOHO,在宅ワークの求人

Struts

Tomcat | Java

Jakarta Struts

2006-10-21 ブランクの間に、Jakartaじゃなくapache software foundationのStrutsに昇格してるでは。

2004-06-23 誤記を修正しました。

使い始めるの巻。 eclipseが使いたい、から始まって、とっても逆向きな選択でStrutsを使いたいかなと。

Javaやったことないくせに

ええ、Javaやったことないです。クラスライブラリと格闘してます。歯が立ちません。 Strutsのクラスは、サンプル見てほとんど勘でコーディングできるんですが、java.util.* あたりで使いたいクラスがあるんじゃないかと探すのが一番時間がかかってます。

疑問

controlをstruts-config.xml(デフォルト)で定義するが、画面遷移を定義できるわけでは なさそう。画面を.jspで記述するときにformタグ(taglib使えばhtml:formタグ)を記述する ことで次のactionが決まるので、その.jsp(でなくともいいが画面)で決まる、ということを 考えると、やはりあっち見たりこっち見たりになってしまう。

複数のDataSourceを切り替える

webapps/{app-path}/web.xmlでmoduleのpathと設定ファイルが定義されている。 その設定ファイル内でdata-sourceを定義する。

web.xml例

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

struts-config.xml例

        <data-source key="MySQL-app01">
            <set-property property="password" value="hoge" />
            <set-property property="minCount" value="2" />
            <set-property property="maxCount" value="16" />
            <set-property property="user" value="hoge" />
            <set-property property="driverClass" value="org.gjt.mm.mysql.Driver" />
            <set-property property="description" value="MySQL main application" />
            <set-property property="url" value="jdbc:mysql://localhost:3306/hoge01" />
            <set-property property="readOnly" value="false" />
            <set-property property="autoCommit" value="false" />
            <set-property property="inactivity-timeout" value="20" />
            <set-property property="wait-timeout" value="40" />
        </data-source>
        <data-source key="MySQL-app01test">
            <set-property property="password" value="hoge" />
            <set-property property="minCount" value="2" />
            <set-property property="maxCount" value="16" />
            <set-property property="user" value="hoge" />
            <set-property property="driverClass"                  value="org.gjt.mm.mysql.Driver" />
            <set-property property="description" value="MySQL main test" />
            <set-property property="url" value="jdbc:mysql://localhost:3306/hoge01test" />
            <set-property property="readOnly" value="false" />
            <set-property property="autoCommit" value="false" />
            <set-property property="inactivity-timeout" value="20" />
            <set-property property="wait-timeout" value="40" />
        </data-source>

<data-source>タグのパラメータ'key'を指定しなければ

 import javax.sql.DataSource;
 import org.apache.struts.Globals;
 DataSource ds = (DataSource)servlet.getServletContext().getAttribute(Globals.DATA_SOURCE_KEY);

'key'を指定していれば、

 DataSource ds = (DataSource)servlet.getServletContext().getAttribute("MySQL-app01");

SQL sum()の結果がDouble型で返される

JDBCからDoubleの実数型で返されるため、高額な額面では桁が足りなくなり、整数の精度が低くなる。

 SELECT sum(kingaku) AS goukei FROM mitsumori;

ResultSet Classで結果を受けたとき、 ResultSet#getDouble("kingaku")でのみ受け取れる。

整数の文字列形で返されるようにSQLを発行し、受け取ったプログラム内で文字列を整数(Long型)に変換する。

 SELECT trim(sum(kingaku)) AS goukei FROM mitsumori;

ResultSet#getString("kingaku")で受け取り、Long#parseLong()などでLong型に変換する。

bean:includeでpage指定したときのエンコード

/hoge.doがページの一部を返すshift_jisページで、呼び出し側もshift_jisページのとき

 <bean:include id="strPage" page="/hoge.do" />
 <%=strPage %>

一部の文字"−"などが文字化けする。

 <%=new String(strPage.getBytes(), "Shift_JIS") %>

なぜこれでOKなのか、わからないまま。

Cp943Cの固有文字コードは表示できない。

MySQLのJDBCでNEC選定IBM拡張文字(外字)をI/Oする

WindowsのMySQLサーバで文字コードがsjisのとき、NEC選定IBM拡張文字もデータ登録することができる。 JDBCでアクセスする際は、文字コードをCp943Cで指定する。

struts-config.xml例

        <data-source key="MySQL-app01">
        ...
           <set-property property="url" value="jdbc:mysql://localhost:3306/hoge01"?useUnicode=true&characterEncoding=Cp943C" />

<set-property>で指定できるproperty(の名前)は規定のもの以外設定できないので、

 <set-property property="characterEncoding" value="Cp943C" />

などとやっても無駄でした。

NEC選定IBM拡張文字(外字)を表示する

ブラウザはIE6だけで確認。

jsp

 <%@ page contentType="text/html; charset=Cp943C" %>
 <%@ page pageEncoding="Cp943C" %>

bean:include

 <bean:include id="strPage" page="/hoge.do" />
 <%=new String(strPage.getBytes(), "Cp943C") %>

上は、

 <%=new String(strPage.getBytes("Cp943C") %>

でも結果が同じ。

formで入力されたNEC選定IBM拡張文字をservletが文字化けなく受け取るには、 requestのパラメータをエンコードする必要あり。

html-taglib

 <bean:define id="confirmMessage">delete? 削除しますか?</bean:define>
 <html:submit styleClass="btn-submit"
	onclick="javascript:return window.confirm('<%=removeMessage%>');"
 >delete削除</html:submit>

上は<%=removeMessage%>が展開されず、そのままHTMLになってしまう。

<input type="submit>タグを素で書けばいいのだが、せっかくtaglibを使っているので 統一したい。

 <bean:define id="confirmMessage">javascript:return window.confirm('delete? 削除しますか?');</bean:define>
 <html:submit styleClass="btn-submit"
	onclick="<%=removeMessage%>"
 >delete削除</html:submit>

javascriptの記述をbean:defineタグの方に追い出した。

これなら、なぜか<%=removeMessage%>が展開される。onclick=の次に"<%=removeMessage%>"と単独であると展開される。

メッセージリソースがあるなら下のようになる。

 <bean:define id="confirmMessage">javascript:return window.confirm ('<bean:message key="remove.confirm"/>');</bean:define>
 <html:submit styleClass="btn-submit"
	onclick="<%=removeMessage%>"
 ><bean:message key="remove.title"/></html:submit>

requestに対し、pdfを出力するresponseにする 2006-10-21

ファイルをダウンロードしたりするときのやり方。 Action classのActionForward execute()の中で、

 byte[] content;
 ...
 //-------------------------------------------------
 //	PDFファイルのためのHTTP response headerを設定
 //-------------------------------------------------
 response.setContentType("application/pdf; name=\"" + fileName + "\"");
 response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
 //---------------------------
 //	出力を横取りして出力
 //---------------------------
 response.setContentLength(content.length);
 response.getOutputStream().write(content);
 response.getOutputStream().flush();
 ...

ActionForwardを返さなければならないが、遷移を管理されたくないので、最後は

 return null;

とするそうな。responseを横取りして、HTTP responseは返してしまっているので、 遷移する必要なし。


GzuGzu (WikiWikiWeb descendant) ver 1.00 pre2
このページはGzuGzuで作成されました.
yaino.com