【项目实战】——Java实现伪静态——urlrewrite

来源:互联网 发布:婚纱照精修用什么软件 编辑:程序博客网 时间:2024/06/05 09:35



背 景


  记得在大学《网页设计》一课上,写过不少网页,最后结课时,还为我的家庭和大学宿舍各做了一个小型静态网站《MyFamily》和《七匹狼与一头猪》,都是用记事本写的纯html,期间做过不少修修改改,比如嫌这张图片不好看,那篇简介不够生动等等,这些修改都得用记事本打开,修改html代码。这点就暴露出了静态网页的一个弊端:不支持动态内容更新,更新内容需要直接修改代码。

  您肯定发现了,现在许多网站的页面都是“静态网页”(看地址栏):

   普惠理财:

  这里写图片描述

   京东超市:

  这里写图片描述



  so 问题来了,这些网页上的内容肯定是需要持续更新的,它们真的是静态网页吗?答案肯定是否定的,那么这是如何实现的呢?

  这种页面,从地址栏上看似是静态页,但实质都是动态的(jsp、php等),只是通过某种方式把它们“伪装”成静态的页面,是通过伪静态技术来实现的。

  为什么要这么做呢?有什么好处?
  Reason1、也是最重要的一点,网络爬虫比较喜欢静态页面,利于搜索引擎的收录。
  Reason2、您看到下面这两个地址有什么不同的感受?
       地址1:www.superman.danny/contact.html
       地址2:www.superman.danny/contact.jsp?id=32&type=0&timestamp=2015112912313445343344



java实现伪静态


  在java中实现伪静态很简单,可以通过第三方包UrlRewriteFilter来实现。

  项目目录结构

  这里写图片描述

  1、下载并引用jar包: urlrewritefilter-4.0.3.jar

  2、配置web.xml

  在web.xml中配置过滤器

<filter>    <filter-name>UrlRewriteFilter</filter-name>    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class></filter><filter-mapping>    <filter-name>UrlRewriteFilter</filter-name>    <url-pattern>/*</url-pattern>    <dispatcher>REQUEST</dispatcher>    <dispatcher>FORWARD</dispatcher></filter-mapping>

  3、在web.xml同级目录新建urlrewrite.xml,内容为:

<urlrewrite>    <rule>        <from>^/news/news.html$</from>        <to>/news/news.jsp</to>    </rule>    <rule>        <from>^/news/([0-9]+).html$</from>        <to>/news/news.jsp?newsId=$1</to>    </rule>    <outbound-rule>        <from>^/UrlReWriteDemo/news/news.jsp\?newsId=([0-9]+)$</from>        <to>/UrlReWriteDemo/news/$1.html</to>    </outbound-rule></urlrewrite>

  4、建两个简单的页面,index.jsp中放几个链接,点击连接后跳转到news.jsp中,并传递参数。

  index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>首页</title></head><body>    <ul>        <li>新闻</li>        <ul>            <li><a href="/UrlReWriteDemo/news/news.html">新闻</a></li>            <li><c:url value="/news/news.jsp?newsId=1" var="tempNewsUrl"></c:url>                <a href="${tempNewsUrl}">新闻1</a></li>            <li><c:url value="/news/news.jsp?newsId=2" var="tempNewsUrl"></c:url>                <a href="${tempNewsUrl}">新闻2</a></li>            <li><c:url value="/news/news.jsp?newsId=3" var="tempNewsUrl"></c:url>                <a href="${tempNewsUrl}">新闻3</a></li>        </ul>    </ul></body></html>

  news.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%Object newsId=request.getParameter("newsId"); %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>新闻</title></head><body>本条新闻id为 :<%="news".equals(newsId.toString())?"空值,因为您访问的是静态页面news.html":newsId %></body></html>

  到此,一个简单的伪静态的过程就完成了。

  启动运行项目,把鼠标放在“新闻1”上,发现状态栏中的地址是http://localhost:8080/UrlReWriteDemo/news/1.html

  这里写图片描述

  访问后,虽然真是访问的地址是 http://localhost:8080/UrlReWriteDemo/news/news.jsp?newsId=1,但是看到地址栏跳转到的页面地址是 http://localhost:8080/UrlReWriteDemo/news/1.html

  这里写图片描述



画龙点睛(重要)


  上面整个过程中,实现伪静态起关键作用的就是urlrewrite.xml的配置。

  先看<rule>标签中的配置:

  <from>中的地址表示我们浏览器要访问的地址(即敲回车前在地址栏输入的地址,或者<a>标签指向的连接),可以自己指定。<from>中的地址内,括号里的内容为正则表达式,用来过滤字符,比如 ^/news/([0-9]+).html$ 表示可以匹配/news目录下以任意位数字命名的.html文件,如news/1.html、news/1234.html等。主要用于过滤访问路径或传参。

  <to>中的内容表示浏览器访问了上述地址后,实际转向能真正访问系统的地址,这个地址需要是真是存在的(当然SpringMVC可以设置为Controller的地址,struts2可以设置为action的地址等),上面例子<to>标签指向的地址中的“$1”表示<from>标签中的第一处正则表达式所匹配的实际内容,利用这一特性,可以达到传参的效果。
<rule>标签所起到的作用就是:浏览器访问的是<from>中的地址,它把这个地址经过过滤转向访问<to>中地址,返回时再以静态地址的方式显示。

  但一般情况下,这些静态地址都不是我们手动输入到地址栏的,而是存在于网页中,由用户点击访问的,而且很多情况下<a>标签中的地址都会用动态地址如.jsp、.php等,这种情况下,就需要使用<outbound-rule>了。滑动一下鼠标再上去看一下<outbound-rule>的配置会发现,其中的<from><to>标签中的内容差不多与<rule>标签刚好相反。

  文章上面对”新闻1”链接的配置就是如此,<c:ur>中的地址本来是动态地址,经过与jstl的<c:ur>标签结合使用,给用户展现的就是一个静态地址了,相当于比直接访问静态页面多走了两步,urlrewrite.xml中具体执行顺序如下:

  这里写图片描述

  ${tempNewsUrl}中的链接指向<outbound-rule>标签<from>中的地址,继而通过各种转向,最终执行到真正的动态地址。

  温馨提示:一些特殊字符在<outbound-rule>中需要转义哦!比如“?”需要转义成“\?”,“&”需要转义成“&amp ;”……

  因为刚刚接触的时候,感觉很绕,看完一些文章后还是感觉很模糊,所以在多次实践后,把自己的理解写出来,与大家分享。(本文参考地址——http://www.tuckey.org/urlrewrite/)

  如果您有更好的建议,非常欢迎与我进一步讨论。这里把写博客用到的Demo分享,里面例举了多种情况(如访问真正的静态页、访问被伪装的静态页、传递多个参数等)的用法举例,下载请点击
UrlReWriteDemo。



【 转载请注明出处——胡玉洋《Java实现伪静态——urlrewrite》

1 0
原创粉丝点击