5

简而言之,如何在 webflow 视图 jsp 中使用 EL 获取完整的查询字符串?这就是我想要做的:

<span class="forgot-password">
  <a href="forgotPasswordRequest?<%=request.getQueryString() %>">
    <spring:message code="screen.welcome.link.forgotPassword" />
  </a>
</span>

除了我想使用 EL 而不是 scriptlet <%=request.getQueryString() %>。使用 获取任何单个参数似乎很容易${param.someParameterName},但我想要整个事情。更具体地说,我使用CAS作为 SSO 提供程序。为了进行身份验证,应用程序将使用包含参数的查询字符串将其登录重定向到 CAS,该参数service是身份验证成功后要返回的 URL。像这样的东西:

?service=http%3A%2F%2Fmysite.com%3A9080%2Fwelcome

我的 CAS 登录页面有一个忘记密码 webflow 的链接。我需要将该服务参数传播到其他网络流。所以我可以做这样的事情:

<span class="forgot-password">
  <a href="forgotPasswordRequest?service=${param.service}">
    <spring:message code="screen.welcome.link.forgotPassword" />
  </a>
</span>

但后来我失去了所有的 URL 转义。此外,如果将来我想保留其他参数,它们也会丢失。

scriptlet 目前可以工作,但它很难看,我不喜欢在我的演示文稿中包含代码(因为这是真正的 java 代码),即使它很微不足道。EL 无疑是一个更优雅的解决方案。

我查看了spring 文档中列出的所有特殊 EL 变量,但仍然无法找到获取完整 queryString 的方法。

- - - - - - - - - - - - - - - - 更新 - - - - - - - - - ---------------

好的,所以我正在做一些基础......原来ExternalContext接口有一个getNativeRequest()这是实际的HttpServletRequest对象。从那里我可以得到完整的查询字符串:

externalContext.getNativeRequest().getQueryString()

所以现在我假设由于有一个名为 externalContext 的特殊 EL 变量,我会这样做:

${externalContext.nativeRequest.queryString}

正确的?错误的!事实证明,该externalContext变量在 JSP 页面中不可用。有谁知道为什么?但是,还有flowRequestScope,它可用于 JSP 并且有一个getExternalContext方法,所以现在我可以这样做:

${flowRequestScope.externalContext.nativeRequest.queryString}

酷,这行得通……但为什么有必要呢?为什么只有一些特殊 EL 变量被推送到 JSP 页面,为什么其中一些变量会发生变化(viewScope似乎它的所有值都提升到了根级别,所以 viewScope.commandName 在 JSP 中被引用为 ${commandName}艾尔)?我一定遗漏了 WebFlow 工作方式中的一些基本内容。有人可以指出我正确的方向吗?

4

1 回答 1

0

在 webflow 中,范围图本质上是为了便于区分服务器上的控制逻辑。在直接的 Spring MVC 中,这将是您的控制器,但在 webflow 中,您的流程或多或少直接用于此目的。实际上,您放入范围映射中的所有内容都会汇总到请求属性中以在 JSP 上使用,但请求范围除外,该范围在流程返回时被显式销毁。这就是为什么 viewScope.commandName 在 JSP 中可用的原因——因为它与其他范围一样,被汇总到一个大型请求属性映射中,然后将其放入请求中以供您的 JSP 访问。

不同之处在于首先使用寿命较低的范围。较低的作用域总是优先于寿命较长的作用域,就像 Java 中的局部变量优先于同名的类级变量一样。因此,您需要确保使用唯一的参数名称以防万一,以免发生冲突。

如果您确实需要该值,最简单的方法是在流程中使用 set 标记将该值设置在适当的范围内,以便您更轻松地命名它,例如

<set name="viewScope.currentService" value="externalContext.nativeRequest.queryString" />

这样,您就可以在视图范围内使用 EL 变量“currentService”。您可能希望使用 on-render 或 on-entry 将此值存储到您的视图中。对于这个特定的值,我可能会使用 on-render,因为它可能会根据视图的呈现方式而改变,但无论哪种方式都可能无关紧要。

于 2012-10-28T18:29:30.560 回答