« Strutsとコード | トップページ | 苦にもされず »

2005.06.15

続・Strutsとコード

これ見ていろいろ試してみた。
独自のクラスが前提になっているような文書だけれど、普通にStrutsで動きます。
ただ問題は、コードが1種類なこと。
コードの数ぶんxmlとPlugin書くのも嫌だ。
Listが入ったMapにしておきたい。

そこで調べてみると、Digester/FAQという中に、
「How do I add object elements to a Map object?」というのがあった。
つまりオブジェクトをMapに入れるときのやり方。
しかしこれはxmlでは書いていない。

xmlで書けるのは1.7から
「add targetoffset attribute to call-method-rule tag」というのがそう。
結局、

struts-config.xml
<plug-in className="org.apache.struts.plugins.DigestingPlugIn">
  <set-property property="configPath" value="/WEB-INF/codes.xml"/>
  <set-property property="configSource" value="servlet"/>
  <set-property property="digesterPath" value="/WEB-INF/codes-digester-rules.xml"/>
  <set-property property="digesterSource" value="servlet"/>
  <set-property property="key" value="codes"/>
</plug-in>

codes.xml(ここにコードを追加していく)
<?xml version = "1.0" encoding = "UTF-8" ?>
<map>
  <list key="country">
    <labelvaluebean label="Japan" value="jp" />
    <labelvaluebean label="USA" value="us" />
  </list>
  <list key="sex">
    <labelvaluebean label="男" value="M" />
    <labelvaluebean label="女" value="W" />
  </list>
</map>

codes-digester-rules.xml
<?xml version = "1.0" encoding = "Shift_JIS" ?>
<digester-rules>
  <pattern value="map">
    <object-create-rule classname="java.util.HashMap"/>
  </pattern>
  <pattern value="map/list">
    <object-create-rule classname="java.util.ArrayList"/>
    <pattern value="labelvaluebean">
      <object-create-rule classname="org.apache.struts.util.LabelValueBean" />
      <set-properties-rule />
      <set-next-rule methodname="add" paramtype="org.apache.struts.util.LabelValueBean"/>
    </pattern>
    <call-method-rule targetoffset="1" methodname="put" paramcount="2" paramtypes="java.lang.String,java.util.ArrayList"/>
    <call-param-rule paramnumber="0" attrname="key"/>
    <call-param-rule paramnumber="1" from-stack="true"/>
  </pattern>
</digester-rules>

JSP
<html:select property="xxxx">
  <html:optionsCollection name="codes" property="country"/>
</html:select>

ここまでたどりつくのに、5時間近くかかったのは秘密だ。
ただ自分でコード機能実装するよりかは恥ずかしくない。
Shift_JISくらい許してください。


|

« Strutsとコード | トップページ | 苦にもされず »

コメント

読み込み用Digester
digester-rules>
  pattern value="map">
    object-create-rule classname="java.util.HashMap"/>
  /pattern>

  pattern value="map/list">
    object-create-rule classname="java.util.HashMap"/>
    pattern value="labelvaluebean">
      call-method-rule methodname="put" paramcount="2" paramtypes="java.lang.String,java.lang.String"/>
      call-param-rule paramnumber="0" attrname="value"/>
      call-param-rule paramnumber="1" attrname="label"/>
    /pattern>
    
    call-method-rule targetoffset="1" methodname="put" paramcount="2" paramtypes="java.lang.String,java.util.ArrayList"/>
    call-param-rule paramnumber="0" attrname="key"/>
    call-param-rule paramnumber="1" from-stack="true"/>
  /pattern>
/digester-rules>

JSP
bean:define id="decodes_country" name="decodes" property="country" type="java.util.Map" />

bean:write name="decodes_country" property="xxx"/>

投稿: chocoapricot | 2005.06.18 00:00

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/19919/4568429

この記事へのトラックバック一覧です: 続・Strutsとコード:

« Strutsとコード | トップページ | 苦にもされず »