天天看点

Struts2进行url重写

一般来说我们在用Struts2进行开发的时候我们的访问url都是带上一些类似于.action或者.do还有用?传递参数,这种访问方式与静态页面的访问相比,我就可以用

一些开源的组件来进行url的重写,以实现伪静态,虽然这样对于访问速度并没有提高,但是有一个很明确的好处就是经过url重写的url是更有利于搜索引擎优化的,还有一个好处就是完全隐藏了一些action的结构,下面就让我们来看看怎么进行url的重写

​​<filter> 

<filter-name>struts2</filter-name> 

<filter-class>org.texturemedia.smarturls.SmartURLsFilter</filter-class>

</filter>用这个代替struts2的核心过滤器,FilterDispatcher。不必担心struts2不起作用了,因为这个过滤器是继承自FilterDispatcher的。同时在struts.properties中加入struts.action.extension= ,不设任何值。

然后就是配置UrlRewriteFilter,如下

<filter> 

<filter-name>UrlRewriteFilter</filter-name> 

<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 

</filter>

在配置filter-mapping的时候,注意urlrewritefilter的应该在前面。然后urlrewritefilter的重写该怎么用大家可以参看文档,这里就不再赘述。

当使用时发现重写后,filterChain上只有一个urlrewritefilter,而没有经过smartUrls就发到了请求的资源,得到的自然是一个404错误。于是我参看urlrewritefilter的源代码发现,如果重写url成功的话,将会调用RequestDispatcher的forward方法转发到资源,而重写不成功或者是没有重写才会调用filterChain.dofilter。所以struts2的filter-mapping应该这样配置

<filter-mapping> 

<url-pattern>/*</url-pattern> 

<dispatcher>FORWARD</dispatcher> 

</filter-mapping> 

然后就 OK 了

最后说明一点,这要在支持servlet2.4以上规范的容器中才气作用,因为servlet2.3规范里面,过滤器只支持request过滤,不支持转发之类的过滤

//下面介绍另外一种思路

需要修改的地方是:

<filter-name>struts2 </filter-name> 

<url-pattern>*.do </url-pattern> 

<dispatcher>REQUEST </dispatcher> 

<dispatcher>FORWARD </dispatcher> 

<dispatcher>INCLUDE </dispatcher> 

</filter-mapping>

1.1URLRewirte的用处

1.满足搜索引擎的要求。

2.隐藏技术实现,提高网站的移植性。

3.满足美感的要求(个人感觉这个用处太牵强)。

1.2项目部署

1.首先在http://tuckey.org/urlrewrite/下载urlrewirtefilter,现在有2.6.0和3.2.0两个版本,这里我选择的是前面一个稳定版本。

2.解压所下载的文件,把urlrewrite-2.6.0.jar复制到项目的WebRoot/WEB-INF/lib/目录下,然后编译。

3.把urlrewrite.xml复制到项目的WebRoot/WEB-INF/目录下

4.在web.xml文件中加入以下:

1 <!-- 动态地址静态化 -->

2 <filter>

3 <filter-name>UrlRewriteFilter</filter-name>

4 <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>

5 <init-param>

6 <param-name>logLevel</param-name>

7 <param-value>WARN</param-value>

8 </init-param>

9 </filter>

10 <filter-mapping>

11 <filter-name>UrlRewriteFilter</filter-name>

12 <url-pattern>/*</url-pattern>

13 </filter-mapping> 

5.需要配置urlrewrite.xml文件来实现url静态化,下面将详细说明

1.3 如何静态化

到这里相关的配置已经完成,下面看如何把动态地址静态化:

(1)普通url静态化

例如:要把http://localhost/prjtest/user/list.jsp转换成http://localhost/prjtest/user/list.html

这种是最简单的,当一个servlet跳转到list.jsp页面列出user列表时,在urlrewrite.xml中这样配置:

1 <rule>

2 <from>^/user/list.html</from>

3 <to>/user/list.jsp</to>

4 </rule> 

当请求/user/list.html这个页面时,实际上相当于请求/user/list.jsp页面

在servlet的跳转要这样写:

response.sendRedirect("./user/list.html");

(2)带参数的url静态化

例如:要把http://localhost/prjtest/user/view.jsp?cid=1&cname=admin转换成

http://localhost/prjtest/user/view/1_admin.html

在urlrewrite.xml中这样配置:

2 <from>^/user/view/([0-9]+)_([a-z]+).html$</from>

3 <to>/user/view.jsp?cid=$1&cname=$2</to>

4 </rule>

当请求/user/view/1_admin.html这个页面时,实际上相当于请求/user/list.jsp?cid=1&cname=admin页面,在servlet的跳转要这样写(cid,cname为变量):

response.sendRedirect("./user/view/"+ cid +"_"+ cname +".html");

注意:配置文件中用"&"来代替"&"。

一个通用的正则表达式:[a-zA-Z0-9]+