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日更新。
這里感謝網友 ?的提示。原來新版的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.
Attribute | Possible Value | Explanation |
---|
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). |
wildcard | All 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. |
null | Do 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. |
true | The 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. |
true | The 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) |
編輯 收藏