星期一, 4月 30, 2007

Spring Framework 筆記 (二)

從上面一個 hello 例子應該很難感覺出 Spring 的迷人之處在哪,所以接著就從上面的例子,我們再做一些改進。在上面的例子裡面,要呈現的 hello.jsp 檔案是寫死在 SpringappController 程式裡的,這在以後的程式維護上會缺少彈性,另外除此之外,Web View 部分也同樣可以在 Spring 的設定檔裡面做設定。

 

首先我們先把 SpringappController 裡面的 hello.jsp 透過 Spring 來做管理。Spring Framework 裡面最重要的概念就是 IoC (or Dependences Injection),所以我們在這邊使用 Setter Injection 的方式,在設定檔裡面來做參數的設定:


<bean id="springappController" class="com.esolution.Controller.SpringappController">
<property name="viewFileName">
<value>hello.jsp</value>
</property>

</bean>


 





但是我們希望可以在更簡化一點,可以只單純的使用一個代數方式來表現,不需要每次都要把路徑以及副檔名都寫上。因此這邊我們使用 Spring ViewResolver 來簡化設定:


 


<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">

<value>org.springframework.web.servlet.view.JstlView</value>
</property>
<property name="prefix">
<value>/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>




如上面設定所示,加入了 prefix 以及 suffix property 讓 springappController 可以只用 hello 就可以代表 /hello.jsp,除此之外,上面的設定也指定使用 JSTL 來當作 View 端的呈現方式。(若是要使用其他種的 Presentation 方式,只需要在這邊做設定)。


而原本的 springappContoller 設定就轉變為:



<bean id="springappController" class="com.esolution.Controller.SpringappController">
<property name="viewFileName">
<value>hello</value>
</property>
</bean>



如同上面提到的,我們使用 setter injection 來控制,所以現在我們需要在 springappController.java 上面加入 viewFileName property,讓 Spring 可以把 viewFileName 指定給 springappContoller。


 

package com.esolution.Controller;

import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

 


public class SpringappController implements Controller {

private String viewFileName;
/** Logger for this class and subclasses */
protected final Log logger = LogFactory.getLog(getClass());


public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


logger.info("SpringappController - returning hello view");

String now = (new java.util.Date()).toString();
return new ModelAndView(getViewFileName(), "now", now);
}


public String getViewFileName() {
return viewFileName;
}

 


public void setViewFileName(String viewFileName) {
this.viewFileName = viewFileName;
}


}



 


 


現在若是需要變動 view 的部分,原本的 springappContoller 就可以不需要做任何的變動,只需要去改變 spring 設定檔即可。


More......

星期日, 4月 29, 2007

Spring Framework 筆記 (一)

當你要開發一個系統的時候,除非只是一個很小的系統,否則搭配一個適合的 Framework 可以簡化你以後開發的速度。例如在 Windows Application 開發上有微軟的 MFC 或 Borland 的 VCL,而在 Web Application 開發上也有不少的 Framework 可以使用。目前比較常被提到的有 Struts、JSF、Spring Framework、WebWork ,而我現在主要就是要以 Spring Framework 來開發系統。

JSF 是我之前拿來開發過一個政府案子的一個 Framework,JSF 最常被拿來跟 Struts 做比較,因為這兩個 Framework 有很多相似的地方,但是 JSF 是屬於由 Sun 官方 Support 的,而 Struts 是由 Jakarta 所 Support。當初會選擇使用 JSF 的主要原因就是因為這是由 Sun 所支援,代表說其他的一些 Java 廠商也會跟著 Support。不過目前網路上使用 Struts Framework 的網站還是比 JSF 多很多。

每一個 Framework 都有其優缺點,所以我個人會傾向於找一個彈性比較大,容易跟其他 Framework 整合的 Framework,而 Spring Framework 就是這樣的一個 Framework。Spring Framework 並不只限於開發 Web Application,你也可以拿 Spring Framework 來開發 Windows Application。

底下是 Spring Framework 的一個架構圖,最重要的就是底層的 Spring Core 核心容器,用來定義了建立、配置和管理 bean 的方式。Spring 擁有自己的 Web MVC、Spring ORM,但是它也可以跟其他的 Framework搭配,也可以跟其他的 ORM 搭配 (例如:Hibernate) ,Spring Framework 就是這麼的彈性。

網路上有不少的 Spring Framework 介紹,包括 Spring Framework 的源由、IoC 概念以及 AOP 等等,所以有興趣的人可以直接從 google 上去找尋到這些資料,這篇文章就直接先從最基本的 hello 程式開始。首先先瞭解一下 Spring Framework 在 Web Application 上的處理流程大概如下圖所示:

 

所有的 request 都會先經過 Front Controller,再 dalegate 給適當的 Controller,而 Controller 會再回傳到對應的 View Template。

 1. 下載 Spring Framework 檔案

Spring Framework 的下載位置在這邊,spring-famework-xxx-with-dependencies.zip 是包含其他一些會有到的 pacakages 全部都打包在一起了,若沒什麼特殊,可以直接下載這個檔案,解開之後,把 spring.jar、log4j.jar 以及 common-logging.jar copy 到 springapp/WEB-INF/lib 下 (假設這個 web-application 叫做 springapp)

2. 修改 web.xml 檔案

 Spring Framework 使用一個 Dispatch Servlet 當作所有 request 的入口 (Front Controller),所以得要在 web.xml 指定,如下圖所示。另外在 servlet-mapping 中也指定所有的 *.htm 檔案都會由 Spring Framework 處理。

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>

<web-app>

<servlet>
<servlet-name>springapp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>

<taglib>
<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>

</web-app>

 

 

3. 新增 spring 設定檔案

因為在上述的 web.xml 檔案中,我們設定了 Dispatch Servlet 的名字為 springapp,所以 spring 的設定檔案名稱是 springapp-servlet.xml (也可以指定其他的檔案名稱,但是得要額外設定)。內容大致如下:

在 Spring 設定檔案中最主要就是要設定 bean 的資料,首先我們需要設定一個 url mapping 的 bean 來設定哪些 request 需要給哪一個 handler 來處理。Spring 已經內建了幾個常用的 url mapping 機制,在底下我使用的是 SimpleUrlHandlerMapping,作用就只是單純的把 /hello.htm 的 request 丟給 springappController 處理。 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.htm">springappController</prop>
</props>
</property>
</bean>

<bean id="springappController" class="com.esolution.Controller.SpringappController"/>
</beans>

 

 

 4. 撰寫對應的 bean 程式

因為上述的設定需要一個 springappController 程式來處理由 /hello.htm 的 requestM,因此我新增了一個 springappController 的 bean,然後它的 class 資料如下:(com.esolution.Controller.SpringappController)



public class SpringappController implements Controller {

/** Logger for this class and subclasses */
protected final Log logger = LogFactory.getLog(getClass());

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

logger.info("SpringappController - returning hello view");

String now = (new java.util.Date()).toString();

return new ModelAndView("hello.jsp", "now", now);
}
}


 


 


這個程式主要需要撰寫的部分在 handleRequest 這個 method 上面,因為我們只是要一個簡單的 hello,所以上面只是回傳一個 ModelAndView object。ModelAndView 顧名思義就是需要 Model 資料以及 View 資訊,在上面的 Model 資料就是現在的日期資訊以及名稱,而 View 資訊就是 hello.jsp。


5. 撰寫 View 程式


因為上面的 SpringappController 會把資訊傳遞到 hello.jsp 這個 JSP 程式,因此我們需要撰寫 hello.jsp。這邊我使用 JSTL 讓整個頁面可以更簡潔,不要讓 script 以及 HTML 混合在一起。下面就是秀出:


Greetings, it is now xxxx


xxxx 就是由上面的 ModelAndView 帶過來的 now 資訊。


<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<html>
<head><title>Hello :: Spring Application</title></head>
<body>
<h1>Hello - Spring Application</h1>
<p>Greetings, it is now <c:out value="${now}"/>
</p>
</body>
</html>


 


上面就是一個很簡單的程式,接下來再慢慢說明可以怎樣的變化。


More......

星期四, 4月 26, 2007

聲活派再次改版



沒幾個月,聲活派又再次改版了。比較不同的是,這次的改版全部是由我部門所完成的,包括 Art、Engineer 還有網站規劃。主要是放在視覺上的改變,以即將之前網站的一些缺點做改進,整個改版花了一個月左右,感謝我部門的努力,讓新版在今天正式上線。


這次改版在網站搜尋的部分,我加入了 Lucene .Net ,讓整個網站的搜尋更加的 Powerful。除了基本的 keyword search 之外,還可以使用 boolean 運算式來做查詢,例如:

投資 And 管理

會查詢 Index 資料裡面包含『投資』以及『管理』的有聲書。若使用 Or ,就是查詢包含『投資』或『管理』的有聲書。之後我會把 Lucene 的東西做個介紹。

再來就是之前我們加入的月費 299 聽到飽的機制,這種機制比較偏向於 KKBox 的收費方式,當然原本的單次購買還是保留著。

目前整個網站看起來質感增加不少,接下來就看明天開始導入流量的結果了。


More......

星期二, 4月 17, 2007

讓 Google 管理公司的 Mail - Google 應用服務網站版



我想如果問一個網管說你覺得網管的 Server 裡面,哪一個最讓你棘手,我猜 Email 應賅是可以列入到前三沒問題的。我不是網管,但是只是因為我現在有時候還得要身兼一部份網管的工作,所以今天來介紹一個 goolge 提供的 Email 管理服務。理由很簡單,Email 幾乎已經是目前大家最常使用的網路 Service,你問看看你公司的人能不能一天收不到 Email?Email Server 一掛掉,可能大家就開始緊張了,而 Email Server 說簡單是很簡單,但是牽涉到的東西又很廣,包括 SMTP Server、DNS 設定、SPAM Mail 的阻擋等等。對於一般的中小型企業,Google 提供了一個很好的 Solution - Google 應用服務網路版。

首先你需要先去申請這個 Service,網址是 http://www.google.com/a/,你得要填一些網域或公司資訊等等,這些應賅都算很簡單的步驟。申請完之後,啟用電子郵件服務需要兩個步驟:

  • 驗證網域擁有權:

這個步驟主要是要確認你是否是該網域的管理者,否則每個人都去隨便設定別人的網域,就可以把別人的信件都拿過來也太可怕了。比如說你的網域是 test.com,那你必須在 www.test.com 這台機器上放置一個 googlehostedservice.html 檔案,檔案內容就是複製說明頁上面的內容。

  • 設定網域 MX Record:

這個步驟主要是要設定 DNS MX Record,在你的 DNS Server 中設定底下的資訊:

test.com IN MX 1 ASPMX.L.GOOGLE.COM.

test.com IN MX 5 ALT1.ASPMX.L.GOOGLE.COM.

test.com IN MX 5 ALT2.ASPMX.L.GOOGLE.COM.

test.com IN MX 10 ASPMX2.GOOGLEMAIL.COM.

test.com IN MX 10 ASPMX3.GOOGLEMAIL.COM.

test.com IN MX 10 ASPMX4.GOOGLEMAIL.COM.

test.com IN MX 10 ASPMX5.GOOGLEMAIL.COM.

test.com 是網域名稱,IN 指的是 Internet,MX 就是 Mail eXchange Reocrd,1、5、10 這些代表的是 priority,不見得要用 1、5、10,只要是數字可以表現成大小就可以了 (例如 10、20、30)。這些設定完之後,就可以把 mail account 設定上去了。

為什麼這樣設定以後,就可以透過 google 來收信呢?主要就是在 MX Record。Email 除了 SMTP Server 之外,還需要透過 DNS MX Record 資訊來得知要把信件傳遞到哪台 Server。因此上述的設定下,假設有人寄信給 xxx@test.com,Mail server 會去查詢 test.com 的 MX Record,由上述得知要把信件寄送到哪台機器 (根據 priority 決定,若 ASPMX.L.GOOGLE.COM 失敗就換 ALT1.ASPMX.L.GOOGLE.COM,以此類推)


More......

星期一, 4月 16, 2007

好用的 Blog 離線編輯器 - Windows Live Writer


去年我為了可以方便在我的 iBook 上面寫 blog,參考了一些資料,找到了 ecto 這套 blog 編輯器; 我也花錢買了一套,說特別好用,我覺得也還好,不過也算是一套方便的工具就是了。我之前也寫過文章批評過 Blogger 真的是很不人性化的一個系統,去年 Blogger 可能聽到了很多人的抱怨,推出了 Blooger Beta,而這也照成另外一個問題,ecto 不支援 Blooger Beta XD。我在網站上早早就看到作者說他正在著手進行 ecto 3 的開發,不過幾個月過去了,似乎還在是在開發中。現在推薦一套微軟出的 Blog 離線編輯器 - Windows Live Writer。

一開始我以為 Windows Live Writer 只有支援 Windows Live Spaces,因為微軟一向都是會這樣搞。不過沒想到這次 Windows Live Writer 並沒有,而且對於其他 Blog 系統的支援度也滿不錯的。下載之後,只要底下的幾個步驟就可以開始使用了:以 Blogger Beta 為例:

1. 設定你的 Blogger Beta 的網址與帳號密碼






2. 系統開始抓資料設定




3. 詢問 blog 資訊



4. 開始寫 blog




畫面就跟 word 類似,所以應賅是可以很容易上手的。不過現在不支援圖片直接上傳,這點跟 ecto 之前對於 blogger 的支援一樣。編輯之後就可以存成 Draft 或是 Publish 到 Blog 了。


More......

星期三, 2月 28, 2007

Java 與 UTF-8 編碼 (五)



這些文章我覺得整理的不是很好,大部分都是想到什麼就寫什麼,可能有空再做整理了。不過基本上前面提到的事把 JSP 跟 Servlet 部分如何以 UTF-8 處理,以避免亂碼,這篇主要就是 Database 的部分了。


Database 算是比較單純的,因為現在大部分的知名 Database 幾乎都是已經 Support Unicode,例如:MS SQL Server、MySQL、Oracle 等等。我之前寫的一篇文章「在 OSX 上安裝 MySQL」,當時我會選擇自己從新從 Source Code Configure 以及 Compile 的原因也就是想要變成直接支援 UTF-8 編碼。

資料從 JSP 進入到 Database,每一部份都是使用 UTF-8

JSP --> Servlet --> Database

資料從 Database 到 JSP 呈現,如果也都一樣使用 UTF-8,那就可以避免到中文亂碼的問題了。

Database --> Servlet --> JSP


More......

星期二, 2月 27, 2007

Java 與 UTF-8 編碼 (四)


在 Java 與 UTF-8 編碼 (一) 裡面有提到我上面的例子使用 UTF-8 格式來存 JSP 檔案。那現在我們試看看如果使用不同的編碼格式來存檔,結果會變成如何呢?


我使用 Notepad++ 把 JSP 檔案編譯成 ANSI 格式,另外我在 JSP 檔案裡面加入中文的訊息,包括 title 以及 body 都加入中文,JSP 內容如下:



從上面的檔案看起來,我們也加入了 :



<%@page contentType="text/html; charset=UTF-8"%>



內容從 Notepad++ 看起來跟之前的 JSP 檔案也差不多,那執行起來的結果呢?如下圖:



發現所有中文的部分都變成亂碼了。這時候 ANSI 編碼以及 UTF-8 又衝突了,怎麼解決這問題呢?很簡單,只要把 pageEncoding="big5" 加入 JSP Page 宣告中:



<%@page contentType="text/html; charset=UTF-8" pageEncoding="big5"%>



出來的結果就正常了。pageEncoding 是用來宣告你的 JSP 檔案是以什麼 Format 來存檔的,如果你有很多檔案都是已經寫好了,而且也都不是使用 UTF-8 格式來存檔的,那最快的方式就是使用 pageEncoding 來宣告你的存檔格式。不過我還是建議存檔直接以 UTF-8 格式來存檔是最好的了。


More......