<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Rory's Blog
    Happy study,Happy work,Happy life
    posts - 22,  comments - 46,  trackbacks - 0
    xstream是個好東西。對于配置文件的讀取很方便。在mybog中我就用到了。不過今天打算用yupoo的api來做相冊。發現xstream對于xmlnode的attribute解析支持不是那么的好。
    對于這種節點格式的非常的簡單
    <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的結果是這樣的
    <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);
    ????}
    }

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



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

    2007年1月18日更新。
    這里感謝網友 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);

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

    ? 上周更新了一下myblog,添加了一個Filter,做統計訪問用。可是后來發現出現亂碼問題了。找了很久都沒有找到問題。debug的時候看到 CharacterEncodingFilter確實是執行了。不過就是沒有效果。執行之前是ISO-8859-1編碼的,執行之后還是, 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 >

    ? 先經過那個統計的filter然后再經過編碼的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 >


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

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

    ????<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/)才發現原來是這個的問題。

    <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>

    創造共用協議:署名,非商業,保持一致?? 除經特別注明外,本文章版權歸莫多泡泡所有.
    署名,非商業用途,保持一致.???somebody(莫多)

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

    ??????我們的項目用到了xmlrpc,不過還是用的2.x版本的。由于xmlrpc3.x地推出。提供了NULL,Serializable等的支持,將原來的Hashtable改成了Map,Vector改成了List。都是不錯的進步。所以我們決定從xmlrpc2.x升級到xmlrpc3.x.
    ??????在spring里面有幾個ServiceExporter,org.springframework.remoting.rmi.RmiServiceExporter、org.springframework.remoting.caucho.HessianServiceExporter、org.springframework.remoting.caucho.BurlapServiceExporter。不過沒有xmlrpc的serviceExporter,原來我們是自己封裝的XmlRpcServer,用servlet提供服務。(eg:http://localhost:8080/community/service/xmlrpc)沒有和spring集成雖然用了spring。
    ??? 考慮到spring的便利以及配置的同意我決定將xmlrpcService放入spring中。xmlrpc3.x和xmlrpc2.x的代碼基本上沒有一樣的。改了很多東西。除了類型變化之外,還添加了對異常的支持。詳細信息請參照xmlrpc3.x源代碼。
    XmlRpcServiceExporter.java

    package ?com.jdkcn.xmlrpc;

    import ?javax.servlet.ServletException;

    /**
    ?*?
    @author ?<a?href="mailto:rory.cn@gmail.com">somebody</a>
    ?*?
    @since ?2006-9-27?03:59:22?pm
    ?*?
    @version ?$Id?XmlRpcServiceExporter.java$
    ?
    */
    public ? class ?XmlRpcServiceExporter? extends ?RemoteExporter? implements
    ????????Controller,?InitializingBean?{
    ????
    ????
    private ?XmlRpcServletServer?server;
    ????
    ????
    public ?String?serviceName;
    ????
    ????
    public ?Resource?configFile;
    ????
    ????
    public ?Boolean?enabledForExtensions;
    ????
    ????
    public ? void ?setEnabledForExtensions(Boolean?enabledForExtensions)?{
    ????????
    this .enabledForExtensions? = ?enabledForExtensions;
    ????}

    ????
    public ? void ?setConfigFile(Resource?configFile)?{
    ????????
    this .configFile? = ?configFile;
    ????}

    ????
    public ?String?getServiceName()?{
    ????????
    return ?serviceName;
    ????}

    ????
    public ? void ?setServiceName(String?serviceName)?{
    ????????
    this .serviceName? = ?serviceName;
    ????}

    ????
    public ?XmlRpcServletServer?getXmlRpcServletServer()?{
    ????????
    return ?server;
    ????}
    ????
    ????
    /* ?(non-Javadoc)
    ?????*?@see?org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet.http.HttpServletRequest,?javax.servlet.http.HttpServletResponse)
    ?????
    */
    ????
    public ?ModelAndView?handleRequest(HttpServletRequest?request,
    ????????????HttpServletResponse?response)?
    throws ?Exception?{
    ????????
    if ?( ! WebContentGenerator.METHOD_POST.equals(request.getMethod()))?{
    ????????????
    throw ? new ?ServletException( " XmlRpcServiceExporter?only?supports?POST?requests " );
    ????????}
    ????????server.execute(request,?response);
    ????????
    return ? null ;
    ????}

    ????
    /* ?(non-Javadoc)
    ?????*?@see?org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
    ?????
    */
    ????
    public ? void ?afterPropertiesSet()? throws ?Exception?{
    ????????server?
    = ? new ?XmlRpcServletServer();
    ????????server.setHandlerMapping(newXmlRpcHandlerMapping());
    ????????
    if ?(enabledForExtensions != null )?{
    ????????????((XmlRpcServerConfigImpl)?server.getConfig()).setEnabledForExtensions(enabledForExtensions.booleanValue());
    ????????}
    ????????
    ????}

    ????
    /** ?Creates?a?new?handler?mapping.?The?default?implementation?loads
    ?????*?a?property?file?from?the?resource
    ?????*?
    ?????
    */
    ????
    protected ?XmlRpcHandlerMapping?newXmlRpcHandlerMapping()? throws ?XmlRpcException?{
    ????????
    ????????SpringHandlerMapping?mapping?
    = ? new ?SpringHandlerMapping(getServiceInterface());
    ????????mapping.addHandler(getServiceName(),?getServiceInterface());
    ????????mapping.setTagetObject(getProxyForService());
    ????????
    return ?mapping;
    ????}
    ????
    }

    spring配置文件
    ????<bean?id="accountService"??class="com.jdkcn.service.impl.AccountServiceImpl">
    ????
    </bean>
    ????????
    <bean?name="rpcAccountService"?class="com.jdkcn.xmlrpc.XmlRpcServiceExporter">
    ????????
    <property?name="service">
    ????????????
    <ref?bean="accountService"/>
    ????????
    </property>
    ????????
    <property?name="serviceName">
    ????????????
    <value>jdkcn.accountService</value>
    ????????
    </property>
    ????????
    <property?name="enabledForExtensions">
    ????????????
    <value>true</value>
    ????????
    </property>
    ????????
    <property?name="serviceInterface">
    ????????????
    <value>com.jdkcn.service.AccountService</value>
    ????????
    </property>
    ????
    </bean>
    然后映射一個地址就可以通過xmlrpc訪問服務了
    ????<bean?id="urlMapping"?class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    ????????
    <property?name="mappings">
    ????????????
    <props>?
    ????????????????
    <prop?key="/account">rpcAccountService</prop>
    ????????????
    </props>
    ????????
    </property>
    ????
    </bean>
    web.xml
    ????<context-param>
    ????????
    <param-name>contextConfigLocation</param-name>
    ????????
    <param-value>
    ????????????classpath:spring/global.xml
    ????????
    </param-value>
    ????
    </context-param>
    ????
    ????
    <listener>
    ????????
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    ????
    </listener>

    ????????
    <servlet>
    ????????????
    <servlet-name>service</servlet-name>
    ????????????
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    ????????
    </servlet>

    ????????
    <servlet-mapping>
    ????????????
    <servlet-name>service</servlet-name>
    ????????????
    <url-pattern>/service/xmlrpc3/*</url-pattern>
    ????????
    </servlet-mapping>
    然后我們的service地址就是這樣的http://localhost:8080/service/xmlrpc3/account

    希望對大家有用,這里提供project下載。包含一個client程序。com.jdkcn.xmlrpc.Client

    點擊下載完整代碼

    創造共用協議:署名,非商業,保持一致?? 除經特別注明外,本文章版權歸莫多泡泡所有.
    署名,非商業用途,保持一致.???somebody(莫多)
    posted @ 2006-10-22 16:12 莫多 閱讀(2181) | 評論 (0)編輯 收藏

    <2006年10月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    常用鏈接

    留言簿(1)

    隨筆分類(27)

    隨筆檔案(22)

    Friends

    搜索

    •  

    積分與排名

    • 積分 - 62211
    • 排名 - 845

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: jizz在线免费观看| 黄色免费网址在线观看| 久久99精品国产免费观看| 亚洲情侣偷拍精品| 国产裸体美女永久免费无遮挡| 国产精品免费视频一区| 国产亚洲精品美女| 亚洲一级片免费看| 四虎影视无码永久免费| 亚洲AV无码国产在丝袜线观看| 未满十八18禁止免费无码网站| 91亚洲国产成人精品下载| 免费一级成人毛片| 亚洲一卡2卡三卡4卡有限公司| 99免费在线观看视频| 亚洲成人网在线播放| 狼友av永久网站免费观看| 免费福利资源站在线视频| 中文字幕第一页亚洲| 100部毛片免费全部播放完整| 亚洲国产成人精品久久| 午夜视频在线观看免费完整版| 国产精品亚洲专区在线播放| 久久亚洲色一区二区三区| 99国产精品免费视频观看| 亚洲精品GV天堂无码男同| 亚洲第一福利网站在线观看| 久久午夜无码免费| 亚洲乱理伦片在线观看中字| 国产精品亚洲mnbav网站| 2021国内精品久久久久精免费| 亚洲熟妇无码八V在线播放| 亚洲男人第一无码aⅴ网站| 91短视频在线免费观看| 亚洲第一se情网站| 久久久久亚洲精品美女| 麻豆精品国产免费观看| 日本免费久久久久久久网站| 亚洲国产精品精华液| 亚洲AV区无码字幕中文色| 国产麻豆剧传媒精品国产免费|