返回介绍

4.6 请求参数和路径变量

发布于 2025-04-22 20:09:59 字数 3111 浏览 0 评论 0 收藏

请求参数和路径变量都可以用于发送值给服务器。二者都是 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>

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。