Url Rewrite Filter实现页面伪静态化,简单实例及步骤(二)

讲解3

urlrewrite.xml配置文件中有两种规则:即<rule><outbound-rule>,在上面的例子中,讲解的都是<rule>规则,下面我们来讲解一下<outbound-rule>规则:

<outbound-rule>这是非常类似的一个正常的规则,但它是用于重写的URL ,通过response.encodeURL() 或者 <c:url value=””/>标签来实现

下面我们在index.jsp中加入如下三段代码:

 

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

<a href="<%=response.encodeURL("process.do?method=show&uuid=index")%>">跳转-3</a>

<a href="<c:url value='process.do?method=show&uuid=index'/>">跳转-4</a>

 

urlrewrite.xml中加入如下<outbound-rule>规则:

    <outbound-rule>

       <from>process.do\?method=([a-z]+)&amp;uuid=([a-z]+)</from>

       <to>./$1.html</to>

    </outbound-rule>

正常情况下:

在浏览器的地址栏中输入:http://localhost:8080/UrlRewrite/

我们把鼠标指向链接” 跳转-3或者” 跳转-4上的时候,状态栏的地址显示为:

http://localhost:8080/UrlRewrite/show.html

当我们点击链接” 跳转-3或者” 跳转-4上的时候。地址栏显示地址为:

http://localhost:8080/UrlRewrite/show.html

 

页面显示内容为:This is OK page.

解析:<a href="<c:url value='process.do?method=show&uuid=index'/>">跳转-4</a>该语句符合我在urlrewrite.xml中配置的拦截规则

<outbound-rule>

    <from>process.do\?method=([a-z]+)&amp;uuid=([a-z]+)</from>

       <to>./$1.html</to>

</outbound-rule>

所以它会被服务器解析为:<a href="/UrlRewrite /show.html">跳转-4</a>,从而实现url重定向。

 

讲解4

上面已经讲过,比如访问:

http://localhost:8080/UrlRewrite/process.do?method=show&uuid=index

可以这样:

    <rule>

       <from>^/([a-z]+)/([a-z]+)/([a-z]+).html$</from>

       <to>/$1.do?method=$2&amp;uuid=$3</to>

    </rule>

+

    <a href="process/show/index.html">跳转-2</a>

相结合的配置访问。

 

但是像这种配置:<a href="process/show/index.html">跳转-2</a>的可读性比较差,不方便一眼看出是一个什么样的请求处理方式。

 

 

所以可以把 <rule>  <outbound-rule> 结合使用:

    <rule>

       <from>^/([a-z]+)/([a-z]+)/([a-z]+).html$</from>

        <to>/$1.do?method=$2&amp;uuid=$3</to>

    </rule>

+

    <outbound-rule>

       <from>([a-z]+).do\?method=([a-z]+)&amp;uuid=([a-z]+)</from>

       <to>%{context-path}/$1/$2/$3.html</to>

    </outbound-rule>

+

<a href="<c:url value='process.do?method=show&uuid=index'/>">跳转-4</a>

 

 

此时点击“跳转-4,地址栏url显示为:

http://localhost:8080/UrlRewrite/process/show/index.html

页面显示内容为:

This is OK page.

 

 

解析:

 

1. <a href="<c:url value='process.do?method=show&uuid=index'/>">跳转-4</a>该语句会根据<outbound-rule>规则被服务器解析为:<a href="/UrlRewrite/process/show/index.html">跳转-4</a>

 

2.我们点击“>跳转-4 “实际上就是请求”/UrlRewrite/process/show/index.html“,该请求符合<rule>规则,所以会被<rule>转发到 process.do?method=show&uuid=index“,从而实现伪静态。

 

总之,页面中的地址红过URLRewriter进行静态化以后,在请求的时候,URLRewriter又将其进行了还原,保证了一致性.

 

 

讲解5

防止不同规则之间没必要的多次转发请求:

<rule>

<from>^/([a-z]+)/([a-z]+)/([a-z]+).html$</from>

<to type="redirect">

%{context-path}/$1.do?method=$2&amp;uuid=$3

</to>

</rule>

+

<rule>

    <from>process.do\?method=([a-z]+)&amp;uuid=([a-z]+)</from>

    <to type="redirect">%{context-path}/$2.jsp</to>

</rule>

+

<a href="process/show/index.html">跳转-2</a><br /><br />

 

在浏览器的地址栏中输入:http://localhost:8080/UrlRewrite/

我们把鼠标指向链接” 跳转-2状态栏的地址显示为:

http://localhost:8080/UrlRewrite/process/show/index.html

 

当我们点击链接” 跳转-2后,地址栏显示地址为:

http://localhost:8080//UrlRewrite/index.jsp

 

解析:

1. <a href="process/show/index.html">跳转-2</a>该语句会根据第一个<rule>规则被转发到

/process.do?method=show&uuid=index

 

2. 被转发后的请求/process.do?method=show&uuid=index,同时它又符合第二个<rule>规则,所以它会被转发到index.jsp,所以此时地址栏显示为最后的地址。

 

注:似乎这种在不同<rule>之间转发的情况,只在type="redirect"时才出现。

 

常见的问题:

1)  当你想要把“  ”放在rule规则中时,你必须键入的XML实体"&amp”.

2)  为了简单你可能想要启动所有的from’s,^开始以$结束(在正则表达式^指定字符的串开始,$为指定结束).

例如一个请求/my/url/path不匹配<from>^/url/$</from>但匹配<from>/url/</from>

3) 如果使用<outbound-rule>记住所有网址,在您的代码必须是编码如:

   <a href="<%=response.encodeURL("")%>"></a>

   <a href="<c:url value=''/>"></a>

4)    outbound-rule处如果不加“ \ ”对相关的符号进行转义那么将使response.encodeURL或者<c:url value=''/>绑定不上“美化后”的url

5)    对于中文参数要使用(.*)作为参数转义.

6)    在制定rule时最好要加上^........$,否则后果就是将你的web project下面的所有的你转发路径下的目录均认定成为参数了,导致页面图片以及css路径出错。

7)    在浏览器url中输入:http://localhost:8080/UrlRewrite/rewrite-status,则可以看见所有你自定义的重写规则。

8)    简单的说:<rule>是对进入服务器的url进行重置。

<outbound-rule>是对从服务器向页面输出的url进行重置。

9)    正则表达式是复杂的,有些技巧, read Regular expression syntax for Java.阅读正则表达式法的Java.

 

 

常见的两种跳转方式(type)redirectforward

 

1.forward (default) 如果请求匹配“from”中的规则,那么该请求将内部送交到URL指定的“ to 元素。注:在这种情况下,to”链接必须和UrlRewriteFilter在同一上下文环境中,它等同于:

RequestDispatcher rq = request.getRequestDispatcher([to value]); 
rq.forward(request, response);

2.redirect  如果请求匹配“from”中的规则,那么该请求将会HTTP重定向,它等同于:

HttpServletResponse.sendRedirect([to value]))

因此:如果选择跳转类型不同,那么他们相关的配置路径是不同的。

 

官方文档:http://tuckey.org/urlrewrite/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值