我一直试图设置一个非常简单的控制器/视图,但却无法使其正常工作。在我的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
答案 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)
@PathVariable
是从uri获取一些占位符(Spring称之为URI模板)
- 见Spring Reference Chapter 16.3.2.2 URI Template Patterns @RequestParam
是获取参数 - 请参阅Spring Reference Chapter 16.3.3.3 Binding request parameters to method parameters with @RequestParam 假设此网址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);
}