2008年2月9日 星期六

[Struts] Struts 的 TAG 與 javascript 互動

在Struts 中的 TAG 例如: 等,須要跟 javascript互動時,又碰巧變數儲存在 jsp scope 中,那我們該如何去解決勒??

這個問題看似簡單

<html : link action="test" onclick="javascript : return confirm( ' <%= i %>' )" />

你以為這樣就解決嗎??

上面的結果就會出現一個 javascript confirm box 上面顯示 <%= i %>的訊息

剛開始我以為這樣是一定可以成功,結果出來卻不是我要的XD

因為透過 struts tag 裡面的 scriptlets(<%=%>) 是不會被JSP 先解析,所以就想說那就把呼叫confirm 所給的 arguments 的單括號拿掉!!

<html : link action="test" onclick="javascript : return confirm( <%= i %>)" />

結果就是連 confirm box都彈不出來, 透過 firefox 的 javascript console 來觀察錯誤在哪,結果就是跟你說 < 符號不能理解XD

這問題困擾了很多天,有一天透過 google 大神終於找到解答了!!!

這解答果然有撇步~~~

只要將上面的 TAG 改為

<html : link action="test" onclick= ' <%= "return confirm( ' " +i+ " ' )" %>' />

也就是將呼叫 javascript 的 code 在 scriptlets 中當作字串來處理

然後有牽涉到 JSP scope 中變數的部分就利用 string 相加的方式完成整句在client browser 先由 server 解析

與大家分享之~~

[Struts] Struts 解決中文問題

其實Struts 已經用了一陣子了!!當初自己在開發時,遇到最大的問題就是中文的問題!!

好在 LAB 有學長也是有碰過類似的經驗,大家討論之下終於有了答案... Filter

在每個 Struts 的請求中先透過 Filter 來作編碼的動作:

package filter.encoding;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

public class EncodingServlet extends HttpServlet implements Filter
{
    private FilterConfig filterConfig;

    //Handle the passed-in FilterConfig
    public void init(FilterConfig filterConfig) throws ServletException
    {
        this.filterConfig = filterConfig;
    }

    //Process the request/response pair
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain)
    {
        try
        {
            request.setCharacterEncoding("utf-8");
            filterChain.doFilter(request, response);
        }
        catch(ServletException sx)
        {
            filterConfig.getServletContext().log(sx.getMessage());
        }
        catch(IOException iox)
        {
            filterConfig.getServletContext().log(iox.getMessage());
        }
    }

    //Clean up resources
    public void destroy()
    {
    }
}

然後在 web.xml 中加入

<filter>
    <filter-name>EncodingServlet</filter-name>
    <filter-class>filter.encoding.EncodingServlet</filter-class>
</filter>
<filter-mapping>
    <filter-name>EncodingServlet</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping>

就是讓所有對 Controller 發出 request 的請求都能夠先經過我們的 filter

網頁之間的編碼問題解決了!!

事情還沒結束勒~~~

因為 Struts 有一種 i18n 的機制,就是讓所有 Message 都包裝在一個 ApplicationResource.properties 之中

這個檔案裡面不能將中文很正確的在 view 中顯示,所以我們需要一個工具來輔助:property editor

下載的網址如下:
http://propedit.sourceforge.jp/index_en.html

因為我是用 Eclipse 來開發的,所以我是用他對於 Eclipse 的 plug-in

安裝方式網頁上有說,不是用下載的方式,而是可以透過 Eclipse 的安裝 feature 工具來 support

當你重新開啟 Eclipse 後,對於 *.properties 檔案按下右鍵選擇 [Open with] -> [PropertiesEditor]

就可以利用這個工具來編輯 *.properties 檔案

當然它看起來就跟一般 Eclipse 內建的工具差不多,只是如果你是輸入非英文字母,它會自動幫你轉成 UTF-8 的編碼方式

另外還有一點要注意,在 view 的編碼也要改成 UTF-8 不然,我也不知道會怎樣XD

最近找到有 support struts 在 eclipse 上的 plug-in ,可是似乎都不太好用~~

但是有一個工具也可以提供給大家:Struts Console

網址如下:
http://www.jamesholmes.com/struts/console/

他也是有支援 eclipse 讓我在開發時對於編輯 struts-config.xml 來說就不是只是看一堆 XML TAG 了

他的工具也支援 Validator and Tiles 的 struts plug-in

不過對大的缺點就是對於 struts 與支援到 1.2的版本,殘念!!

剩下對於支援 Struts 的工具就有限了!!

如果要開新的 struts project ,我個人是建議直接將 struts-blank.war 匯入後在去更改內容

因為這樣是最快的方法了!! 很多東西要重新撰寫很累人!!!

希望對正要開始開發 struts 的 programmer 來說會有一些些的幫助

P.S. 還是要感謝涼鳥學長在Struts 方面給的指導!!

[Struts] Struts的 標籤使用javascript來顯示

找了好久,怕網頁不見,乾脆就先記錄下來囉!!

原網址:http://www.mail-archive.com/struts-user@jakarta.apache.org/msg69201.html


Re: <html:errors> tag in javascript alert

Martin Fekete
Thu, 12 Jun 2003 23:29:54 -0700

try this ...

errors.header =alert(
errors.prefix ="
errors.suffix ="+ "\\n" +
errors.footer ="");\n

...
<script>
function load() {
<html:errors>
}

</script>
...
<body onload="load()">
...

it should work but it won't because of
http://issues.apache.org/bugzilla/show_bug.cgi?id=17418
so you need to hack org.apache.struts.taglib.html.ErrorsTag

Feky

P.S. 感謝涼鳥學長的幫忙!!