【问题标题】:Mapping same URL to different controllers in spring based on query parameterSpring根据查询参数将相同的URL映射到不同的控制器
【发布时间】:2011-09-20 21:22:52
【问题描述】:

我正在使用基于 spring 注释的控制器。我希望我的 URL /user/messages 映射到某个控制器 a 如果查询参数标签存在,否则映射到某个不同的控制器 b。这是必需的,因为当存在参数标记时,可以存在更多参数以及我想在不同控制器中处理的参数,以保持实现干净。春天有什么方法可以做到这一点。这个问题还有其他优雅的解决方案吗?

【问题讨论】:

    标签: spring url mapping


    【解决方案1】:

    可以使用@RequestMapping注解的params属性根据Http参数选择控制器方法。

    看这个例子:

    @RequestMapping(params = "form", method = RequestMethod.GET)
    public ModelAndView createForm() {
        ...
    }
    
    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView list() {
        ...
    }
    

    它是类似 Spring ROO 使用的 REST 样式:如果请求包含参数 forms,则使用 createForm 处理程序,否则使用 list 方法。

    【讨论】:

    • 听起来不错,稍后会尝试...暂时我找到了一种替代方法,例如 @RequestParam(value="tag", required=false) 然后检查'tag' 参数的空值
    【解决方案2】:

    如果你想走 Spring 路线,你可以查看提到的 HandlerInterceptor here。拦截器可以查看您的查询参数并将链接重定向到可以被另一个 SimpleUrlMapper 捕获的其他内容。

    另一种方式是将其发送到单个控制器,如果查询参数为“b”,则让控制器转发到另一个动作。

    【讨论】:

    • HandlerInterceptor 听起来很酷,但目前我认为我会采用第二种方法。我有点困惑如何检查基于弹簧的控制器中是否存在某些参数。即使我知道某些查询参数是否存在,那么我需要在控制器内部进行检查以根据该参数采取行动, 所以 if(tag==someValue) 那么我会做 x 但如果没有名为 'tag' 的参数如何处理?
    • @kcr:不确定我是否理解这个问题,但您可以在控制器中使用 HttpServletRequest 并调用 getParameterMap ,它应该为您提供当前请求的键和值映射。然后,您可以查询 Map 以查看参数是否存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    相关资源
    最近更新 更多