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) |
編輯 收藏
不知道大家有沒有碰到,還是沒有這種需求。就是用like來查詢,我們沒有用Lucene,Compass這種全文索引的方案,我們只是簡單的添加%進行like查詢。用戶搜索的時候就使用*和?來代表任意和一個。所以要對"%"和"_"進行轉義,我們使用的是oracle數據庫。sql語句看起來可能是這樣的。
SELECT?*?FROM?t_user?where?nickname?like?'%Goo\_D'?escape?'\'
這里對_進行轉義了。因為用戶昵稱包含下劃線,如果不進行轉義就表示一個任意字符。有時候我們可能還需要對%進行轉義。同樣的方法在%前加\% 但是比起普通的like語句。多了一個聲明轉義符的語句。所以我們會想到這樣的語句
DetachedCriteria?criteria?=?DetachedCriteria.forClass(User.class);
criteria.add(Restrictions.like("nickname",?user.getNickname()+"'?escape'\"));
但是這樣是不管用的。
接下來可能會想到使用Hibernate3的原生sql查詢,其實我們不需要這樣做。我們還是使用Criteria條件查詢。
criteria.add(Restrictions.sqlRestriction("{alias}.nickname?like???escape'/'",?StringUtil.escapeSQLLike(user.getNickname()),?Hibernate.STRING));
這樣Hibernate產生的語句就是我們想要的語句了。
????/**
?????*?轉義like語句中的
?????*?<code>'_'</code><code>'%'</code>
?????*?將<code>'?'</code>轉成sql的<code>'/_'</code>
?????*?將<code>'%'</code>轉成sql的<code>'/%'</code>
?????*?<p>
?????*???例如搜索<code>?aa*bb?c_d%f</code>將轉化成<br/>
?????*???<code>_aa%bb_c/_d/%f</code>
?????*?</p>
?????*?@param?likeStr
?????*?@return
?????*?@author?<a?href="http://jdkcn.com">somebody</a>
?????*/
????public?static?String?escapeSQLLike(String?likeStr)?{
????????String?str?=?StringUtils.replace(likeStr,?"_",?"/_");
????????str?=?StringUtils.replace(str,?"%",????"/%");
????????str?=?StringUtils.replace(str,?"?",?"_");
????????str?=?StringUtils.replace(str,?"*",?"%");
????????return?str;
????}

?? 除經特別注明外,本文章版權歸
莫多泡泡所有.
署名,非商業用途,保持一致.???
somebody(莫多)
posted @
2006-10-16 23:29 莫多 閱讀(2491) |
評論 (1) |
編輯 收藏
? jspark 的這篇文章《開發階段eclipse下面的spring容器的啟動優化 》講到如何加快spring的啟動速度。非常感謝jspark. 一下是引用的原文:
? 最近在負責一個大項目,項目組成員包括項目經理大概10個人左右。項目技術用struts+spring+hibernate實現。項目的規模相對來說是比較大的,總共有10大模塊,每個大模塊又分為有十幾個、甚至幾十個小模塊。開發工具用eclipse,由于在開發階段,項目開發成員需要頻繁重啟服務器。在啟動服務器的時候,每次啟動時間總是會超過1分鐘。記得以前在做另外一個項目時,啟動時間不到5秒鐘,相差了10倍,而且項目規模是差不多的。
??? 從初步分析來說,應該是hibernate解釋hbm.xml時花費時間,或者可能是spring容器啟動并解釋所有的bean配置文件。診斷了一下,發現1分鐘消耗的時間主要分布在hibernate解釋hbm.xml花費5秒;spring容器從啟動到解釋bean配置文件竟然花了58秒,真是太囂張了。當時非常懷疑spring的效率問題。企圖從網上搜索相關資料,看看有什么優化措施。
??? 首先是找到了hibernate的啟動優化 http://www.hibernate.org/194.html? 里面的主要思想是通過將xml序列花到本地的文件里,每次讀取的時候根據情況,從本地文件讀取并反序列化,節省了hibernate xml的解析時間。按照這個方式測試了一下,發現hibernate的啟動時間從5秒降低到3秒,但是這個優化對于整個啟動過程是杯水車薪的,毫無用處。
??? 沒辦法,又仔細查看了spring的資料,終于發現spring的容器是提供了lazy-load的,即默認的缺省設置是bean沒有lazy- load,該屬性處于false狀態,這樣導致spring在啟動過程導致在啟動時候,會默認加載整個對象實例圖,從初始化ACTION配置、到 service配置到dao配置、乃至到數據庫連接、事務等等。這么龐大的規模,難怪spring的啟動時間要花將近1分鐘。嘗試了一下,把beans的 default-lazy-init改為true就,再次啟動,速度從原來的55秒,降到8秒鐘!!Great!雖然是非常小一個改動,但是影響確實非常大。一個項目組10個人,假若每個人一天平均需要在eclipse下啟動測試服務器50次。那么一天項目組需要重啟500次,每次節省50秒的話,就是 25000秒,將近幾個小時,差不多一個工作日,多么可觀的數字!
?? 不過在運行期間第一次點頁面的時候,由于spring做了lazy-load,現在就需要啟動一部分需要的beans,所以稍微慢2-3秒鐘,但是明顯比等幾十秒要快很多,值得一鑒。
??? 以上是針對開發階段的spring容器啟動優化,在部署到實際環境中,倒是沒必要設置為lazy-load。畢竟部署到實際環境中不是經常的事,每次啟動1分鐘倒不是大問題。
我這里要提醒的是不是說有的beans都能設置default-lazy-init成為true.對于scheduler的bean不能用lazy-init
<
beans?
default-lazy-init
="true"
>
????
????
<
bean?
class
="org.springframework.scheduling.quartz.SchedulerFactoryBean"
>
????????
<
property?
name
="triggers"
>
????????????
<
list
>
????????????????
<
ref?
bean
="buildHtmlTrigger"
/>
????????????????
<
ref?
bean
="askTrigger"
/>
????????????????
<
ref?
bean
="mailSenderTrigger"
/>
????????????????
<
ref?
bean
="topicDetailBuildTrigger"
/>
????????????????
<
ref?
bean
="forumBuildTrigger"
/>
????????????????
<
ref?
bean
="topicBuildTrigger"
/>
????????????
</
list
>
????????
</
property
>
????
</
bean
>
</
beans
>
這樣的話。所有的scheduler就都不管用了。所以請大家要注意。
<
beans
>
????
????
<
bean?
class
="org.springframework.scheduling.quartz.SchedulerFactoryBean"
>
????????
<
property?
name
="triggers"
>
????????????
<
list
>
????????????????
<
ref?
bean
="buildHtmlTrigger"
/>
????????????????
<
ref?
bean
="askTrigger"
/>
????????????????
<
ref?
bean
="mailSenderTrigger"
/>
????????????????
<
ref?
bean
="topicDetailBuildTrigger"
/>
????????????????
<
ref?
bean
="forumBuildTrigger"
/>
????????????????
<
ref?
bean
="topicBuildTrigger"
/>
????????????
</
list
>
????????
</
property
>
????
</
bean
>
</
beans
>
?
posted @
2006-08-10 10:59 莫多 閱讀(3319) |
評論 (2) |
編輯 收藏
???? 雖然項目全部采用了UTF-8編碼,所有的源文件*.java,*.jsc,*.html,*.ftl都采用了UTF-8編碼。可是還是出現了亂碼問題。很是不爽,后來找到了tomcat,和resin的配置。
- Tomcat的配置。(conf/server.xml)
????<!--?Define?a?non-SSL?HTTP/1.1?Connector?on?port?8080?-->
????<Connector?port="80"?maxHttpHeaderSize="8192"
???????????????maxThreads="150"?minSpareThreads="25"?maxSpareThreads="75"
???????????????enableLookups="false"?redirectPort="8443"?acceptCount="100"
???????????????connectionTimeout="20000"?disableUploadTimeout="true"?URIEncoding="UTF-8"/>
- Resin的配置。(conf/resin.conf)
character-encoding | Resin 1.1 |
child of: resin, server, host-default, host, web-app-default, web-app
default: The default value is ISO-8859-1.
Specifies the default character encoding for the environment.
<web-app id='/'>
<character-encoding>shift_jis</character-encoding>
...
</web-app>
|
???? 這個是resin doc里面的我是在web-app-default里面加上了encoding的配置
????
<
web-app-default
>
??????
<
character-encoding
>
UTF-8
</
character-encoding
>
??????
????
</
web-app-default
>
希望對你的項目有幫助。
?? 除經特別注明外,本文章版權歸莫多泡泡所有.
署名,非商業用途,保持一致.???somebody(莫多)??
posted @
2006-07-22 18:13 莫多 閱讀(1842) |
評論 (4) |
編輯 收藏
項目中多個項目需要同時引用一個靜態資源,所以就想到配置不同的虛擬目錄指到同一個目錄。于是有下面的配置:
????<!--?configures?the?default?host,?matching?any?host?name?-->
????<host?id=""?root-directory=".">
??????<!--
?????????-?configures?an?explicit?root?web-app?matching?the
?????????-?webapp's?ROOT
????????-->
??????<web-app?id="/"?document-directory="webapps/ROOT"/>
??????<web-app?id="/community/jsvm2"?document-directory="D:\\projects\\FelooComponents\\jsvm2"/>
??????<web-app?id="/passport/jsvm2"?document-directory="D:\\projects\\FelooComponents\\jsvm2"/>
????</host>
?????? 但是發現這樣只有后面一個管用(http://localhost:8080/passport/jsvm2)這個是可以,可是(http://localhost:8080/community/jsvm2)就不行,很是郁悶。只要后面的document-directory不是同一個目錄就成。
?????? 后來在resin的doc里面看到path的配置
path-mapping
child of: web-app-default, web-app
Maps url patterns to real paths. If using a server like IIS, you may need to match the server's path aliases.
Attribute | Meaning | default |
---|
url-pattern | A pattern matching the url: /foo/*, /foo, or *.foo |
url-regexp | A regular expression matching the url |
real-path | The prefix of the real path. When used with url-regexp, allows substitution variables like $1. |
<web-app id='/'>
<path-mapping url-pattern='/resin/*'
real-path='e:\resin'/>
<path-mapping url-regexp='/~([^/]*)'
real-path='e:\home$1'/>
</web-app>
|
改正這樣的配置就ok了。
????????<web-app?id="/community"?document-directory="D:\\projects\\FelooCommunityWeb">
??????????<path-mapping?url-pattern='jsvm2/*'
??????????????real-path='D:\\projects\\FelooComponents\\jsvm2'/>
??????</web-app>
??????
????????????<web-app?id="/passport"?document-directory="D:\\projects\\FelooPassportWeb">
??????????<path-mapping?url-pattern='jsvm2/*'
??????????????real-path='D:\\projects\\FelooComponents\\jsvm2'/>
??????</web-app>

?? 除經特別注明外,本文章版權歸
莫多泡泡所有.
署名,非商業用途,保持一致.???somebody(莫多)
posted @
2006-07-18 19:41 莫多 閱讀(2901) |
評論 (0) |
編輯 收藏
自從換工作之后就沒有研究過DWR了。下載了最新的DWR2.0M2版本。2.0加了很多東西,也有不少變化的地方。最容易看到的變化就是包名的變化了,由 uk.ltd.getahead 變成了 org.directwebremoting 。
?????? ?換上了新的配置
????
<
servlet
>
????????
<
servlet-name
>
dwr-invoker
</
servlet-name
>
????????
<
servlet-class
>
org.directwebremoting.servlet.DwrServlet
</
servlet-class
>
????????
<
init-param
>
??????????
<
param-name
>
debug
</
param-name
>
??????????
<
param-value
>
true
</
param-value
>
????????
</
init-param
>
????????
<
load-on-startup
>
1
</
load-on-startup
>
????
</
servlet
>
啟動服務,抱錯了。
java.lang.IllegalArgumentException: DefaultContainer can't find a classes
? ? ? ?at org.directwebremoting.impl.DefaultContainer.getBean(DefaultContainer.java:216)
? ? ? ?at org.directwebremoting.annotations.AnnotationsConfigurator.configure(AnnotationsConfigurator.java:50)
? ? ? ?at org.directwebremoting.servlet.DwrServlet.init(DwrServlet.java:121)
????? 在DWR的Maillist里面搜索了一下,還有答案,原來DWR2.0 加入了JDK5的注釋(annotations).DwrServlet初始化的時候會去檢查注釋的類,找不到就抱錯了。如果你不用annotations也可以忽略掉這個錯誤。不過看起來總是不爽。有人提出了方案。這樣就ok了。
????
<
servlet
>
????????
<
servlet-name
>
dwr-invoker
</
servlet-name
>
????????
<
servlet-class
>
org.directwebremoting.servlet.DwrServlet
</
servlet-class
>
????????
<
init-param
>
??????????
<
param-name
>
debug
</
param-name
>
??????????
<
param-value
>
true
</
param-value
>
????????
</
init-param
>
????????
<
init-param
>
???????????
<
param-name
>
classes
</
param-name
>
???????????
<
param-value
>
java.lang.Object
</
param-value
>
????????
</
init-param
>
????????
<
load-on-startup
>
100
</
load-on-startup
>
????
</
servlet
>
?? 除經特別注明外,本文章版權歸莫多泡泡所有.
署名,非商業用途,保持一致.???somebody(莫多)??
posted @
2006-07-17 02:11 莫多 閱讀(2875) |
評論 (0) |
編輯 收藏
首先感謝JScud提供的好文章。《
使用FreeMarker生成Html靜態文件(實例)》
????? 在我們的項目中也用到了Freemarker生成靜態文件。不過這里我要說的是編碼的問題。我們的項目使用的都是UTF-8編碼,我直接使用 飛云小俠 提供的方法生成的文件在UTF-8編碼下察看是亂碼,而GBK正常(后來發現因為我用的中文操作系統所以用GBK查看正常)。
????? 當然我把Freemarker的配置都改成了UTF-8,我的模版文件也是UTF-8編碼的。下面是原來的代碼
????public?void?setTemplatePath(Resource?templatePath)?{
????????this.templatePath?=?templatePath;
????????//設置freemarker的參數
????????freemarkerCfg?=?new?Configuration();
????????try?{
????????????freemarkerCfg.setDirectoryForTemplateLoading(this.templatePath.getFile());
????????????freemarkerCfg.setObjectWrapper(new?DefaultObjectWrapper());
????????????freemarkerCfg.setDefaultEncoding("UTF-8");
????????}?catch?(IOException?ex)?{
????????????throw?new?SystemException("No?Directory?found,please?check?you?config.");
????????}
????}
????/**
?????*?生成靜態文件
?????*?@param?templateFileName?模版名稱eg:(biz/order.ftl)
?????*?@param?propMap?用于處理模板的屬性Object映射?
?????*?@param?htmlFilePath?要生成的靜態文件的路徑,相對設置中的根路徑,例如?"/biz/2006/5/"?
?????*?@param?htmlFileName?要生成的文件名,例如?"123.htm"?
?????*?@return
?????*/
????private?boolean?buildHtml(String?templateFileName,Map?propMap,?String?htmlFilePath,String?htmlFileName){
????????try?{
????????????Template?template?=?freemarkerCfg.getTemplate(templateFileName);
????????????template.setEncoding("UTF-8");
????????????//創建生成文件目錄
????????????creatDirs(buildPath.getFilename(),htmlFilePath);
????????????File?htmlFile?=?new?File(buildPath?+?htmlFilePath?+?htmlFileName);
????????????Writer?out?=?new?BufferedWriter(new?OutputStreamWriter(new?FileOutputStream(htmlFile)));
????????????template.process(propMap,out);
????????????out.flush();
????????????return?true;
????????}?catch?(TemplateException?ex){
????????????log.error("Build?Error"+templateFileName,ex);
????????????return?false;
????????}?catch?(IOException?e)?{
????????????log.error("Build?Error"+templateFileName,e);
????????????return?false;
????????}
????????
????}
下面是修改之后的代碼
????/**
?????*?生成靜態文件
?????*?@param?templateFileName?模版名稱eg:(biz/order.ftl)
?????*?@param?propMap?用于處理模板的屬性Object映射?
?????*?@param?htmlFilePath?要生成的靜態文件的路徑,相對設置中的根路徑,例如?"/biz/2006/5/"?
?????*?@param?htmlFileName?要生成的文件名,例如?"123.htm"?
?????*?@return
?????*/
????private?boolean?buildHtml(String?templateFileName,Map?propMap,?String?htmlFilePath,String?htmlFileName){
????????try?{
????????????Template?template?=?freemarkerCfg.getTemplate(templateFileName);
????????????template.setEncoding("UTF-8");
????????????//創建生成文件目錄
????????????creatDirs(buildPath.getFilename(),htmlFilePath);
????????????File?htmlFile?=?new?File(buildPath?+?htmlFilePath?+?htmlFileName);
????????????Writer?out?=?new?BufferedWriter(new?OutputStreamWriter(new?FileOutputStream(htmlFile),"UTF-8"));
????????????template.process(propMap,out);
????????????out.flush();
????????????return?true;
????????}?catch?(TemplateException?ex){
????????????log.error("Build?Error"+templateFileName,ex);
????????????return?false;
????????}?catch?(IOException?e)?{
????????????log.error("Build?Error"+templateFileName,e);
????????????return?false;
????????}
????????
????}
原因就在于OutputStreamWriter的不同構造方法
OutputStreamWriter(OutputStream?out)
??????????創建使用默認字符編碼的 OutputStreamWriter。
OutputStreamWriter(OutputStream?out, String?charsetName)
??????????創建使用指定字符集的 OutputStreamWriter。
?這個是中文JDK的文檔說明,剛開始我使用默認的構造函數,所以使用了系統默認的編碼,GBK,所以在生成靜態文件的時候把UTF-8內容用GBK編碼寫入了,所以在UTF-8下瀏覽就有問題。
還有關于修改模版文件同樣也要注意這個問題。
????public?String?loadTemplate(String?templateName)?{
????????StringBuffer?sb?=?new?StringBuffer();
????????try?{
????????????File?file?=?new?File(templatePath+"/"+templateName);
????????????BufferedReader?reader?=?new?BufferedReader(new?InputStreamReader(new?FileInputStream(file),"UTF-8"));
????????????String?line?=?reader.readLine();
????????????while(line?!=?null)????{
????????????????sb.append(line);
????????????????sb.append("\r\n");
????????????????line?=?reader.readLine();
????????????}
????????????reader.close();
????????}?catch?(IOException?e)?{
????????????throw?new?SystemException("Loading?template?Error:",e);
????????}
????????return?sb.toString();
????}
????public?void?saveTemplate(String?templateName,?String?templateContent)?{
????????try?{
????????????File?file?=?new?File(templatePath?+?"/"?+?templateName);
????????????Writer?out?=?new?BufferedWriter(new?OutputStreamWriter(new?FileOutputStream(file),"UTF-8"));
????????????out.write(templateContent);
????????????out.flush();
????????????//扔出templatesave事件
????????????TemplateSaveEvent?evt?=?new?TemplateSaveEvent();
????????????evt.setTemplateName(templateName);
????????????dispatchTemplateEvent(evt);
????????}?catch?(IOException?e)?{
????????????throw?new?SystemException("Write?template?Error",e);
????????}
????}
|
posted @
2006-06-21 10:46 莫多 閱讀(2863) |
評論 (0) |
編輯 收藏