V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
PEP4JASON
V2EX  ›  问与答

SpringMVC 框架如何实现统一 URL

  •  
  •   PEP4JASON · 2016-10-24 10:11:08 +08:00 · 4379 次点击
    这是一个创建于 2957 天前的主题,其中的信息可能已经有所发展或是发生改变。

    期望的结果是 /xxx.do?service=login 登录, /xxx.do?service=register 注册, 就是前半截都是一致的 后半截不同 根据传参不通进入不同的控制器 请问这样能实现吗 能的话如何实现

    第 1 条附言  ·  2016-10-24 10:57:35 +08:00
    第 2 条附言  ·  2016-10-24 14:42:19 +08:00
    urlrewrite 不能匹配 "?" 号后的规则?
    第 3 条附言  ·  2016-10-24 15:59:49 +08:00
    貌似 urlrewrite 并不是解决方案...
    第 4 条附言  ·  2016-10-24 18:10:53 +08:00
    最后我自己写了一个拦截器做转发 感觉好蠢..................
    23 条回复    2016-10-24 18:20:56 +08:00
    shoaly
        1
    shoaly  
       2016-10-24 10:22:20 +08:00
    这个 url 好丑.... 为什么不直接是
    /login
    /register
    因为前面既然都完全一样了... 就可以省去
    PEP4JASON
        2
    PEP4JASON  
    OP
       2016-10-24 10:27:48 +08:00
    @shoaly 想通过一个 URL 参数来管理控制器 便于文档的编写
    murmur
        3
    murmur  
       2016-10-24 10:47:34 +08:00
    /xxx/login
    /xxx/register
    写在 2 个方法上 注解就好了
    ipeony
        4
    ipeony  
       2016-10-24 10:48:12 +08:00
    比较笨的方法。。用 @pathvariable
    PEP4JASON
        5
    PEP4JASON  
    OP
       2016-10-24 10:49:33 +08:00
    @Controller
    @RequestMapping("/XXX")
    ...class ...{
    @RequestMapping(params="service=register")
    ...fun(){
    }
    }
    ipeony
        6
    ipeony  
       2016-10-24 10:50:08 +08:00
    @ipeony 看花眼了
    PEP4JASON
        7
    PEP4JASON  
    OP
       2016-10-24 10:52:22 +08:00
    这个方法 只能作用于一个控制器里面 , 控制器的映射名不能重复 ,所以想另寻解决方案
    hellommd
        8
    hellommd  
       2016-10-24 11:14:47 +08:00
    简单点就是一个接口一个类,模块化,入口处根据接口名称利用 IoC 进行注入。
    varrily
        9
    varrily  
       2016-10-24 11:29:16 +08:00
    .do?method=xxx 这用法是 Struts 的用法, SpringMVC 更倾向于 RESTful 设计风格,至于截图的 api ,也有类似的 JSON-RPC
    zhouzm
        10
    zhouzm  
       2016-10-24 12:54:10 +08:00
    SpringMVC 默认的 URL 映射不支持通过 param 定位到不同的 controller ,只能先用 URL 定位 controller ,然后再用 param 窄化到具体的方法。

    如果仅仅是为了调用者使用的话,编程的时候依然用 /login /register 写不同 controller ,然后用拦截器 Redirect url :
    /xxx.do?service=login => /login
    /xxx.do?service=register => /register
    参考:
    http://docs.spring.io/spring/docs/3.2.17.RELEASE/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor
    novaeye
        11
    novaeye  
       2016-10-24 13:50:48 +08:00
    PEP4JASON
        12
    PEP4JASON  
    OP
       2016-10-24 13:56:55 +08:00
    @zhouzm 这样的话 如何处理传参呢
    sherlocktheplant
        13
    sherlocktheplant  
       2016-10-24 14:00:11 +08:00
    @zhouzm 重定向会产生额外的请求

    这里最好的办法是开发的时候 URL 按正常的 RESTFul 规则写 部署的时候配置好 url rewrite
    PEP4JASON
        14
    PEP4JASON  
    OP
       2016-10-24 14:03:07 +08:00
    @novaeye !! 一语道破, 之前怎么没想到用 urlrewrite 呢 ..
    rails3
        15
    rails3  
       2016-10-24 14:03:12 +08:00
    nginx
    PEP4JASON
        16
    PEP4JASON  
    OP
       2016-10-24 14:47:03 +08:00
    @sherlocktheplant @novaeye 请教一下 urlrewrite 怎么匹配 问号后面的参数 , 试了半天- -
    PEP4JASON
        17
    PEP4JASON  
    OP
       2016-10-24 15:24:36 +08:00
    <urlrewrite use-query-string ="true">
    <rule>

    <from>/gateway.sv\?service=(\w+)$</from>

    <to>/$1.do</to>

    </rule>
    </urlrewrite>

    这样写 多一个参数都进不去..
    PEP4JASON
        18
    PEP4JASON  
    OP
       2016-10-24 16:40:55 +08:00
    @rails3 捧油 详细点呢 , nginx 的重写跟 urlrewrite 好像作用差不多
    PEP4JASON
        20
    PEP4JASON  
    OP
       2016-10-24 17:48:40 +08:00
    @hcymk2 感觉跟 urlrewrite 一样是有限制的 , 参数顺序 和一些转发的参数 都不好控制
    novaeye
        21
    novaeye  
       2016-10-24 17:57:47 +08:00
    试试这样写:
    <urlrewrite use-query-string ="true">
    <rule>
    <from>^/gateway.sv\?service=(.+?)&method=(.+?)&(.*)</from>
    <to>/$1/$2.do?$3</to>
    </rule>
    </urlrewrite>

    from: /gateway.sv?service=account&method=getUser&ooo=xxx&aaa=bbb
    to: /account/getUser.do?ooo=xxx&aaa=bbb
    PEP4JASON
        22
    PEP4JASON  
    OP
       2016-10-24 18:06:50 +08:00
    @novaeye 这样写是规定了 第一个参数必须是 service ,感觉用起来不合理
    novaeye
        23
    novaeye  
       2016-10-24 18:20:56 +08:00
    @PEP4JASON 要省事当然肯定要牺牲一些细节了. 自己写 HandlerInterceptor 也是一个不错的办法的, 可以获得更精细的控制和处理, 其实原理都是一样的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3514 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:47 · PVG 12:47 · LAX 20:47 · JFK 23:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.