`
zhb870815
  • 浏览: 25007 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

urlrewriter使用时请注意

阅读更多
   上午开发小组开常规的开发进度会议,在讨论使用urlrewriter在项目中担任URL重写的时候有点争议,我坚持使用urlrewriter重写URL需要配合JSTL标签中的c:url一起使用,才能真正达到重写所有页面上的URL的目的,一个同事说可以不需要使用这个标签也可以达到重写的目的,为了解决这个争议,决定写一个DEMO来进行验证我的说法。首先新建一个项目,导入必要的依赖。
 
                   <dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>1.1.2</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.tuckey</groupId>
			<artifactId>urlrewritefilter</artifactId>
			<version>3.1.0</version>
		</dependency>


在WEB.XML中进行过滤器的配置
 <filter>
	  <filter-name>rewriteFilter</filter-name>
	  <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
	  <init-param>
	   <param-name>confPath</param-name>
	   <param-value>/WEB-INF/urlrewrite.xml</param-value>
	  </init-param>
 </filter>
 <filter-mapping>
	  <filter-name>rewriteFilter</filter-name>
	  <url-pattern>*.jsp</url-pattern>
	  <dispatcher>REQUEST</dispatcher>
	  <dispatcher>FORWARD</dispatcher>
 </filter-mapping>
 <filter-mapping>
	  <filter-name>rewriteFilter</filter-name>
	  <url-pattern>*.html</url-pattern>
	  <dispatcher>REQUEST</dispatcher>
	  <dispatcher>FORWARD</dispatcher>
 </filter-mapping>


在WEB-INF下新建一个urlrewrite.xml文件[color=red][/color]


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
    "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
   <urlrewrite>
	<rule>
		<from>/index.html$</from>
		<to>/index.jsp</to>
	</rule>
    <outbound-rule>
    	<from>/index.jsp</from>
    	<to>/index.html</to>
    </outbound-rule>
</urlrewrite>


这个主要是测试用的,现在在根目录下新建一个index.jsp页面。代码如下

<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<%@ 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=GBK">
<title>Insert title here</title>
</head>
<body>
<a href="index.jsp">无标签的URL输出首页地址</a>
<br/>
<br/>
<br/>
<br/>
<a href="<c:url value='/index.jsp' />">有标签的URL输出首页地址</a>
</body>
</html>



启动容器,输入项目路径 http://localhost:8080/index.html,输出如下HTML代码


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
<a href="index.jsp">无标签的URL输出首页地址</a>
<br/>
<br/>
<br/>
<br/>
<a href="/index.html;jsessionid=62408E24FEA0F75AFB9B0CACA9314006">有标签的URL输出首页地址</a>

</body>
</html>



综上所述,urlrewriter如果要重写成功,要把需要重写的URL用标签输出,直接输出URL是不会重写URL的!
分享到:
评论
17 楼 zhb870815 2010-11-20  
xiechao240 写道
楼主:你的
dependency> 
    <groupId>taglibs</groupId> 
    <artifactId>standard</artifactId> 
    <version>1.1.2</version> 
这些代码是干什么的啊,我没看懂。能不能说一下,qq:576473706  谢超。

项目管理工具maven添加项目依赖
16 楼 xiechao240 2010-11-19  
楼主:你的
dependency> 
    <groupId>taglibs</groupId> 
    <artifactId>standard</artifactId> 
    <version>1.1.2</version> 
这些代码是干什么的啊,我没看懂。能不能说一下,qq:576473706  谢超。
15 楼 zhb870815 2010-11-19  
Howareyou73 写道
zhb870815 写道
蔡华江 写道
我赞成不用。因为静态化需求时使用html来进行请求,那么意味着所有的链接应该都可以由html来调用。那么为什么不直接使用html后缀,逻辑性更强,还避免了转出时进行转换。

如果有天产品不想用html,而想用htm或者shtml,那是不是所有的页面都要进行修改?


其实这个只是欺骗用户,让他不知道你是用什么语言开发的。而且还影响效率建议还是用Apache web 服务器,进行配置

产品部要求我们所使用的URL有利于WEB站点的SEO优化,同时我们使用struts2零配置进行URL配置,这样使得URL非常的不友好
14 楼 zhb870815 2010-11-19  
yongtree 写道
官方说的很清楚啊,需要使用JSTL的c:url标签或者<%=response.encodeURL('url')%>来达到渲染页面时,进行反向的URL重写。有讨论这个的必要吗?

http://www.po-soft.com/blogs/tag/url重写/

是没有必要啊,但是有人非得讨论,就写了一个DEMO,任何一个东西都有他的好处和坏处,我们能做的只是尽量能用好他们,至于在项目中是否需要使用这项技术,这个东西谁也说不准,这个项目不用,没准哪天哪个项目又要用,所以学到了东西总归是没有坏处的
13 楼 yongtree 2010-11-19  
官方说的很清楚啊,需要使用JSTL的c:url标签或者<%=response.encodeURL('url')%>来达到渲染页面时,进行反向的URL重写。有讨论这个的必要吗?

http://www.po-soft.com/blogs/tag/url重写/
12 楼 erikchang 2010-11-18  
url重写某种程度上是为了使request更加友好,比如javaeye应该就是用了,论坛的帖子请求为topic/xxxx?xxxx这样,原始的可能是topic.xx?id=xxx
11 楼 sunspring 2010-11-18  
LZ,再仔细测测吧,会有别的发现的。
10 楼 Foxswily 2010-11-18  
urlrewrite这种功能还是留给apache或者nginx的好,后台处理不该承担这责任
9 楼 因为java所以java 2010-11-18  
个人觉得这个与真实的静态化配合使用比较好,如果单为伪静态而耗损这样的性能不值得,当然部分页面用一下也是可以的。另外,在用urlrewrite的时候是要经过服务器解析的(就是web.xml配置的经过urlrewrite过滤器),所以直接写自然不行了。
8 楼 mtnt2008 2010-11-18  

楼主,urlrewriter和JSTL标签中的c:url有什么关系吗?

urlrewriter主要是URL规则的一种对应转换;而JSTL标签中的c:url只是对URL中特殊字符,比如:中文,进行了URL编码,还有对不支持cookie的浏览器,jsessionid附加到了URL的后面.

所以,在urlrewriter中使用不使用c:url完全是功能的需要.比如:你例子中的首页,就完全没有必要使用
7 楼 Howareyou73 2010-11-18  
zhb870815 写道
蔡华江 写道
我赞成不用。因为静态化需求时使用html来进行请求,那么意味着所有的链接应该都可以由html来调用。那么为什么不直接使用html后缀,逻辑性更强,还避免了转出时进行转换。

如果有天产品不想用html,而想用htm或者shtml,那是不是所有的页面都要进行修改?


其实这个只是欺骗用户,让他不知道你是用什么语言开发的。而且还影响效率建议还是用Apache web 服务器,进行配置
6 楼 panshunchang 2010-11-18  
jstl标签可以解析到urlrewriter的啊?那不错,你的方法我很赞同啊,如果直接写index.html虽然简单,但是确实不灵活,如果一般不会轻易改变为htm shtml的话,直接写html也是不错的选择
5 楼 蔡华江 2010-11-18  
zhb870815 写道
蔡华江 写道
我赞成不用。因为静态化需求时使用html来进行请求,那么意味着所有的链接应该都可以由html来调用。那么为什么不直接使用html后缀,逻辑性更强,还避免了转出时进行转换。

如果有天产品不想用html,而想用htm或者shtml,那是不是所有的页面都要进行修改?

如果你有这个需求。。。urlwriter当然可以。。。
虽然我个人认为这个有点。。

当然并不意味着不用就不能实现,web总是基于请求的,如果你有这个需求,在转入时候将html转为htm/shtml又何仿。
要知道,在页面中使用html,可以让代码清淅,且方便跳转,在IDE下支持就更好了。
<a href="b.html"/>你一看就知道到了那里,
如果加上c:out,总是多隔了一层。
同样,如果命名真的很规范你也可以无视。。
4 楼 7454103 2010-11-18  
这个插件用着还可以啦!
效果基本都能达到!
   jstl  <%= response.encodeURL("/index.jsp") %>  都可以!

这个只是视觉效果! 并且附加一定的损耗!  不建议全部使用!
在适当的地方用用就OK!
3 楼 zhb870815 2010-11-17  
蔡华江 写道
我赞成不用。因为静态化需求时使用html来进行请求,那么意味着所有的链接应该都可以由html来调用。那么为什么不直接使用html后缀,逻辑性更强,还避免了转出时进行转换。

如果有天产品不想用html,而想用htm或者shtml,那是不是所有的页面都要进行修改?
2 楼 蔡华江 2010-11-17  
我赞成不用。因为静态化需求时使用html来进行请求,那么意味着所有的链接应该都可以由html来调用。那么为什么不直接使用html后缀,逻辑性更强,还避免了转出时进行转换。
1 楼 aabcc 2010-11-17  
说了好多,其实LZ就是想问问不用 标签怎么输出 urlrewrite里面 outbound-rule配的对应连接是吗?

<%= response.encodeURL("/index.jsp") %>

相关推荐

Global site tag (gtag.js) - Google Analytics