zoukankan      html  css  js  c++  java
  • Struts2进行url重写

    一般来说我们在用Struts2进行开发的时候我们的访问url都是带上一些类似于.action或者.do还有用?传递参数,这种访问方式与静态页面的访问相比,我就可以用
    一些开源的组件来进行url的重写,以实现伪静态,虽然这样对于访问速度并没有提高,但是有一个很明确的好处就是经过url重写的url是更有利于搜索引擎优化的,还有一个好处就是完全隐藏了一些action的结构,下面就让我们来看看怎么进行url的重写

    首先,这要用到两个软件包,一个是SmartUrls(Struts2的插件,下载地址:http://code.google.com/p/smarturls-s2/downloads/list),还有就是urlrewritefilter(下载地址:http://tuckey.org/urlrewrite/dist/urlrewritefilter-2.6.zip).
    要想去掉struts2的后缀,就要这样配置filter:
    <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> 
    <filter-name>struts2</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>FORWARD</dispatcher> 
    </filter-mapping> 
    然后就 OK 了
    最后说明一点,这要在支持servlet2.4以上规范的容器中才气作用,因为servlet2.3规范里面,过滤器只支持request过滤,不支持转发之类的过滤

    //下面介绍另外一种思路
    需要修改的地方是:
    <filter-mapping> 
    <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中这样配置:
    1 <rule>
    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]+
    1.4 小结
    使用URLRewirte可以方便的进行地址伪静态化,配置规则也相对比较方便。不过在项目设计的时候需要制定地址匹配规则,以使在开发的过程中直接利用该规则进行编码。如果是对已有的项目进行地址伪静态化比较麻烦,需要对所有的页面、跳转进行修改,工作量较大,同时也容易忽略一些URL。
    一句话,其实它并没有达到静态化要求,只是相当于将地址进行了改写。

    经过上面的一些步骤我们基本就实现了在Struts2中进行url的重写!


    本文来自: 114JAVA技术网(www.114java.com) 详细出处参考:http://www.114java.com/javakaiyuankuangjia/struts2_0/201005/1275.html

  • 相关阅读:
    第三节课: Python 基本数据类型讲解(1/3)
    第二节课 虚拟机安装
    Java生成带LOGO的二维码
    Oracle中存储图片的类型为BLOB类型,Java中如何将其读取并转为字符串?
    简单分析下mybatis中mapper文件中小知识
    Oracle中,如何将String插入到BLOB类型字段
    Oracle + Mybatis批量插入数据,xml.mapper种的写法
    java中拼接两个对象集合
    关于spring boot在IDE工具中可以启动成功,但是打成jar包以及运行jar包失败的问题
    springboot整合mybatis之注解方式
  • 原文地址:https://www.cnblogs.com/herd/p/5407350.html
Copyright © 2011-2022 走看看