11

我一直在尝试设置一个非常简单的控制器/视图,但无法使其工作。在我的web.xml中,我定义了一个<servlet>被调用的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,我得到了我期望的视图,但所有变量都是空白或 null:

<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.xmlservlet-context.xml设置方式的问题,但我在任何地方都找不到罪魁祸首。据我所知,任何日志中都没有显示任何内容。


更新:我的代码基于spring-mvc-showcase的这一部分:

@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吗?

<annotation-driven conversion-service="conversionService">
    <argument-resolvers>
        <beans:bean class="org.springframework.samples.mvc.data.custom.CustomArgumentResolver"/>
    </argument-resolvers>
</annotation-driven>
4

4 回答 4

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";
}
于 2011-11-27T16:17:40.193 回答
7

啊哈!终于想通了

根据SPR-7543spring-mvc-showcase,它正在使用 Spring 3.1,它将自动将@PathVariables 暴露给模型。

正如@duffymo 和@JB Nizet 所指出的,添加到模型中model.put()是3.1 之前的Spring 版本要做的事情。

Ted Young 用Spring 为我指明了正确的方向:将 @PathVariables 暴露给模型

于 2011-11-27T17:24:52.590 回答
4

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

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

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

于 2011-11-27T16:18:10.277 回答
1

假设这个 Url 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);

}
于 2016-07-15T12:49:22.327 回答