偽靜態(tài)_URLRewrite實(shí)例解析
Url Rewrite Filter實(shí)現(xiàn)頁面?zhèn)戊o態(tài)化,簡單實(shí)例及步驟1. 首先新建一個(gè)Web Project本例把它命名為:UrlRewrite ,在創(chuàng)建的時(shí)候,選擇勾選“Add JSTL libra
Url Rewrite Filter實(shí)現(xiàn)頁面?zhèn)戊o態(tài)化,簡單實(shí)例及步驟
1. 首先新建一個(gè)Web Project
本例把它命名為:UrlRewrite ,在創(chuàng)建的時(shí)候,選擇勾選“Add JSTL libraries to WEB-INF/lib folder ”(注:因?yàn)轫?xiàng)目中會(huì)用到j(luò)stl 核心標(biāo)簽庫) ,然后再把urlrewrite-2.6.0.jar 導(dǎo)入到項(xiàng)目Bulid Path路徑下,最后再加入struts 框架。
2. 配置web.xml 文件
把如下代碼加入到web.xml 配置文件中,更多的配置可參考官方文檔:
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
3. 新增urlrewrite.xml 文件
在WEB-INF 目錄下新建一個(gè)Url Rewrite Filter 的規(guī)則配置文件,默認(rèn)命名為
,urlrewrite.xml ,示例內(nèi)容如下:
注:rule 是url 重寫規(guī)則,from 是顯示出來的地址,to 是映射的實(shí)際地址,$1是重寫參數(shù), 它的值與from 中的正則表達(dá)式是一一對(duì)應(yīng),可以為多個(gè),()里是匹配的正則表達(dá)式, 在正則表達(dá)式^指定字符的串開始,$為指定結(jié)束
4. 新建一個(gè)簡單的action 處理類
在此命名為:ProcessAction.java ;示例代碼如下:
package com.telin.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
public class ProcessAction extends DispatchAction {
/**
* Method execute
*
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward show(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { return mapping.findForward("ok" );
}
}
5. 在struts-config.xml 中添加如下內(nèi)容:
6.. 新增index.jsp 文件,添加如下內(nèi)容:
Hello word ! <=request.getParameter("id" ) >
7. 新增show.html 文件,添加如下內(nèi)容:
This is OK page.
8. 所有文件都操作處理完后,發(fā)布并啟動(dòng)項(xiàng)目
下面做一下具體講解
講解1:
正常情況下:
在瀏覽器的地址欄中輸入:http://localhost:8080/UrlRewrite/
頁面內(nèi)容如下:Hello word ! null
(因?yàn)榇藭r(shí)id 并沒有值,所以顯示為null )
Urlrewrite 之后:
在瀏覽器的地址欄中輸入:http://localhost:8080/UrlRewrite/maomao.html
頁面內(nèi)容如下:Hello word ! maomao
解析:在項(xiàng)目中,maomao.html 實(shí)際上并不存在, 該請(qǐng)求由Url Rewrite Filter負(fù)責(zé)攔截,由于它符合我在urlrewrite.xml 中配置的攔截規(guī)則:
所以該請(qǐng)求被轉(zhuǎn)發(fā)由index.jsp 負(fù)責(zé)處理,即實(shí)際處理請(qǐng)求的是index.jsp ,但是地址欄中顯示地址依舊是maomao.html. 即偽靜態(tài)的顯示方式,并把參數(shù)id 賦值”maomao ”,所以頁面中id 此時(shí)不為null 。
講解2:
正常情況下:
,在瀏覽器的地址欄輸入:http://localhost:8080/UrlRewrite/process.do?method=show&uuid=index 頁面內(nèi)容如下:This is OK page.
我們?cè)趺窗堰@個(gè)url 實(shí)現(xiàn)偽靜態(tài)化呢?
實(shí)現(xiàn)方式1:
在urlrewrite.xml 中定義如下規(guī)則:
在index.jsp 中添加如下鏈接:
當(dāng)點(diǎn)擊該鏈接,地址欄中顯示url 是:
注:這種方式在很多論壇中經(jīng)常使用。
實(shí)現(xiàn)方式2:
在urlrewrite.xml 中定義如下規(guī)則:
在index.jsp 中添加如下鏈接:
當(dāng)點(diǎn)擊該鏈接,地址欄中顯示url 是:
注:這只是偽靜態(tài)的兩種url 展現(xiàn)方式。
講解3:
在urlrewrite.xml 配置文件中有兩種規(guī)則:即
下面我們?cè)趇ndex.jsp 中加入如下三段代碼:
<@ taglib uri="http://java.sun.com/jstl/core-rt" prefix="c">
在urlrewrite.xml 中加入如下
正常情況下:
在瀏覽器的地址欄中輸入:http://localhost:8080/UrlRewrite/
我們把鼠標(biāo)指向鏈接” 跳轉(zhuǎn)-3”或者” 跳轉(zhuǎn)-4”上的時(shí)候,狀態(tài)欄的地址顯示為: http://localhost:8080/UrlRewrite/show.html
當(dāng)我們點(diǎn)擊鏈接” 跳轉(zhuǎn)-3”或者” 跳轉(zhuǎn)-4”上的時(shí)候。地址欄顯示地址為:
頁面顯示內(nèi)容為:This is OK page.
解析:跳轉(zhuǎn)-4該語句符合我在urlrewrite.xml 中配置的攔截規(guī)則
所以它會(huì)被服務(wù)器解析為:跳轉(zhuǎn)-4,從而實(shí)現(xiàn)url 重定向。
講解4:
上面已經(jīng)講過,比如訪問:
可以這樣:
相結(jié)合的配置訪問。
但是像這種配置:跳轉(zhuǎn)-2的可讀性比較差,不方便一眼看出是一個(gè)什么樣的請(qǐng)求處理方式。
所以可以把
此時(shí)點(diǎn)擊“跳轉(zhuǎn)-4”,地址欄url 顯示為:
頁面顯示內(nèi)容為:
This is OK page.
解析:
1. 跳轉(zhuǎn)-4該語句會(huì)根據(jù)
2. 我們點(diǎn)擊“>跳轉(zhuǎn)-4 “實(shí)際上就是請(qǐng)求”/upload/12/v1heqrnfo41.html“,該請(qǐng)求符合
總之, 頁面中的地址紅過URLRewriter 進(jìn)行靜態(tài)化以后, 在請(qǐng)求的時(shí)候,URLRewriter 又將其進(jìn)行了還原, 保證了一致性.
講解5:
防止不同規(guī)則之間沒必要的多次轉(zhuǎn)發(fā)請(qǐng)求:
{context-path}/$1.do?method=$2&uuid=$3
在瀏覽器的地址欄中輸入:http://localhost:8080/UrlRewrite/
我們把鼠標(biāo)指向鏈接” 跳轉(zhuǎn)-2”狀態(tài)欄的地址顯示為:
當(dāng)我們點(diǎn)擊鏈接” 跳轉(zhuǎn)-2”后,地址欄顯示地址為:
解析:
1. 跳轉(zhuǎn)-2該語句會(huì)根據(jù)第一個(gè)
2. 被轉(zhuǎn)發(fā)后的請(qǐng)求/process.do?method=show&uuid=index,同時(shí)它又符合第二個(gè)
注:似乎這種在不同
常見的問題:
1) 當(dāng)你想要把“ & ”放在rule 規(guī)則中時(shí),你必須鍵入的XML 實(shí)體"&”.
2) 為了簡單你可能想要啟動(dòng)所有的from ’s, 以^開始以$結(jié)束(在正則表達(dá)式^指定字符
的串開始,$為指定結(jié)束).
例如一個(gè)請(qǐng)求/my/url/path不匹配
3) 如果使用
4) 在outbound-rule 處如果不加“ ”對(duì)相關(guān)的符號(hào)進(jìn)行轉(zhuǎn)義那么將使5)
6)
7)
8)
9) response.encodeURL 或者h(yuǎn)ttp://wk.huhome.net/3/
常見的兩種跳轉(zhuǎn)方式(type值) :redirect 、forward
1. )forward (default) 如果請(qǐng)求匹配“from ”中的規(guī)則, 那么該請(qǐng)求將內(nèi)部送交到URL 指定
,的“ to “ 元素。注:在這種情況下, “to ”鏈接必須和UrlRewriteFilter 在同一上下文環(huán)境中,它等同于:
RequestDispatcher rq = request.getRequestDispatcher([to value]);
rq.forward(request, response);
2. )redirect 如果請(qǐng)求匹配“from ”中的規(guī)則,那么該請(qǐng)求將會(huì)HTTP 重定向,它等同于:
HttpServletResponse.sendRedirect([to value]))
因此:如果選擇跳轉(zhuǎn)類型不同,那么他們相關(guān)的配置路徑是不同的。
官方文檔:http://tuckey.org/urlrewrite/