Strutsの要素技術の基本的構造の話。
今、複数ボタンをある場合をやっていて、UTF-8なら、submitボタンのvalueの値をそのまま聞けばいい。けど、そうじゃない(Shift-JISとか)時や、国際化したい場合は、この方法はよくない。じゃ、どうするかというので、
(1)submitのname(property)を変えてしまい、値が入ってくるかどうかで見る
(2)LookupDispatchActionを使う
(3)javascriptを使って、Action等を切り替える
が考えられるという話を書いて、そのうち、前回は(1)をやりました。
今回は、(2)の「LookupDispatchAction」を使ってみます。
■一般に「LookupDispatchAction」の使い方は・・・
ここ
Struts-12.アクション・クラス:LookupDispatchAction
http://www.javaroad.jp/opensource/js_struts14.htm
に書かれているとおり。
つまり、
1.JSPのsubmitを、propertyを使い、ボタンの表示値をbean:message keyで書く
2.struts-config.xmlで
Actionのところ、parameterで1のpropertyを指定
message-resourcesで、メッセージリソースを指定
3.メッセージリソース、1のkeyを日本語で書いたものをつくり、
それをnative2asciiで変換する
4.Actionクラス作成
・LookupDispatchAction を継承
・protected Map getKeyMethodMap() でメソッドと1のkeyの対応
これで出来るような雰囲気に見える。
では、上記のサイトを参考に、ちょとだけ入れ替えて作ってみましょう。
今回は、そのため、(いつもはUTF-8だけど)上記サイトにあわせSHIFT-JISにします。
■ソース
いつもの足し算プログラム
●はじめに開くJSP(exLookupDispatch.jsp)
<%@ page contentType="text/html; charset=Shift_JIS" %> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <html:html> <head><title>exLookupDispatch.jsp</title></head> <body> <html:form action="/ExLookupDispatch"> <html:text property="parm1" size="6"/>と <html:text property="parm2" size="6"/>を<br> <html:submit property="exeMethod"> <bean:message key="submit.a"/> </html:submit> <html:submit property="exeMethod"> <bean:message key="submit.b"/> </html:submit> </html:form> </body> </html:html> |
(上記< >は、本当は半角)
●結果表示JSP(kekka.jsp)
<%@ page contentType="text/html; charset=Shift_JIS" %> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <html:html> <head><title>結果</title></head> <body> <bean:write name="kekka" scope="session"/><BR> <A HREF="exLookupDispatch.jsp">もどる</A> </body> </html:html> |
(上記< >は、本当は半角)
●struts-config.xml
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="ExLookupDispatch" type="struts.ExLookupDispatchForm"/> </form-beans> <action-mappings> <action path="/ExLookupDispatch" type="struts.ExLookupDispatchAction" name="ExLookupDispatch" parameter="exeMethod"> <forward name="kekka" path="/kekka.jsp"/> </action> </action-mappings> <message-resources parameter="resources.application"/> </struts-config> |
(上記< >は、本当は半角)
●ExLookupDispatchForm.java(ActionFormクラス)
package struts; import org.apache.struts.action.*; public final class ExLookupDispatchForm extends ActionForm { private String parm1; private String parm2; public String getParm1() { return parm1; } public void setParm1(String parm1) { this.parm1 = parm1; } public void setParm2(String parm2) { this.parm2 = parm2; } public String getParm2() { return parm2; } } |
●ExLookupDispatchAction.java(Actionクラス)
package struts; import javax.servlet.http.*; import javax.servlet.ServletContext; import org.apache.struts.action.*; import org.apache.struts.actions.*; import java.util.*; public final class ExLookupDispatchAction extends LookupDispatchAction { protected Map getKeyMethodMap() { Map map = new HashMap(); map.put("submit.a", "plus"); map.put("submit.b", "minus"); return map; } //足し算 public ActionForward plus(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) { ExLookupDispatchForm myForm = (ExLookupDispatchForm)form; HttpSession session = req.getSession(); try { int i1 = Integer.parseInt(myForm.getParm1()); int i2 = Integer.parseInt(myForm.getParm2()); session.setAttribute("kekka", i1+"+"+i2+"="+(i1+i2)); } catch(Exception e) { session.setAttribute("kekka", "Error"); } return (mapping.findForward("kekka")); } //引き算 public ActionForward minus(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) { ExLookupDispatchForm myForm = (ExLookupDispatchForm)form; HttpSession session = req.getSession(); try { int i1 = Integer.parseInt(myForm.getParm1()); int i2 = Integer.parseInt(myForm.getParm2()); session.setAttribute("kekka", i1+"-"+i2+"="+(i1-i2)); } catch(Exception e) { session.setAttribute("kekka", "Error"); } return (mapping.findForward("kekka")); } } |
●resources.application
まず、以下のように日本語(Shift-JIS)で書いたファイルを作る
(ファイル名は実はなんでもいい。ここでは、application_ja.propertiesとする)
submit.a=足す submit.b=引く |
そしたら、native2ascii(JDKをインストールすれば、たぶん入ってると思う)をつかって
native2ascii application_ja.properties > application.properties
(上記 > は本当は半角)
をすると、
submit.a=\u8db3\u3059 submit.b=\u5f15\u304f |
になる。これを、struts-configで指定したとおり、resources.applicationとしていれる
(つまり、アプリのフォルダ/WEB-INF/classesの下に、resourcesというフォルダをつくり、
そこにapplication.propertiesという名前で保存する。つまり、ファイル名は、
struts-configの指定.propertiesとなる)
■で、これで保存して、実行しようとすると・・・
まず、1.3だと、ソースがコンパイルエラーになる。
なので、
ここ
StrutsのLookupDispatchActionの場所なんだけど・・・・
に書いたように、struts-extras-1.3.10.jarをつけてリンクする。
そして、実行。
もし、
javax.servlet.ServletException: サーブレットの実行により例外を投げました |
というエラーが出たら、たぶん、サーブレット側にstruts-extras.jarを入れ忘れている。
ということで、WEB-INF/libにstruts-extras-1.3.10.jarとかを入れて、再度実行すると、
javax.servlet.ServletException: javax.servlet.ServletException: Action[/ExLookupDispatch]でキーメソッドマップの中にリソース {1} が見つかりません |
とでてくる。ここで止まってしまう。
■理由
ためしに、application.propertiesを、
submit.a=plus submit.b=minus |
に変えると、うまくいく(と思う)
ということは、日本語変換に問題がありそうだということになる。
実は、これ、SHIFT-JISで書いている場合には、SHIFT-JISで入力する必要がある。
上記サイトでは、
Struts-8.アクション・フォームBeanの日本語処理
http://www.javaroad.jp/opensource/js_struts10.htm
で、SHIFT-JISで入力する方法が書いてある。
(なので、LookupDispatchActionでは、書いていないんだと思う)
■対策
ということで、そこに書いてあるとおり、
●web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <!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> <filter> <filter-name>EncodeFilter</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>Shift_JIS</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodeFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <display-name>Struts Blank Application</display-name> <servlet> <servlet-name>action</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>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> |
(上記< >は、本当は半角)
を書いて(encodingがShift_JISなのに注意)
SetCharacterEncodingFilter.classをダウンロードして(上記Struts-8.アクション・フォームBeanの日本語処理からダウンロードできる)、WEB-INF/classesの下に、filtersというフォルダを作って、そこにSetCharacterEncodingFilter.classを保存する。
そうするとできる。
けど、こんなめんどっちいことをやるんだったら・・・
次回は、もっとやさしく、幅広くつかえるJavascriptの方法についてです。
※今回、SHIFT-JIS用にフィルタを使っていますが、このフィルタ、ウィリアムのいたずら、いつも使ってます。サンプルに書いてあるものは、このフィルタを通しているものと思ってください。でないと、日本語処理が変になることがあります。
ただし、いつもはUTF-8でサンプルを書いているため、上記encodingは、utf-8に変えて実行しています。