服务器是apache+tomcat
项目是webwork+spring做的
需求是要求地址大小写都可以访问。
现在的地址是/news/newsDetail.do?newsId=50
要求/news/newsdetail.do?newsid=50也能访问
我做了个filter,将链接地址都转成了小写。
可是这样的话,webwork就找不到小写的action
(以前的格式是/news/newsDetail.do) 那么namespace是/news,action的name是newsDetail
转成小写后的地址是/news/newsdetail.do,那么namespace是/news,action的name是newsdetail
所以找不到对应的action
There is no Action mapped for namespace / and action name searchdata.
请问该怎么做?一个很傻的办法是,将webwork里的action的id都写成小写

解决方案 »

  1.   

    有朋友建议我自己重写DefaultActionMapper,自己看了看DefaultActionMapper的代码,并没有找到对应action name部分的代码。
    而且另外一个问题出来了。
    即使将webwork里的action的id都写成小写,webwork找到了对应的action,(当然只是个假设,应为不只是更改一个action配置,是个已运营项目,旧的action有几百个了,每个action都加一个小写的映射,没有从根本上解决问题),参数传递又会出问题。
    newsDetail.do?newsId=50 的链接,webwork会自动将50设置到newsId上,
    而newsdetail.do?newsid=50,webwork没法自动设置了,因为java是区分大小写的(newsId和newsid是不同的)希望各位有类似经验的,给指点下。
      

  2.   

    action不改类的话就小写映射,参数的话,用getParameterNames()枚举出来转化小写再set进去,取值的时候用全部用小写
      

  3.   

    把映射的配置文件写两个,给现在的每个action加一个小写的映射
    这样action找不到的问题是解决了。
    可是参数的传递还是有问题。
    参数是按照bean的标准写的,所以webwork才能将其数值准确的填充到bean中。
    参数也用了小写后,数据就填充不进去了。楼上的方法,处理一个action还行,关键是现在的action很多,根本处理不过来。
    set和get都是eclipse根据标准的bean自动生成的。
    每个set和get都自己写小写的话,根本不现实。
      

  4.   

    重写DefaultActionMapper
    假设action的id为testWeb
    如果用户输入的是testWeb,原有的映射关系可以找到相应的action
    如果用户输入的是testweb,则将id都转换成小写的在进行匹配
    总而言之,在DefaultActionMapper类里做两次匹配查找,一次是和id比较,另外一次是把id转换成小写的再进行比较。
      

  5.   

    虽然我也没做个,但也还期待好的答案。
    能不能,利用action的插件机制,为扩充点,在action-config.xml提交name路径到ActionProcess的时候
    把name属性转成小写呢
      

  6.   

    name到路径转成小写,找到大小的action。
    肯定是可以的,虽然现在我还没找到那个需要重写的方法。可是参数呢,参数也有大小写的,这个就比较复杂了。
      

  7.   

    不好做。
    入口要【大小写都可以访问】
    出口是【大小写不同的】webwork
    到你们的服务器的 LOG 内找出各种路径。(newsDetail,newsId,...)
    在你的 filter 内,做比较,有的话就转成上面合适的 ACTION/ID。
      

  8.   

    问题没有完全得到解决,仍然结账了。
    现在我的解决方案是,只把主要的几个地址做了大小写转换,而不是所有的路径。
    实现方法是:
    1.给需要做大小写不敏感的action都写一个小写的别名(newsDetail和newsdetail指向同一个Action,利用webwork的别名)
    2.对于象newsId这样的参数,在model里写一个setNewsid()方法,将newsid的值传给newsId以上策略只能针对已知的action和已知的参数,基本可以解决一些问题。