伪静态_URLRewrite实例解析
Url Rewrite Filter实现页面伪静态化,简单实例及步骤1. 首先新建一个Web Project本例把它命名为:UrlRewrite ,在创建的时候,选择勾选“Add JSTL libra
Url Rewrite Filter实现页面伪静态化,简单实例及步骤
1. 首先新建一个Web Project
本例把它命名为:UrlRewrite ,在创建的时候,选择勾选“Add JSTL libraries to WEB-INF/lib folder ”(注:因为项目中会用到jstl 核心标签库) ,然后再把urlrewrite-2.6.0.jar 导入到项目Bulid Path路径下,最后再加入struts 框架。
2. 配置web.xml 文件
把如下代码加入到web.xml 配置文件中,更多的配置可参考官方文档:
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
3. 新增urlrewrite.xml 文件
在WEB-INF 目录下新建一个Url Rewrite Filter 的规则配置文件,默认命名为
,urlrewrite.xml ,示例内容如下:
注:rule 是url 重写规则,from 是显示出来的地址,to 是映射的实际地址,$1是重写参数, 它的值与from 中的正则表达式是一一对应,可以为多个,()里是匹配的正则表达式, 在正则表达式^指定字符的串开始,$为指定结束
4. 新建一个简单的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 中添加如下內容:
6.. 新增index.jsp 文件,添加如下内容:
Hello word ! <=request.getParameter("id" ) >
7. 新增show.html 文件,添加如下内容:
This is OK page.
8. 所有文件都操作处理完后,发布并启动项目
下面做一下具体讲解
讲解1:
正常情况下:
在浏览器的地址栏中输入:http://localhost:8080/UrlRewrite/
页面内容如下:Hello word ! null
(因为此时id 并没有值,所以显示为null )
Urlrewrite 之后:
在浏览器的地址栏中输入:http://localhost:8080/UrlRewrite/maomao.html
页面内容如下:Hello word ! maomao
解析:在项目中,maomao.html 实际上并不存在, 该请求由Url Rewrite Filter负责拦截,由于它符合我在urlrewrite.xml 中配置的拦截规则:
所以该请求被转发由index.jsp 负责处理,即实际处理请求的是index.jsp ,但是地址栏中显示地址依旧是maomao.html. 即伪静态的显示方式,并把参数id 赋值”maomao ”,所以页面中id 此时不为null 。
讲解2:
正常情况下:
,在浏览器的地址栏输入:http://localhost:8080/UrlRewrite/process.do?method=show&uuid=index 页面内容如下:This is OK page.
我们怎么把这个url 实现伪静态化呢?
实现方式1:
在urlrewrite.xml 中定义如下规则:
在index.jsp 中添加如下链接:
当点击该链接,地址栏中显示url 是:
注:这种方式在很多论坛中经常使用。
实现方式2:
在urlrewrite.xml 中定义如下规则:
在index.jsp 中添加如下链接:
当点击该链接,地址栏中显示url 是:
注:这只是伪静态的两种url 展现方式。
讲解3:
在urlrewrite.xml 配置文件中有两种规则:即
下面我们在index.jsp 中加入如下三段代码:
<@ taglib uri="http://java.sun.com/jstl/core-rt" prefix="c">
在urlrewrite.xml 中加入如下
正常情况下:
在浏览器的地址栏中输入:http://localhost:8080/UrlRewrite/
我们把鼠标指向链接” 跳转-3”或者” 跳转-4”上的时候,状态栏的地址显示为: http://localhost:8080/UrlRewrite/show.html
当我们点击链接” 跳转-3”或者” 跳转-4”上的时候。地址栏显示地址为:
页面显示内容为:This is OK page.
解析:跳转-4该语句符合我在urlrewrite.xml 中配置的拦截规则
所以它会被服务器解析为:跳转-4,从而实现url 重定向。
讲解4:
上面已经讲过,比如访问:
可以这样:
相结合的配置访问。
但是像这种配置:跳转-2的可读性比较差,不方便一眼看出是一个什么样的请求处理方式。
所以可以把
此时点击“跳转-4”,地址栏url 显示为:
页面显示内容为:
This is OK page.
解析:
2. 我们点击“>跳转-4 “实际上就是请求”/upload/12/v1heqrnfo41.html“,该请求符合
总之, 页面中的地址红过URLRewriter 进行静态化以后, 在请求的时候,URLRewriter 又将其进行了还原, 保证了一致性.
讲解5:
防止不同规则之间没必要的多次转发请求:
{context-path}/$1.do?method=$2&uuid=$3
在浏览器的地址栏中输入:http://localhost:8080/UrlRewrite/
我们把鼠标指向链接” 跳转-2”状态栏的地址显示为:
当我们点击链接” 跳转-2”后,地址栏显示地址为:
解析:
1. 跳转-2该语句会根据第一个
2. 被转发后的请求/process.do?method=show&uuid=index,同时它又符合第二个
注:似乎这种在不同
常见的问题:
1) 当你想要把“ & ”放在rule 规则中时,你必须键入的XML 实体"&”.
2) 为了简单你可能想要启动所有的from ’s, 以^开始以$结束(在正则表达式^指定字符
的串开始,$为指定结束).
例如一个请求/my/url/path不匹配
3) 如果使用
4) 在outbound-rule 处如果不加“ ”对相关的符号进行转义那么将使5)
6)
7)
8)
9) response.encodeURL 或者http://wk.huhome.net/3/
常见的两种跳转方式(type值) :redirect 、forward
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/