2011年6月3日 星期五

spring 使用 application 中定義的 properties

問題:
在applicationContext 中常會設定一個properties 來載入一些設定檔
通常是
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
.....
</bean>

但發現 這個 PropertyPlaceholderConfigurer 類別不提供它的 java.util.Properties 讓我們用。
但是它的父類別org.springframework.core.io.support.PropertiesLoaderSupport 有提供一個protected method
protected Properties mergeProperties() throws IOException

所以這邊提供一種做法是,自己寫一個Class 繼承 PropertiesLoaderSupport ,然後裡面提供一個method

public class MyPropertyPlaceholderConfigurer extends
  PropertyPlaceholderConfigurer {

  Properties mergedProperties;

   public Properties getMergedProperties() throws IOException {
     if (mergedProperties == null) {

       mergedProperties = mergeProperties();

     }
     return mergedProperties;

   }
}

然後 applicationContext 裡的 propertyConfigurer設定改成
<bean id="propertyConfigurer" class="MyPropertyPlaceholderConfigurer">

......
這樣就可以在之後使用這個bean 取得 properties

由Spring 取得 Jboss JNDI datasource

問題:非一般由web container 取得JDNI 的方式。而是一隻獨立程式需要存取DB,要從JBoss取得JNDI datasource 。
解決方式:

在 applicationContext中
原本會有


...
 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
<property name="dataSource" ref="jdbcDataSource"/>
</bean>
<bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource"
...>
...
這是使用jdbc的方式連的

加上
<bean id="jndidataSource"  class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="your_JNDI_name"/>
<property name="resourceRef" value="false"/>
<property name="jndiTemplate" ref="jndiTemplate" />
</bean>
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
<prop key="java.naming.provider.url">jnp://your_JBoss_IP:1099</prop>
<prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</prop>
<prop key="jnp.disableDiscovery">true</prop>
</props>
</property>


然後在執行這隻獨立的jar 檔時,加上jboss 的jar 檔到 classpath中

for example:
java  -cp /...[jboss home].../jboss-as/client/jbossall-client.jar:yourJarFile.jar your.main.class
不過這個方式要JDNI,好久啊~久到爆炸,在自己的localhost 跑都要超過兩分鐘 orz

Cron Job 出現亂碼問題

問題: java file 丟到 linux 下執行有遇到io處理都好好的。但同一隻程式用 cron job 跑,有io 的部份就出現亂碼。

解決方法:
example.sh 範例
LC_ALL=zh_TW.UTF-8
LANG=zh_TW.UTF-8
/....[java path]..../java -Dfile.encoding=UTF-8 -jar yourJava.jar


這樣就能解決IO出現亂碼的問題了。

2011年5月11日 星期三

sybase SQL 取得當週星期一(get Monday)

背景說明:要取得當周第一天。(通常系統都是把星期天設為當週第一天)所以一般來說,只要呼叫一個 類似  weekday 之類的函數得出目前是 當周的第 n 天,然後把目前日減掉 n即可。

問題: 以星期一做為一周的第一天。帶入日期取得當週第一天。
原本將日期帶入 weekday 的函數得到的 數字  1~7 直接減的話,得到的日期是星期天。

2011年5月10日 星期二

jQuery UI datepicker 1.8.12 日期輸入限制

jQuery UI datepicker 很方便的讓一個input element 可以有calendar做為協助輸入的ui,不過有時候,要validate 輸入的日期資料時,理想的方式之一就是不要讓不想輸入的資料出現。
舉例來說,如果只想讓使用者輸入 星期一 的日期,其它的日期都不要出現的話。該怎麼做?