2011年6月24日 星期五

Final Fantasy XIII 感想

(圖片來自http://www.square-enix.co.jp/fabula/ff13/)


其實已經破關一段時間了, 看到 FF XIII-2 快出了, 來寫一下心得.


玩到遊戲中期(尤其是 Snow 救 Hope 那段)時, 感覺這也許是繼 FF VIII、FF X之後, 讓我再次喜歡上 FF 的一款遊戲.


戰鬥系統很棒, 雖然玩到後來, 喜歡的陣形跟攻擊模式大致會固定. 但遇到某些特定敵人仍不得不改變戰略. 讓佔 rpg 遊戲最多時間的戰鬥玩起來一點也不枯燥乏味. GJ.


萬萬沒想到, 後來整個爛尾啊...前面鋪陳繭與下界的恩怨情仇都是假的, 反正衝進去幹掉最後頭目就對了...更...


我猜也許是因為要順應 online game 的風潮, 所以主線弄比較短, 但任務很多...

這是本末倒置了...


對 FF XIII - 2 不抱什麼期待~~~

到頭來,我們記住的,不是敵人的攻擊,而是朋友的沉默

最近很多人轉的影片.

片中那位德佬真是令人感動.

除了引用聖經請服務生 Don't Judge 外.

也用馬丁.路德.金的名言"到頭來,我們記住的,不是敵人的攻擊,而是朋友的沉默"來鼓勵那家人.

查了原文是 In the end, we will remember not the words of our enemies but the silence of our friends

太帥了~~~

2011年6月20日 星期一

Spring + Proxool 注意

今天把 tomcat 6 的 jdk 從 1.5 換成 1.6 後, 怪事發生了.
一直出現 java.sql.SQLException: org.logicalcobwebs.proxool.ProxoolException: Attempt to refer to a unregistered pool by its alias 'proxool_pool'

這問題之前遇過, 是因為 web.xml 中 servlet load-on-startup 順序沒設定好造成的.
<servlet>
<servlet-name>proxoolServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
    <param-name>xmlFile</param-name>
    <param-value>WEB-INF/config/proxool.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>

怎麼只換了個 jdk 又沒改 xml 卻又發生了?

2011年6月15日 星期三

如何在新增資料後取得自動遞增的主鍵值? How to retrieve the auto-generated database key

自動遞增(ex: mysql 的 auto increment)的主鍵(Primary key)值, 如何在新增(insert)一筆資料後, 取得剛新增的資料鍵值呢?

Spring 的 NamedParameterJdbcTemplate 的 int update(String sql, SqlParameterSource paramSource, KeyHolder generatedKeyHolder) , 可於新增後取得鍵值.

這裡有範例.


2011年6月10日 星期五

Spring 3 + 檔案下載 (file download / export file)

網路上看到的文件都是在講怎麼處理 pdf or excel 的檔案,
但如果是要給使用者下載 jpg or txt 檔該怎麼做呢?

今天試了一下, 其實還滿簡單的. 繼承 AbstractView 即可.
下面是示範的程式碼:

2011年6月9日 星期四

Spring + Json

為了使用Json, 今天在spring xml 加入下面的設定,

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="xml" value="text/xml" />
            <entry key="htm" value="text/html" />
            <entry key="html" value="text/html" />
        </map>
    </property>
    <property name="defaultContentType" value="text/html" />
    <property name="viewResolvers">
        <list>
            <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="requestContextAttribute"><value>rc</value></property>
                <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
                <property name="prefix" value="/WEB-INF/jsp/"/>
                <property name="suffix" value=".jsp"/>
            </bean>
        </list>
    </property>
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
        </list>
    </property>
    <property name="ignoreAcceptHeader" value="true" />
</bean>


卻出現 exception 如下
Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.view.ContentNegotiatingViewResolver#0' defined in ServletContext resource [/WEB-INF/config/webmvc-config.xml]: Cannot create inner bean 'org.springframework.web.servlet.view.json.MappingJacksonJsonView#17b0998' of type [org.springframework.web.servlet.view.json.MappingJacksonJsonView] while setting bean property 'defaultViews' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.view.json.MappingJacksonJsonView#17b0998' defined in ServletContext resource [/WEB-INF/config/webmvc-config.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.servlet.view.json.MappingJacksonJsonView]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper
...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.view.json.MappingJacksonJsonView#17b0998' defined in ServletContext resource [/WEB-INF/config/webmvc-config.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.servlet.view.json.MappingJacksonJsonView]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper


是因為少了Jackson Library的關係, 可按此下載


Json 簡單的範例如下:
Java Code
@RequestMapping(value={"JsonTester"})
@ResponseBody
public ObjectNode jsonTester() {
    ObjectNode rootNode = new ObjectMapper().createObjectNode();
    rootNode.put("result", true);


    return rootNode ;
}

html code(via jQuery)
$(document).ready(function() {
    $.post("JsonTester.json",function(data) {
        if (data.result) {
           alert("成功");
        } else {
            alert("失敗");
       }
    });
});


@ResponseBody會依據收到的的 Accept Header 自動將回傳物件轉為客戶端可接受的型態.
此例會將 Java 物件轉為 Json 物件.

Spring 內建了數種轉換物件, 詳情可參考 Spring 說明文件


以下為回傳HashMap的範例:

Java Code:
@RequestMapping(value={"GetMap"})
@ResponseBody
public ObjectNode getMap(String inputValue) {
ObjectNode rootNode = new ObjectMapper().createObjectNode();


HashMap<String, String> result = myService.getMap(inputValue);
rootNode.put("result", true);
rootNode.putPOJO("myMap", result);


return rootNode ;
}



html code (via jQuery):
$.getJSON("GetMap.json", {inputValue: variable }, function(data) {
        if (data.result) {
            $.each(data.myMap, function(key, value){
                alert(key + "-" + value) ;
            });
        } else {
            alert("Get Map failed");
        }
})



ContentNegotiatingViewResolver 會依據
1. URL 的結尾(extension)

2. Accept header

3. 以上都沒有辦法判斷的話, 使用 defaultContentType

來判斷 request 的要求是那一種型態.



2011年6月7日 星期二

mysql 中文亂碼問題

網路上大多文章是說, 在 my.ini 中加入下面幾行.
[mysqld]
default-character-set=utf8

[client]
default-character-set=utf8


但我加了後卻出現:
mysqld: unknown variable 'default-character-set=utf8'

原來是 [mysqld] 中的default-character-set已廢棄不用了, 改成下面這行即可.

character-set-server=utf8