前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【项目实战】——Java实现伪静态——urlrewrite

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

作者头像
DannyHoo
发布2018-09-13 12:19:39
8300
发布2018-09-13 12:19:39
举报
文章被收录于专栏:Danny的专栏Danny的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1337092

背 景


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

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

  普惠理财:

  京东超市:

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

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

  为什么要这么做呢?有什么好处?

  Reason1、也是最重要的一点,网络爬虫比较喜欢静态页面,利于搜索引擎的收录。

  Reason2、您看到下面这两个地址有什么不同的感受?

       地址1:www.superman.danny/contact.html

       地址2:www.superman.danny/contact.jsp?id=32&type=0×tamp=2015112912313445343344

java实现伪静态


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

  项目目录结构

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

  2、配置web.xml

  在web.xml中配置过滤器

代码语言:javascript
复制
<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,内容为:

代码语言:javascript
复制
<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

代码语言:javascript
复制
<%@ 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

代码语言:javascript
复制
<%@ 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>中需要转义哦!比如“?”需要转义成“\?”,“&”需要转义成“& ;”……

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

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

UrlReWriteDemo


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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年11月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档