urlrewrite重写url(转)
环境:
Maven 3.0.4
Urlrewrite 2.5.2
Myeclipse 8.6.1
借此机会顺便提一下 Maven Project 的创建,会了的朋友或还不想了解 Maven 的朋友,可以略过创建过程。
创建一个 Maven Project:New --> Other --> Maven Project
在弹出的对话框里,如果你想修改你项目的存放路径你可以改一下,其他的默认,我的所有项目都是存放在默认的工作区下,所以直接点NEXT
接下来找到并选择webapp,其他的默认,NEXT

填写你的 groupId、artifactId、version 和 package 信息,然后 Finish
(Finish 之后myeclipse在创建maven的时候可能会弹出错误框提示,没事,不用管它,直接按两次回车或手动关闭提示框)

下面我简单解释一下 groupId、artifactId、version 和 package:
groupId:group 翻译成中文就是组、集团的意识,groupId就是这样一个组或集团的ID标识,就拿 Apache 来说好了,Apache 大家都不陌生吧,
Apache 官网上有非常多的项目,每个项目里面肯定能找得到 org.apache.xxxx,而 org.apache 就是这里说的 groupId
artifactId:还是拿 Apache 来说,Apache 官网上有非常多的项目,而每个项目的名字就是这里的 artifactId,换句话说,artifactId 就是你的项目名
version:这个就没有什么好解释的了吧,是项目版本的意思
package:这个也没什么好说的,就是 groupId.artifactId,创建的时候会自动帮你补全,如果没有自动帮你补全就自己手动敲上去
好,下面来看创建出来的urlrewrite-maven-example的目录结构:

src/main/resources:用来存放资源文件(默认会帮你创建这个资源文件夹)
src/main/java:用来存放 java 源码文件(需要自己手动创建)
src/main/test:用来存放测试代码(需要自己手动创建,也有人习惯命名为:src/test)
target:是用来存放 Maven 编译好的字节码的地方
Maven 的创建就讲到这,接着讲 urlrewrite,另外为了调试方便我引进了 Ant,即上面的 build.xml,这里我不讲它,没有影响。
pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.fancy</groupId>
<artifactId>urlrewrite-maven-example</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>urlrewrite-maven-example Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- urlrewrite jar -->
<dependency>
<groupId>org.tuckey</groupId>
<artifactId>urlrewrite</artifactId>
<version>2.5.2</version>
</dependency>
</dependencies>
<build>
<finalName>urlrewrite-maven-example</finalName>
</build> </project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 开启URLREWRITE监听 -->
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping> <!-- 404错误 -->
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page> <!-- 500错误 -->
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page> <welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
</welcome-file-list> </web-app>

urlrewrite.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN" "\\urlrewrite3.2.dtd"> <urlrewrite> <rule>
<note>重写index.jsp成index.html</note>
<note>example:/index.html</note>
<from>/index.html</from>
<to type="forward">/index.jsp</to>
</rule> <rule>
<note>将view根目录下所有jsp资源重写成/xxx.action</note>
<note>example:/index.action</note>
<from>/([A-Za-z0-9]+).action</from>
<to type="forward">/view/$1.jsp</to>
</rule> <rule>
<note>forward(转发模式)传参</note>
<note>example:/user/param/fancy/8080.do</note>
<from>/user/([A-Za-z0-9]+)/([A-Za-z0-9]+)/([A-Za-z0-9]+).do</from>
<to type="forward">/view/parameter/$1.jsp?username=$2&password=$3</to>
</rule> <rule>
<note>redirect(重定向模式)传参,to中写绝对地址</note>
<note>example:/admin/param/fancy/8080.do</note>
<from>/admin/([A-Za-z0-9]+)/([A-Za-z0-9]+)/([A-Za-z0-9]+).do</from>
<to type="redirect">/urlrewrite-maven-example/view/parameter/$1.jsp?username=$2&password=$3</to>
</rule> </urlrewrite>

urlrewrite.xml 这个配置文件一定只能放在 WEB-INF 下,放别的地方,无论你在web.xml中怎么配置都是不行的,至少现在是不行的。
所谓重写,就一定会有规则的匹配,这里用到了正则表达式,方便起见,我只用了[A-Za-z0-9]+,简单的解释一下:
A-Z:匹配 A 到 Z 中的任意一个字符,说一句废话,同理可得,
a-z:匹配 a 到 z 中的任意一个字符
0-9:匹配 0 到 9 的任意一个字符
+:至少出现一次,即,一次或一次以上
合起来 [A-Za-z0-9]+ 的意思就是:匹配一个任意的英文字母和数字组合的字符串
<rule>:自定义匹配规则
<note>:注释,解释标签
<from>:定义具体的匹配规则
<to>:匹配成功后的目标地址
<to type="">:type的值有两个,一个是 forward (转发,参数不丢失),一个是 redirect (重定向,地址栏显示的地址就是目标真实地址)
$1:匹配中的第一个正则表达式的字符串的值,$2,$3,$4....也是如此
& :是 & 的实体名,代表的就是 &,这个可以在 w3school 中找到:http://www.w3school.com.cn/tags/html_ref_entities.html
第一个rule:访问 /index.html,实际上是访问了 /index.jsp
第二个rule:访问 /xx.action , 实际上是访问了 view 目录下的 xx.jsp
第三个rule:访问 /user/xx/yy/zz.do , 实际上是访问了 view 目录下的 parameter 目录下的 xx.jsp?username=yy&password=zz
第四个rule:跟第三个其实是一样的,但是由于是重定向模式,所以地址栏就会显示真的是地址
下面是 测试的 JSP :
/welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Urlrewrite Simple Demo</title>
</head>
<body>
<h3>/welcome.jsp</h3>
<HR/>
<p>
<a href="index.html" target="_blank">/index.html</a>
</p>
<p>
<a href="index.action" target="_blank">/index.action</a>
</p>
<p>
<a href="user/param/fancy/8080.do" target="_blank">/user/param/fancy/8080.do</a>(forward[转发模式])
</p>
<p>
<a href="admin/param/fancy/8080.do" target="_blank">/user/param/fancy/8080.do</a>(redirect[重定向模式])
</p>
</body>
</html>

/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Urlrewrite Simple Demo</title>
</head>
<body>
<h3>/index.jsp</h3>
<h1>Hello Urlrewrite</h1>
</body>
</html>

/view/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Urlrewrite Simple Demo</title>
</head>
<body>
<h3>/view/index.jsp</h3>
<h1>Hello Urlrewrite</h1>
</body>
</html>

/view/parameter/param.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Urlrewrite Simple Demo</title>
</head>
<body>
<h3>/view/parameter/param.jsp</h3>
<h1>${param}</h1>
</body>
</html>

Run it :
在 pom.xml 中右键,Run as --> Maven install
下面是生成的 target 资源:

将 war 文件拷贝到你的 服务器中,我用的是tomcat,然后启动tomcat:
如果你是第一次使用 urlrewrite 可能会抛一个异常:

这个异常信息是说系统找不到 tomcat bin 下的 urlrewrite3.2.dtd 文件,解决办法很简单:
方法一:将 urlrewrite3.2.dtd 放到 urlrewrite.xml 所在的目录下,即 WEB-INFO 的目录下
方法二:将 urlrewrite3.2.dtd 放到 tomcat 的 bin 目录下,这个方法一劳永逸,所以我选的是这个
urlrewrite3.2.dtd 这个文件可以在文章的最下面下载,源码包里我没有放这个文件,没问题之后,
访问:http://localhost:8080/urlrewrite-maven-example/ 留意地址栏的地址,你会发现,真实的地址没有被显示出来,你看到的是伪地址:

/index.html

/index.action

/user/param/fancy/8080.do

/user/param/fancy/8080.do , 这次是重定向了,注意留意地址栏地址,这回不再是伪地址了,而是真实的地址

源码:http://files.cnblogs.com/fancyzero/urlrewrite-maven-example.zip
DTD: http://files.cnblogs.com/fancyzero/urlrewrite3.2.dtd.zip
转自:http://www.cnblogs.com/fancyzero/archive/2012/06/10/urlrewrite.html
urlrewrite重写url(转)的更多相关文章
- UrlRewrite重写url
UrlRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址. 优点 (1)提高安全性 可以有效的避免一些参数名.ID等完全暴露在用户面前,如果用户随便乱输的话,不符合规则的 ...
- jsp重写url
众所周知,使用java web编程出来的网站都是.jsp结尾的,而别人的网站都是以.html结尾的,那么这种效果是怎么实现的呢?就是这篇文章产生的原因,jsp重写url需要设计到第三方架包urlrew ...
- 在Apache中使用mod_rewrite模块重写URL
如果有使用第三方框架做项目时,url路径是可以同过框架给的方法来设定的(如thinkphp),但如果使用原生php写的项目又想重写url,则可通过apache的一些设置来达到想要的效果. 在更改apa ...
- HttpContext.Current.RewritePath方法重写URL
if (!IsPostBack) { //如果请求ID为空,则重写URL为:~/index.aspx?ID=shouji.115sou.com if (Request.QueryString[&quo ...
- 利用URLRewriter重写url地址
首先,当然是下载URLRewriter了 download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDN ...
- 在js中获取query string 以及重写URL的函数
函数用途:如标题.1. 从URL中解析出參数,2.重写URL中的參数值 例如以下代码所看到的.包括了測试.能够直接copy到浏览器中,输入測试地址:localhost:xxx?a=1&b=2& ...
- 【转载】ASP.NET MVC重写URL制作伪静态网页,URL地址以.html结尾
在搜索引擎优化领域,静态网页对于SEO的优化有着很大的好处,因此很多人就想把自己的网站的一些网页做成伪静态.我们现在在网络上发现很多博客网站.论坛网站.CMS内容管理系统等都有使用伪静态这一种情况,伪 ...
- asp.net 重写URL方法和封装好的DLL
.net 重写URL方法和封装好的DLL URL重写方法DLL(2.0)
- JSP页面静态化总结之一使用URLRewrite实现url地址伪静态化
JSP页面静态化总结之一使用URLRewrite实现url地址伪静态化 1使用URLRewrite实现url地址伪静态化1.1URLRewirte的用处 1.满足搜索引擎的要求. 2.隐藏技术实现,提 ...
随机推荐
- [原][Java]eclipse 修改自动提示
下载 jar 链接:http://files.cnblogs.com/files/z5337/org.eclipse.jface.text_3.7.2.v20111213-1208.zip 或者这个: ...
- window server2008 r2 限制远程访问用户数量
在服务器端设置 修改组策略 1,开始-运行-gpedit.msc-计算机配置-管理模板-Windows组件-远程桌面服务-远程桌面会话主机-限制连接数量-开启并改为1
- 精《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #4 如何使用Git
HACK #4 如何使用Git 本节介绍Git的使用方法.Git是Linux内核等众多OSS(Open Source Software,开源软件)开发中所使用的SCM(Source Code Mana ...
- 好久不见(致win7)
7月8号,电脑上装了pgp,然后说让重启,重启之后蓝屏,自此,就一直蓝屏了 电脑装了双系统,工作时用centos,我不愿重装系统,怕centos受影响 网上说安装模式下可以卸载软件,可我在安全模式下, ...
- HTML常用技术
1. 使用a标签实现文件的上传下载 完整代码: <a class="btn btn-success btn-sm" href="http://sf.jb51.net ...
- 蚂蚁社招Java-第四轮电话面试【技术终面】
作者:听着歌过面试链接:https://www.nowcoder.com/discuss/64708来源:牛客网 蚂蚁社招Java-第四轮电话面试[技术终面] 转载 (耗时22分钟,其实聊得东西挺 ...
- 224. Basic Calculator + 227. Basic Calculator II
▶ 两个四则表达式运算的题目,第 770 题 Basic Calculator IV 带符号计算不会做 Orz,第 772 题 Basic Calculator III 要收费 Orz. ▶ 自己的全 ...
- eclipse liquibase 插件
http://marketplace.eclipse.org/category/free-tagging/liquibase http://marketplace.eclipse.org/market ...
- hive中分组取前N个值的实现
背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科 ...
- 关于进程exit后,内存释放释放的实践
最近碰到一个问题,或许也是小猿们都会碰到的问题:内存泄露. 都知道malloc后需要free才能释放内存,shmat后需要shmdt才能断掉内存区并使用IPC_RMID命令删除共享内存.那么如果是当前 ...