- 内容提要
- 作者简介
- 译者简介
- 前言
- HTTP
- Servlet 和 JSP
- 下载 Spring 或使用 STS 与 Maven/Gradle
- 手动下载 Spring
- 使用 STS 和 Maven/Gradle
- 下载 Spring 源码
- 本书内容简介
- 下载示例应用
- 第 1 章Spring 框架
- 第 2 章模型 2 和 MVC 模式
- 第 3 章Spring MVC 介绍
- 第 4 章基于注解的控制器
- 第 5 章数据绑定和表单标签库
- 第 6 章转换器和格式化
- 第 7 章验证器
- 第 8 章表达式语言
- 第 9 章JSTL
- 第 10 章国际化
- 第 11 章上传文件
- 第 12 章下载文件
- 第 13 章应用测试
- 附录 A Tomcat
- 附录 B Spring Tool Suite 和 Maven
- 附录 C Servlet
- 附录 D JavaServer Pages
- 附录 E 部署描述符
4.6 请求参数和路径变量
请求参数和路径变量都可以用于发送值给服务器。二者都是 URL 的一部分。请求参数采用 key=value 形式,并用“&”分隔。例如,下面的 URL 带有一个名为 productId 的请求参数,其值为 3:
http://localhost:8080/annotated2/view-product?productId=3
在传统的 servlet 编程中,可以使用 HttpServletRequest 的 getParameter 方法来获取一个请求参数值:
String productId = httpServletRequest.getParameter("productId");
Spring MVC 提供了一个更简单的方法来获取请求参数值:使用 org.springframework. web.bind.annotation.RequestParam 注解类型来注解方法参数。例如,下面的方法包含了一个获取请求参数 productId 值的参数。
public void sendProduct(@RequestParam int productId)
正如你所看到的,@RequestParam 注解的参数类型不一定是字符串。
路径变量类似请求参数,但没有 key 部分,只是一个值。例如,在 annotated2 中,view-product 动作映射到如下 URL:
/view-product/<em>productId</em>
其中的 productId 是表示产品标识符的整数。在 Spring MVC 中,productId 称为路径变量,用来发送一个值到服务器。
清单 4.11 中的 viewProduct 方法演示了一个路径变量的使用。
清单 4.11 使用路径变量
@RequestMapping(value = "/view-product/{id}")
public String viewProduct(@PathVariable Long id, Model model) {
Product product = productService.get(id);
model.addAttribute("product", product);
return "ProductView";
}
为了使用路径变量,首先需要在 RequestMapping 注解的值属性中添加一个变量,该变量必须放在花括号之间。例如,下面的 RequestMapping 注解定义了一个名为 id 的路径变量:
@RequestMapping(value = "/view-product/{id}")
然后,在方法签名中添加一个同名变量,并加上 @PathVariable 注解。注意清单 4.11 中 viewProduct 的方法签名。当该方法被调用时,请求 URL 的 id 值将被复制到路径变量中,并可以在方法中使用。路径变量的类型可以不是字符串。Spring MVC 将尽力转换成一个非字符串类型。这个 Spring MVC 的强大功能会在第 5 章中详细讨论。
可以在请求映射中使用多个路径变量。例如,下面定义了 userId 和 orderId 两个路径变量。
@RequestMapping(value = "/view-product/{userId}/{orderId}")
请直接在浏览器中输入如下 URL,来测试 viewProduct 方法的路径变量。
http://localhost:8080/annotated2/view-product/1
有时,使用路径变量时会遇到一个小问题:在某些情况下,浏览器可能会误解路径变量。考虑下面的 URL。
http://example.com/context/abc
浏览器会(正确)认为 abc 是一个动作。任何静态文件路径的解析,如 CSS 文件,将使用 http://example.com/context 作为基本路径。这就是说,若服务器发送的网页包含如下 img 元素:
<img src="logo.png"/>
该浏览器将试图通过 http://example.com/context/logo.png 来加载 logo.png。
然而,若一个应用程序被部署为默认上下文(默认上下文路径是一个空字符串),则对于同一个目标的 URL,会是这样的:
http://example.com/abc
下面是带有路径变量的 URL:
http://example.com/abc/1
在这种情况下,浏览器会认为 abc 是上下文,没有动作。如果在页面中使用<img src=“logo. png”/>,浏览器将试图通过 http://example.com/abc/logo.png 来寻找图像,并且它将找不到该图像。
好在,我们有一个简单的解决方案,即通过使用 JSTL 标记的 URL(第 8 章中将会详细讨论 JSTL)。标签会通过正确解析 URL 来修复该问题。例如,annotated2 中所有的 JSP 页面导入的所有 CSS,从
<style type="text/css">@import url(css/main.css);</style>
修改为
<style type="text/css">
@import url("<c:url value="/css/main.css"/>");
</style>
若程序部署为默认上下文,链接标签会将该 URL 转换成如下所示形式:
<style type="text/css">@import url("/css/main.css");</style>
若程序不在默认上下文中,则它会被转换成如下形式:
<style type="text/css">@import url("/annotated2/css/main.css");
</style>
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论