论坛首页 Java版 Webwork

困扰了一天的urlwriter问题:

浏览 893 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-01-04
需求:将输入类似/test/abc-333-1.html的url转化为/test/333/1/abc-333-1.html的形式,
例如/test/abc-333-1.html 转为 /test/333/1/abc-333-1.html
/test/abc-11-2.html      转为 /test/11/2/abc-11-2.html
/test/abc-11-3.html      转为 /test/11/3/abc-11-3.html
,我写的urlwriter的rule如下:
<rule>  
        <note>
        </note>
        <from>/test/(.*?)\\-([0-9]{1,3})\\-[0-9]{1,}\\.html$</from>
        <to>/test/$2/$3/$1-$2-$3.html</to>
    </rule>

   
输入url:http://localhost:8080/test/AD-Sound-Recorder-3-0.html
提示错误如下:
HTTP Status 404 - /test/AD-Sound-Recorder-3-0.html

--------------------------------------------------------------------------------

type Status report

message /test/AD-Sound-Recorder-3-0.html

description The requested resource (/test/AD-Sound-Recorder-3-0.html) is not available.

----------------------------------------------------------------------------------
从以上错误信息可以看出,该url地址没有转换(否则应该报找不到test/3/0/AD-Sound-Recorder-3-0.html)

翻开urlrewriter的文档,里面说urlrewriter的执行方式如下:
When executing a rule the filter will (very simplified) do something like this psuedo code:

   
Pattern.compile(<from> element);
    pattern.matcher(each request url);
    matcher.replaceAll(<to> element);
    if ( <condition> elements match && pattern matched ) {
       execute <run> elements (if any)
       perform <to> element (if any)
    }
也就是说把/test/(.*?)\\-([0-9]{1,3})\\-[0-9]{1,}\\.html$作为正则表达式来解析,于是另外写了一个
Test.java如下

public static void main(String[] args)
	{
		String url = "http://localhost:8080/test/Easy-Karaoke-Recorder--3-0.html";
		Pattern p = Pattern.compile("/test/(.*?)\\-([0-9]{1,3})\\-[0-9]{1,}\\.html$");
		Matcher mat = p.matcher(url);
		while(mat.find())
		{
			String str = mat.group();
			System.out.println(str);
		}
	}
打印的结果为test/Easy-Karaoke-Recorder--3-0.html,也就是说输入的Url可以用正则表达式解析出来,
可是在urlrewriter中不管用,请问是为什么?
   
最后更新时间:2008-01-03
先做一个简单的 url rewriter 测试,比如将 abc.html 转换到 abc.do,打开 URLRewriter log,确认 URLRewriter filter 是否在正常工作。 如果是 urlrewriter 没有正常工作的话,可以尝试显式声明 filter 所能感应的派发方式。

<filter-mapping>
  <filter-name>UrlRewriteFilter</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>FORWARD</dispatcher>
</filter-mapping>
   
0 请登录后投票
最后更新时间:2008-01-03
听我的吧。 LS给你的思想是正确的(从简单的做起),但是答案是错误的。


<rule> 
<note> 
</note> 
<from>/(.*?)\\-([0-9]{1,3})\\-[0-9]{1,}\\.html$</from> 
<to>/$2/$3/$1-$2-$3.html</to> 
</rule> 


也就是把/test去掉。

why?

form和to配置的url不要包含ctxpath。
to的比较特别,使用redirect,to才需要以/test开头。
此时/test可以用%{context-path}代替。

试一下吧,这是鲜蛋
   
0 请登录后投票
论坛首页 Java版 Webwork

跳转论坛:
JavaEye推荐