问题:页面通过"/servlet/detail?magid=520&categoryId=205“来访问一个servlet,这个链接在IE地址栏上给人家看起来很不舒服,想把它伪装一下变成别的地址,例如想把它伪装成:/servlet/detail/520_205.html 或者其他的url地址那该怎么实现了?
【注意:页面连接不是“/servlet/detail/520_205.html “而是“/servlet/detail?magid=520&categoryId=205”】
urlrewrite.xml配置:
错误代码:
<urlrewrite>
<rule>
<from>/servlet/detail/([0-9]+)_([0-9]+).html</from>
<to>/servlet/detail?magid=$1&categoryId=$2</to>
</rule>
</urlrewrite>
有很多新手刚开始就认为这样配置就能解决了上面提问的问题。其实错误,这样页面只能通过:”/servelt/detail/24_42.html ” 来访问,访问这个地址时它会forward到/servlet/detail?magid=24&categoryid=42这个servlet。如果我们页面通过“/servlet/detail?magid=24&categoryid=42”这样来访问的话,是不会被重写的。这是新手的常遇到的一个问题。
正确代码:
<urlrewrite>
<rule>
<from>/servelt/detail/([0-9]+)_([0-9]+).html</from>
<to>/servelt/detail?magid=$1&categoryId=$2</to>
</rule>
<outbound-rule>
<from>/servlet/detail\?magid=([0-9]+)&categoryId=([0-9]+)</from>
<to>/servlet/detail/$1_$2.html</to>
</outbound-rule>
</urlrewrite>
通过上面的配置基本上实现了上面的提出的问题。
1:通过:“/servlet/detail?magid=24&categoryid=42”来访问,得在<outbound-rule>标签中配置,同时还得在<rule>中配置相关信息。如果rule中没有配置,会找不到相关的资源信息,抱404错误
2:上面的配置文件得注意的地方:在<outbound-rule>中的特殊符号“?”“&”等得转义。不然的话也会出错,不能被重写。像上面的“outbound-rule>from标签中路径中如果出现“?”问号的话,记得要转义,“\?”。
3:jsp中,上面提出的问题中,在页面如果直接写<a href="/servlet/detail?magid=24&categoryid=42"/>这样也是错误的,同样也没办法被重写。
它只能用在response.encodeURL()或者jstl中c:url中,才会被重写。这个也是容易犯错的地方。
jsp:页面关键代码:
<a href="<c:url value='/servlet/detail?magid=3934&categoryId=3'/>">JSTl c:URL</a><hr/>
<a href="<%=response.encodeUrl("/servlet/detail?magid=3934&categoryId=3") %>">response EncodeURL</a>
4:如果想在<outbound-rule>中定义多个from to标签这个是不可以的,<outbound-rule>中只能定义一个from to 标签。这个是我在程序中测试得出来的结论。只能定义一对from to标签是在个人测试得出来的结论,如果您测试出来不是这样的话,请给我指正,评判。
5:通过上面的urlrewrite.xml的配置, <a href=”servlet/detail?44_77.html">测试</a>这样子来访问也是可以被重写的。也就是相当于双向。
需要转化的链接不能直接写在a标签中,需要写在c:url或其他服务器需要解析的变量中,这样才能对其重新显示
注意:<rule>标签可以单独的存在。而<outbound-rule>必须要和<rule>标签成对出现。而且在页面的时候需要<c:url>标签来转换成<rule>所对应的规则。
转自:http://hi.baidu.com/allen_zzw/item/e2d16a539fdf41a2acc857b2