Rory's Blog
          Happy study,Happy work,Happy life
          posts - 22,  comments - 46,  trackbacks - 0
          xstream是個好東西。對于配置文件的讀取很方便。在mybog中我就用到了。不過今天打算用yupoo的api來做相冊。發(fā)現(xiàn)xstream對于xmlnode的attribute解析支持不是那么的好。
          對于這種節(jié)點格式的非常的簡單
          <result>
          ????
          <page>1</page>
          ????
          <pages>1</pages>
          ????
          <perpage>100</perpage>
          ????
          <total>19</total>
          ????
          <photos>
          ????????
          <photo>
          ????????????
          <id>ff8080810fc8ac78010fd3f158d40a52</id>
          ????????????
          <owner>ff8080810f1a387b010f1a83d6530dfc</owner>
          ????????????
          <title>Gmail-2</title>
          ????????????
          <host>4</host>
          ????????????
          <dir>20061230</dir>
          ????????????
          <filename>231905_1463411198</filename>
          ????????
          </photo>
          ????
          </photos>
          </result>

          簡單的alias一下就可以讀到值了
          File?file?=?new?File("src/test/java/com/jdkcn/test/result.xml");
          BufferedReader?reader?
          =?new?BufferedReader(new?InputStreamReader(new?FileInputStream(file),?"UTF-8"));
          XStream?stream?
          =?new?XStream();
          stream.alias(
          "result",?YupooResult.class);
          stream.alias(
          "photo",YupooPhoto.class);
          YupooResult?result?
          =?(YupooResult)stream.fromXML(reader);
          可是Yupoo的api返回的xmlrpc的結(jié)果是這樣的
          <result?page="1"?pages="1"?perpage="100"?total="19">
          ????
          <photos>
          ????????
          <photo?id="ff8080810fc8ac78010fd3f158d40a52"
          ????????????owner
          ="ff8080810f1a387b010f1a83d6530dfc"?title="Gmail-2"?host="4"
          ????????????dir
          ="20061230"?filename="231905_1463411198"?/>
          ????
          </photos>
          </result>
          這樣就load不到值了。沒法去mailist里面找答案,果然有人問。
          Hello,
          
          I am not sure about the subject but here is what I needed help for:
          
          XML:
          
          <field name="value">I am a Field.</field>
          
          I have already tried several structures and nothing seem to work.
          
          Is this possible for XStream? :)
          
          How is the Java class form to support this?
          
          Thanks!




          有人回答是看Converter的文檔。果然找到答案了。
          自己寫一個converter就可以了。
          下面是我的converter
          package?com.jdkcn.xstream;

          import?java.util.ArrayList;
          import?java.util.List;

          import?com.jdkcn.yupoo.YupooPhoto;
          import?com.jdkcn.yupoo.YupooResult;
          import?com.thoughtworks.xstream.converters.Converter;
          import?com.thoughtworks.xstream.converters.MarshallingContext;
          import?com.thoughtworks.xstream.converters.UnmarshallingContext;
          import?com.thoughtworks.xstream.io.HierarchicalStreamReader;
          import?com.thoughtworks.xstream.io.HierarchicalStreamWriter;

          /**
          ?*?
          @author?<a?href="mailto:rory.cn@gmail.com">somebody</a>
          ?*?
          @since?Jan?16,?2007?6:12:35?PM
          ?*?
          @version?$Id?YupooResultConverter.java$
          ?
          */
          public?class?YupooResultConverter?implements?Converter?{
          ????
          /*?(non-Javadoc)
          ?????*?@see?com.thoughtworks.xstream.converters.Converter#marshal(java.lang.Object,?com.thoughtworks.xstream.io.HierarchicalStreamWriter,?com.thoughtworks.xstream.converters.MarshallingContext)
          ?????
          */
          ????
          public?void?marshal(Object?obj,?HierarchicalStreamWriter?writer,?MarshallingContext?context)?{
          ????????
          //?FIXME?unfinish.
          ????}

          ????
          /*?(non-Javadoc)
          ?????*?@see?com.thoughtworks.xstream.converters.Converter#unmarshal(com.thoughtworks.xstream.io.HierarchicalStreamReader,?com.thoughtworks.xstream.converters.UnmarshallingContext)
          ?????
          */
          ????
          public?Object?unmarshal(HierarchicalStreamReader?reader,?UnmarshallingContext?context)?{
          ????????YupooResult?result?
          =?new?YupooResult();
          ????????result.setPage(
          new?Integer(reader.getAttribute("page")));
          ????????result.setPages(
          new?Integer(reader.getAttribute("pages")));
          ????????result.setPerpage(
          new?Integer(reader.getAttribute("perpage")));
          ????????result.setTotal(
          new?Integer(reader.getAttribute("total")));
          ????????reader.moveDown();
          ????????List
          <YupooPhoto>?photos?=?new?ArrayList<YupooPhoto>();
          ????????
          while(reader.hasMoreChildren())?{
          ????????????reader.moveDown();
          ????????????YupooPhoto?photo?
          =?new?YupooPhoto();
          ????????????photo.setDir(reader.getAttribute(
          "dir"));
          ????????????photo.setFilename(reader.getAttribute(
          "filename"));
          ????????????photo.setHost(reader.getAttribute(
          "host"));
          ????????????photo.setId(reader.getAttribute(
          "id"));
          ????????????photo.setOwner(reader.getAttribute(
          "owner"));
          ????????????photo.setTitle(reader.getAttribute(
          "title"));
          ????????????photos.add(photo);
          ????????????reader.moveUp();
          ????????}
          ????????result.setPhotos(photos);
          ????????
          return?result;
          ????}
          ????
          /*?(non-Javadoc)
          ?????*?@see?com.thoughtworks.xstream.converters.ConverterMatcher#canConvert(java.lang.Class)
          ?????
          */
          ????
          public?boolean?canConvert(Class?clazz)?{
          ????????
          return?clazz.equals(YupooResult.class);
          ????}
          }

          然后調(diào)用的地方修改一下就ok了。
          XStream?stream?=?new?XStream();
          stream.registerConverter(
          new?YupooResultConverter());
          stream.alias(
          "result",?YupooResult.class);



          參考:
          http://xstream.codehaus.org/converter-tutorial.html

          2007年1月18日更新。
          這里感謝網(wǎng)友 Ivan Chen(西濱)?的提示。原來新版的xstream可以簡單的解決了。在1.2.1的doc里面找到了這個兩個方法。

          useAttributeFor

          public void useAttributeFor(java.lang.String?fieldName,
                                      java.lang.Class?type)
          Use an XML attribute for a field or a specific type.

          Parameters:
          fieldName - the name of the field
          type - the Class of the type to be rendered as XML attribute
          Throws:
          XStream.InitializationException - if no AttributeMapper is available
          Since:
          1.2

          useAttributeFor

          public void useAttributeFor(java.lang.Class?type)
          Use an XML attribute for an arbotrary type.

          Parameters:
          type - the Class of the type to be rendered as XML attribute
          Throws:
          XStream.InitializationException - if no AttributeMapper is available
          Since:
          1.2

          這兩個方法都是從1.2開始支持的。
          也不用自己寫converter了。這樣就可以了
          ????????stream.alias("result",?YupooResult.class);
          ????????stream.useAttributeFor(
          "page",?Integer.class);
          ????????stream.useAttributeFor(
          "pages",?Integer.class);
          ????????stream.useAttributeFor(
          "perpage",?Integer.class);
          ????????stream.useAttributeFor(
          "total",?Integer.class);
          ????????stream.alias(
          "photo",?YupooPhoto.class);
          ????????stream.useAttributeFor(
          "id",?String.class);
          ????????stream.useAttributeFor(
          "owner",?String.class);
          ????????stream.useAttributeFor(
          "title",?String.class);
          ????????stream.useAttributeFor(
          "host",?String.class);
          ????????stream.useAttributeFor(
          "dir",?String.class);
          ????????stream.useAttributeFor(
          "filename",?String.class);

          創(chuàng)造共用協(xié)議:署名,非商業(yè),保持一致
          ?? 除經(jīng)特別注明外,本文章版權(quán)歸莫多泡泡所有.
          署名,非商業(yè)用途,保持一致.???somebody(莫多)
          posted @ 2007-01-17 18:24 莫多 閱讀(8001) | 評論 (2)編輯 收藏

          ? 上周更新了一下myblog,添加了一個Filter,做統(tǒng)計訪問用。可是后來發(fā)現(xiàn)出現(xiàn)亂碼問題了。找了很久都沒有找到問題。debug的時候看到 CharacterEncodingFilter確實是執(zhí)行了。不過就是沒有效果。執(zhí)行之前是ISO-8859-1編碼的,執(zhí)行之后還是, CharacterEncodingFilter就沒有起到作用。后來終于找到問題的原因了。原來是Filter配置先后順序的原因。
          ?????? 剛開始的配置是這樣的:

          ???? < filter-mapping >
          ????????
          < filter-name > requestCounterFilter </ filter-name >
          ????????
          < url-pattern > *.jhtml </ url-pattern >
          ????
          </ filter-mapping >
          ??
          ????
          < filter-mapping >
          ????????
          < filter-name > encodingFilter </ filter-name >
          ????????
          < url-pattern > /dwr/* </ url-pattern >
          ????
          </ filter-mapping >
          ????
          ????
          < filter-mapping >
          ????????
          < filter-name > encodingFilter </ filter-name >
          ????????
          < url-pattern > *.jhtml </ url-pattern >
          ????
          </ filter-mapping >
          ????
          ????
          < filter-mapping >
          ????????
          < filter-name > encodingFilter </ filter-name >
          ????????
          < url-pattern > *.jsp </ url-pattern >
          ????
          </ filter-mapping >

          ? 先經(jīng)過那個統(tǒng)計的filter然后再經(jīng)過編碼的filter。這樣的話編碼的filter就不起作用了。只要吧編碼的filter放到最前面就沒有問題了。改成這樣就好。

          ???? < filter-mapping >
          ????????
          < filter-name > encodingFilter </ filter-name >
          ????????
          < url-pattern > /dwr/* </ url-pattern >
          ????
          </ filter-mapping >
          ????
          ????
          < filter-mapping >
          ????????
          < filter-name > encodingFilter </ filter-name >
          ????????
          < url-pattern > *.jhtml </ url-pattern >
          ????
          </ filter-mapping >
          ????
          ????
          < filter-mapping >
          ????????
          < filter-name > encodingFilter </ filter-name >
          ????????
          < url-pattern > *.jsp </ url-pattern >
          ????
          </ filter-mapping >
          ????
          ????
          < filter-mapping >
          ????????
          < filter-name > requestCounterFilter </ filter-name >
          ????????
          < url-pattern > *.jhtml </ url-pattern >
          ????
          </ filter-mapping >


          以后大家一定要注意啊。順序問題也是很重要的。
          創(chuàng)造共用協(xié)議:署名,非商業(yè),保持一致?? 除經(jīng)特別注明外,本文章版權(quán)歸莫多泡泡所有.
          署名,非商業(yè)用途,保持一致.???somebody(莫多)

          posted @ 2006-12-27 10:37 莫多 閱讀(2691) | 評論 (3)編輯 收藏
          昨天晚上配置myblog的rewrite。發(fā)現(xiàn)一個奇怪的問題。由于現(xiàn)在使用的這個pjblog,為了讓搜索引擎收錄的連接有效。我想把原來的asp連接rewrite到我的新程序上面。所以有這樣一條規(guī)則。

          ????<rule>
          ????????
          <from>^/article.asp\?id=(.*)$</from>
          ????????
          <to?type="redirect">/entry/$1.jhtml</to>
          ????
          </rule>
          ???? 但是我這樣的連接總是匹配不到,只要去掉那個?就可以了。這個正則表達式是沒有問題的。/article.asp?id=64是可以匹配的到的。
          ??? 后來看3.0的manual (http://tuckey.org/urlrewrite/manual/3.0/)才發(fā)現(xiàn)原來是這個的問題。

          <urlrewrite> element

          The top level element.

          AttributePossible ValueExplanation
          default-match-type
          (optional)
          regex (default)All rules and thier conditions will be processed using the Java Regular Expression engine (unless match-type is specified on a rule).
          wildcardAll rules and thier conditions will be processed using the Wildcard Expression engine (unless match-type is specified on a rule).
          decode-using
          (optional)
          utf8 (default)When URL is decoded UTF-8 will be used.
          nullDo not decode.
          [encoding]Any string representing a supported character encoding eg, ISO-8859-1. See Java Charset Object for more info.
          use-query-string
          (optional)
          false (default)The query string will not be appended to the url that the "from" element matches against.
          trueThe query string will be appended to the url that the "from" element matches against.
          use-context
          (optional)
          false (default)The context path will not be added to the url that the "from" element matches against.
          trueThe context path will be added to the url that the "from" element matches against.

          就是那個use-query-string 的問題,默認的是不使用query-string就是把?后面的都忽略了。所以就不能匹配到了。只要在<urlrewrite>里面加一個屬性就可以了。
          <urlrewrite?use-query-string="true">
          ????
          </urlrewrite>

          創(chuàng)造共用協(xié)議:署名,非商業(yè),保持一致?? 除經(jīng)特別注明外,本文章版權(quán)歸莫多泡泡所有.
          署名,非商業(yè)用途,保持一致.???somebody(莫多)

          posted @ 2006-12-12 10:33 莫多 閱讀(2346) | 評論 (0)編輯 收藏

          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(1)

          隨筆分類(27)

          隨筆檔案(22)

          Friends

          搜索

          •  

          積分與排名

          • 積分 - 62263
          • 排名 - 845

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 潼关县| 襄樊市| 偏关县| 元江| 县级市| 平泉县| 绥宁县| 平顶山市| 固阳县| 登封市| 柘城县| 连云港市| 江门市| 调兵山市| 土默特左旗| 彩票| 金塔县| 通海县| 北碚区| 新绛县| 芷江| 蒲江县| 赣榆县| 德化县| 米泉市| 宿迁市| 扶沟县| 金川县| 保定市| 金寨县| 南宁市| 察雅县| 应用必备| 河池市| 太湖县| 津市市| 沙洋县| 枣庄市| 慈利县| 金溪县| 漾濞|