ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Strutsの要素技術の基本的構造(その8複数ボタンLookupDispatchAction)

2009-09-14 14:02:32 | Weblog

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に変えて実行しています。


この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« グーグルは、ストリートビュ... | トップ | UML等各種ダイアグラムのエラ... »
最新の画像もっと見る

Weblog」カテゴリの最新記事