有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JSTL对象在url中,而不是在标记上下文中

因此,我正在编写一个带有JSP视图和JSTL标记的Spring3WebApp。它们通常工作得很好,但有一个控制器调用无法正确抓取标签

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)

共 (2) 个答案

  1. # 1 楼答案

    因为它是RedirectView。javadoc说:

    By default all primitive model attributes (or collections thereof) are exposed as HTTP query parameters (assuming they've not been used as URI template variables), but this behavior can be changed by overriding the isEligibleProperty(String, Object) method.

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

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

  2. # 2 楼答案

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

    下面是一个更好的示例(取自StackOverflow表达式语言代码):

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

    这里有两种可能的选择:

    1. 正如@SotiriosDelimanolis所述,这个URL的@Controller类应该接受请求参数,并将它们添加为请求属性。如果将来可以添加更多请求参数,将需要大量工作

    2. 使用EL中的${param}对象,该对象允许您访问请求参数。使用此选项,您应该将${status}更改为${param.status}。故事结束了