在JSP视图中,Spring 3.0.6 MVC @PathVariable和@RequestParam为空/空

时间:2011-11-27 16:06:23

标签: spring spring-3 spring-annotations

我一直试图设置一个非常简单的控制器/视图,但却无法使其正常工作。在我的web.xml中,我定义了一个名为<servlet>的{​​{1}},运行正常。在servlet-context.xml中,我设置了:

servlet-context.xml

等等。我的理解是,这是使用<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" <...other stuff in here... /> <mvc:annotation-driven /> 注释所需的全部内容。

在我的控制器中,我有:

@

@RequestMapping(value="/student/{username}/", method=RequestMethod.GET) public String adminStudent(@PathVariable String username, @RequestParam String studentid) { return "student"; } 视图中,我有:

student.jsp

当我向<p>This is the page where you would edit the stuff for ${username}.</p> <p>The URL parameter <code>studentid</code> is set to ${studentid}.</p> 发出请求时,我得到了我期望的视图,但所有变量都是空白或为空:

http://localhost:8080/application/student/xyz123/?studentid=456

我怀疑我的<p>This is the page where you would edit the stuff for .</p> <p>The URL parameter <code>studentid</code> is set to .</p> web.xml设置方式存在问题,但我无法找到罪魁祸首。据我所知,在任何日志中都没有显示任何内容。


更新:我的代码基于spring-mvc-showcase

的这一部分
servlet-context.xml

......对我来说很好。我无法理解为什么这个例子有效但我的不行。是因为他们doing something different@RequestMapping(value="pathVariables/{foo}/{fruit}", method=RequestMethod.GET) public String pathVars(@PathVariable String foo, @PathVariable String fruit) { // No need to add @PathVariables "foo" and "fruit" to the model // They will be merged in the model before rendering return "views/html"; }

servlet-context.xml

4 个答案:

答案 0 :(得分:17)

创建模型贴图并将参数名称/值对添加到其中:

@RequestMapping(value="/student/{username}/", method=RequestMethod.GET)
public String adminStudent(@PathVariable String username, @RequestParam String studentid, Model model) {
    model.put("username", username);
    model.put("studentid", studentid);

    return "student";
}

答案 1 :(得分:7)

啊哈!最后想出来了。

spring-mvc-showcase正在使用Spring 3.1,根据SPR-7543,它会自动将@PathVariable公开给模型。

正如@duffymo和@JB Nizet所指出的那样,为模型添加model.put()是为了早于3.1的Spring版本。

Ted Young用Spring: Expose @PathVariables To The Model向我指出了正确的方向。

答案 2 :(得分:4)

@PathVariable表示应该从调用的URL的路径中提取带注释的方法参数。 @RequestParam表示必须从请求参数中提取带注释的方法参数。这些注释都不会导致带注释的参数被放入请求,会话或应用程序范围中。

${username}表示“在响应中写入用户名属性的值(在页面中找到,或者在请求,会话或应用程序范围中找到)”。由于您没有在任何这些范围中包含任何用户名属性,因此它不会写任何内容。

如果方法返回了ModelAndView对象,并且模型包含username属性和studentid属性,则代码将起作用。

答案 3 :(得分:2)

假设此网址http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013(今天获取用户1234的发票)

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
      model.put("userId", user);
      model.put("date", dateOrNull);

}