0

所以我正在编写一个带有 JSP 视图和 JSTL 标签的 Spring 3 webapp。它们通常工作得很好,但是有一个控制器调用不能正确抓取标签。

ModelAndView mav = new ModelAndView(
    new RedirectView(RequestUtil.getWebAppRoot(request) + clientShortName, false)
);
mav.addObject("status","Session for interface successfully removed");
return mav;

因此,当我在我的视图中引用它时,我将有一行如下所示:

<p>status="${status}"</p>

仅显示为:

status=""

现在我通常会认为这是导致我的视​​图呈现不正确的原因,但我实际上发现这个位置附加到我的 URL:

?status=Session+for+interface+zFXDEV3+successfully+removed

所以这给我留下了两个问题:

  1. 为什么我不能从 JSTL 标记中引用对象?
  2. 如果我无法将它作为标签上下文的一部分,那么它在 URL 中做了什么?

对于任何想知道的人来说,类类型是:

org.springframework.web.servlet.view.RedirectView.RedirectView
org.springframework.web.servlet.ModelAndView.ModelAndView(View view)
4

2 回答 2

3

这不是 JSTL,而是Expression Language(通常称为 EL)。问题是 EL${status}会查看请求属性中的变量,但是当您重定向到 JSP 时,您的状态是请求参数而不是请求属性(请注意,这是重定向到页面时的正常行为)。

举个更好的例子(取自 StackOverflow 表达式语言代码),执行如下:

<%
  String status = (String) pageContext.findAttribute("status");
  if (status != null) {
      out.print(status);
  }
%>

您在这里有两种可能的选择:

  1. 正如@SotiriosDelimanolis 所述,您@Controller的此 URL 的类应采用请求参数并将它们添加为请求属性。如果您将来可以添加更多请求参数,则需要做很多工作。

  2. 使用${param}来自 EL 的对象,该对象使您可以访问请求参数。使用它,您应该更改${status}${param.status}. 故事结局。

于 2013-03-26T14:54:33.523 回答
1

因为它是一个RedirectView. javadoc 说:

默认情况下,所有原始模型属性(或其集合)都作为 HTTP 查询参数公开(假设它们没有被用作 URI 模板变量),但是可以通过覆盖 isEligibleProperty(String, Object) 方法来更改此行为。

因此,您的String对象将作为查询参数添加到新的重定向请求中。它们不再可用作新请求的模型/请求属性。

处理重定向 URL的@Controller应该将属性重新添加到模型中。

于 2013-03-26T14:40:23.593 回答