2010/07/03

[筆記] Java Servlet URL Rewrite

Apache有mod Rewrite的套件,可以把很醜的網址整理
EX: http://127.0.0.1/welcome.php?type=signin&browser=mozilla
轉成 Http://127.0.0.1/welcome/signin/mozilla 的形式
這樣也有助於SEO的優化

但是我使用的Resin好像沒有這樣的東西可以用
好險網路上已經有人寫好Library可以用URL Rewrite
首頁: http://www.tuckey.org/urlrewrite/
以下是試用一個小時的心得


1.安裝
下載回來的壓縮檔期指只有兩個檔案:urlrewrite.xml, urlrewrite-2.6.0.jar

XML放在WEB-INF下,JAR放在WEB-INF\lib內

2.修改web.xml,加入下面這段在<webapp> ... </webapp>內
<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    <init-param>
        <param-name>logLevel</param-name>
        <param-value>WARN</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

原來是利用filter來做URL重寫,FILTER原來可以這樣用

3.Done!
4.打開 http://127.0.0.1/AppName/test/status 如果會轉到
    http://127.0.0.1/AppName/test/rewrite-status 就表示成功了


<rule>的使用
<from>網址傳來的樣式
<to> 要改寫的樣式
其中<to>有分好幾種轉址法,我應該只會用到redirect與forward


設定的方法
<to> : 預設就是forward,等同與使用request.getRequestDispatcher(value).forward(request,reponse);

<to type="redirect"> : 網址會改變的方式


案例:
AppName/Welcome/aaa => AppName/Welcome.do?type=aaa
<rule>
    <from>/Welcome/([a-zA-Z0-9]+)</from>
    <to>/Welcome.do?type=$1</to>
</rule>

說明:預設使用regexp來比對網址 ([a-zA-Z0-9]+)表示接受英文與數字的組合
         比對完成後會將內容存到$1作Foreard


案例:
AppName/Welcome/aaa/bbb => AppName/Welcome.do?type=aaa&mode=bbb
<rule>
    <from>/Welcome/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)</from>
    <to>/Welcome.do?type=$1&amp;mode=$2</to>
</rule>

說明:
使用兩個參數,網址是使用 & 但是在XML內不能用 & 要改用 &amp;,不然整份設定都會失效

規則更新時間
測試的時候發現規則改了都不會WORK,發現是規則沒套用,需要重開SERVER才可以生效。
即使用Resin也是一樣,後來發現是需要在web.xml設定更新時間才行

請在web.xml <filter>內新增

<init-param>
    <param-name>confReloadCheckInterval</param-name>
    <param-value>0</param-value>
</init-param>

param-value就是更新的時間
0為每次都檢查,測試的時候建議這樣設
-1為不檢查更新,為預設值



短時間只玩了幾個方法,網址轉回去的部分還沒測試
需要再設定<outbound-rule>讓網址轉成<rule>的形式,不然連結會死光
官網的說明是
Using the example above JSP's with the code
<a href="<%= response.encodeURL("/world.jsp?country=usa&amp;city=nyc")
%>">nyc</a>

will output
<a href="/world/usa/nyc">nyc</a>

Or JSTL
<a href="<c:url value="/world.jsp?country=${country}&amp;city=${city}"
/>">nyc</a>

will output
<a href="/world/usa/nyc">nyc</a>

可以用encodeURL或JSTL來自動改寫網址,乎~這樣輕鬆很多

沒有留言:

張貼留言