2012-11-03 127 views
49

如何让RequestMapping处理url中的GET参数? 例如,我有这个网址SpringMVC RequestMapping GET参数

http://localhost:8080/userGrid?_search=false&nd=1351972571018&rows=10&page=1&sidx=id&sord=desc 

(从jqGrid的)

应该怎么我的RequestMapping是什么样子?我想用HttpReqest

试过这种获得的参数:

@RequestMapping("/userGrid") 
    public @ResponseBody GridModel getUsersForGrid(HttpServletRequest request) 

,但它不工作。

回答

104

使用@RequestParam在你的方法参数,以便Spring能够约束他们,还用@RequestMapping.params阵列来缩小将被Spring使用的方法。示例代码:如果所有参数都存在从零检查和相关的东西,节省您的

@RequestMapping("/userGrid", 
params = {"_search", "nd", "rows", "page", "sidx", "sort"}) 
public @ResponseBody GridModel getUsersForGrid(
@RequestParam(value = "_search") String search, 
@RequestParam(value = "nd") int nd, 
@RequestParam(value = "rows") int rows, 
@RequestParam(value = "page") int page, 
@RequestParam(value = "sidx") int sidx, 
@RequestParam(value = "sort") Sort sort) { 
// Stuff here 
} 

这样Spring将只执行此方法。

+5

如果我不想每次都想要他们,他们可以选择吗?另外,如果我有很多参数呢?我可以用params创建一个类并把类作为@RequestParam吗?谢谢! –

+1

看到这篇文章http://stackoverflow.com/questions/4904092/with-spring-3-0-can-i-make-an-optional-path-variable知道可选参数 – Thomas

+1

这是否工作? Sort对象应该如何在URL中看起来像?我尝试使用'?object [key] = value'格式并且它不起作用 – ViniciusPires

0

你应该写一种模板到@RequestMapping

​​

现在这样定义以下您的业务方法:

@RequestMapping("/userGrid?_search=${search}&nd=${nd}&rows=${rows}&page=${page}&sidx=${sidx}&sord=${sord}") 
public @ResponseBody GridModel getUsersForGrid(
@RequestParam(value = "search") String search, 
@RequestParam(value = "nd") int nd, 
@RequestParam(value = "rows") int rows, 
@RequestParam(value = "page") int page, 
@RequestParam(value = "sidx") int sidx, 
@RequestParam(value = "sort") Sort sort) { 
............... 
} 

因此,框架将映射${foo}到合适@RequestParam

由于排序可以是ASC或DESC我把它定义为一个枚举:使用枚举

public enum Sort { 
    asc, desc 
} 

春季特惠非常好。

+4

如果什么参数才能改变? – ElderMael

+0

好点,@mael。我通常将Spring MVC用于Restful服务,其中参数被指定到URL本身,并且订单是预先定义的。我现在了解到'params'属性。 – AlexR

28

您可以添加@RequestMapping像这样:

@RequestMapping("/userGrid") 
public @ResponseBody GridModel getUsersForGrid(
    @RequestParam("_search") String search, 
    @RequestParam String nd, 
    @RequestParam int rows, 
    @RequestParam int page, 
    @RequestParam String sidx) 
    @RequestParam String sord) { 
+6

如果方法参数和请求参数具有相同的名称,那么您也不需要'value =“myname”'。我虽然赞成这个答案。 – david

+0

你是对的!查看更新 – Reimeus

+0

downvoter - 谨慎评论? – Reimeus

13

这将从请求中获得所有参数。仅用于调试目的:

@RequestMapping (value = "/promote", method = {RequestMethod.POST, RequestMethod.GET}) 
public ModelAndView renderPromotePage (HttpServletRequest request) { 
    Map<String, String[]> parameters = request.getParameterMap(); 

    for(String key : parameters.keySet()) { 
     System.out.println(key); 
     String[] vals = parameters.get(key); 
     for(String val : vals) 
      System.out.println(" -> " + val); 
    } 

    ModelAndView mv = new ModelAndView(); 
    mv.setViewName("test"); 
    return mv; 
} 
+0

是否还有可能获得所有映射参数+可选的尚未映射的参数?例如。检测客户端是否放入了未使用的参数。所以人们可以注册这个警告? – Strinder

+1

@Strinder(延迟响应,但这里供参考):如果你有方法参数'@RequestParam(defaultValue =“{}”)MultiValueMap ',那么你将得到一个'Map',其中每个值都是给定'key'的'String'列表。然后你可以遍历这个来看看是否有任何你不认识的“关键”。 'Map '也可以工作,如果你肯定知道不会有任何重复的参数。 – user2478398

2

如果你愿意改变你的URI,你也可以使用PathVariable

@RequestMapping(value="/mapping/foo/{foo}/{bar}", method=RequestMethod.GET) 
public String process(@PathVariable String foo,@PathVariable String bar) { 
    //Perform logic with foo and bar 
} 

注:第一个foo是路径的一部分,第二个是PathVariable

0

这工作在我的情况:

@RequestMapping(value = "/savedata", 
      params = {"textArea", "localKey", "localFile"}) 
    @ResponseBody 
    public void saveData(@RequestParam(value = "textArea") String textArea, 
         @RequestParam(value = "localKey") String localKey, 
         @RequestParam(value = "localFile") String localFile) { 
}