除非我想使用 EL 而不是 scriptlet .使用 ${-6ren">
gpt4 book ai didi

java - EL 中的 Spring webflow 完整查询字符串

转载 作者:搜寻专家 更新时间:2023-11-01 00:57:37 25 4
gpt4 key购买 nike

简而言之,如何在 webflow View 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 提供商。为了进行身份验证,应用程序会使用包含参数 service 的查询字符串将其登录重定向到 CAS。这是验证成功后要返回的 URL。像这样:

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

我的 CAS 登录页面有一个忘记密码 webflow 的链接。我需要将该服务参数传播到其他 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 documentation 中列出的所有特殊 EL 变量 , 但仍然无法想出一种方法来获取完整的 queryString。

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

好吧,所以我正在做一些基础...结果是 ExternalContext接口(interface)有一个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 EL 中被引用为 ${commandName})?我一定是遗漏了 WebFlow 工作方式中的一些基本内容。有人可以指出我正确的方向吗?

最佳答案

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

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

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

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

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

关于java - EL 中的 Spring webflow 完整查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12750618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com