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中添加如下链接: 跳转-1 当点击该链接,地址栏中显示url是:
http://localhost:8080/UrlRewrite/process/show/index 注:这种方式在很多论坛中经常使用。 实现方式2:
在urlrewrite.xml中定义如下规则:
在index.jsp中添加如下链接: 跳转-2 当点击该链接,地址栏中显示url是:
http://localhost:8080/UrlRewrite/process/show/index.html 注:这只是伪静态的两种url展现方式。
讲解3:
在urlrewrite.xml配置文件中有两种规则:即 <%@ 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”上的时候。地址栏显示地址为: http://localhost:8080/UrlRewrite/show.html 页面显示内容为:This is OK page. 解析:\">跳转-4该语句符合我在urlrewrite.xml中配置的拦截规则 上面已经讲过,比如访问: http://localhost:8080/UrlRewrite/process.do?method=show&uuid=index 可以这样: 跳转-2 相结合的配置访问。 但是像这种配置:跳转-2的可读性比较差,不方便一眼看出是一个什么样的请求处理方式。 所以可以把 此时点击“跳转-4”,地址栏url显示为: http://localhost:8080/UrlRewrite/process/show/index.html 页面显示内容为: This is OK page. 解析: 1. \">跳转-4该语句会根据 2.我们点击“>跳转-4 “实际上就是请求”/UrlRewrite/process/show/index.html“,该请求符合 总之,页面中的地址红过URLRewriter进行静态化以后,在请求的时候,URLRewriter又将其进行了还原,保证了一致性. 讲解5: 防止不同规则之间没必要的多次转发请求: %{context-path}/$1.do?method=$2&uuid=$3 + 在浏览器的地址栏中输入:http://localhost:8080/UrlRewrite/ 我们把鼠标指向链接” 跳转-2”状态栏的地址显示为: http://localhost:8080/UrlRewrite/process/show/index.html 当我们点击链接” 跳转-2”后,地址栏显示地址为: http://localhost:8080//UrlRewrite/index.jsp 解析: 1. 跳转-2该语句会根据第一个 2. 被转发后的请求/process.do?method=show&uuid=index,同时它又符合第二个 注:似乎这种在不同 常见的问题: 1) 当你想要把“ & ”放在rule规则中时,你必须键入的XML实体\"&”. 2) 为了简单你可能想要启动所有的from’s,以^开始以$结束(在正则表达式^指定字符 的串开始,$为指定结束). 例如一个请求/my/url/path不匹配 4) 在outbound-rule处如果不加“ \\ ”对相关的符号进行转义那么将使5) 6) 7) 8) 9) response.encodeURL或者 在制定rule时最好要加上^........$,否则后果就是将你的web project下面的所有的你转发路径下的目录均认定成为参数了,导致页面图片以及css路径出错。 在浏览器url中输入:http://localhost:8080/UrlRewrite/rewrite-status,则可以看见所有你自定义的重写规则。 简单的说: 正则表达式是复杂的,有些技巧, 阅读正则表达式语法的Java. 常见的两种跳转方式(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/ 因篇幅问题不能全部显示,请点此查看更多更全内容