Luc*_*cas 5 java spring spring-mvc spring-webflow-2
简而言之,如何在webflow视图jsp中使用EL获取完整的查询字符串?这就是我想要做的:
<span class="forgot-password">
<a href="forgotPasswordRequest?<%=request.getQueryString() %>">
<spring:message code="screen.welcome.link.forgotPassword" />
</a>
</span>
Run Code Online (Sandbox Code Playgroud)
除了我想使用EL而不是scriptlet <%=request.getQueryString() %>.使用任何单个参数似乎很容易${param.someParameterName},但我想要整个事情.更具体地说,我使用CAS作为SSO提供商.为了进行身份验证,应用程序会使用包含参数的查询字符串将其登录名重定向到CAS,该参数service是成功进行身份验证后要返回的URL.像这样的东西:
?service=http%3A%2F%2Fmysite.com%3A9080%2Fwelcome
Run Code Online (Sandbox Code Playgroud)
我的CAS登录页面有一个忘记密码webflow的链接.我需要将该服务参数传播到其他Web流.所以我可以这样做:
<span class="forgot-password">
<a href="forgotPasswordRequest?service=${param.service}">
<spring:message code="screen.welcome.link.forgotPassword" />
</a>
</span>
Run Code Online (Sandbox Code Playgroud)
但后来我失去了所有的网址转义.此外,如果将来还有其他要保留的参数,它们也会丢失.
这个小脚本目前有效,但它很难看,我不喜欢在我的演示文稿中使用代码(因为这是真正的java代码),尽管它很简单.EL肯定是一个更优雅的解决方案.
我探讨了spring文档中列出的所有特殊EL变量,但仍无法找到获取完整queryString的方法.
-------------------------------- UPDATE ----------------- ---------------
好吧,所以我正在制定一些理由......结果是ExternalContext界面有一个getNativeRequest()实际的HttpServletRequest对象.从那里我可以得到完整的查询字符串:
externalContext.getNativeRequest().getQueryString()
Run Code Online (Sandbox Code Playgroud)
所以现在我假设因为有一个名为externalContext 的特殊EL变量,我会这样做:
${externalContext.nativeRequest.queryString}
Run Code Online (Sandbox Code Playgroud)
对?错误!事实证明externalContext,JSP页面中没有该变量.谁知道为什么?但是,还有flowRequestScope,JSP可用并且有一个getExternalContext方法,所以现在我可以这样做:
${flowRequestScope.externalContext.nativeRequest.queryString}
Run Code Online (Sandbox Code Playgroud)
很酷,有效......但为什么有必要呢?为什么只有一些特殊的EL变量被推送到JSP页面,为什么它们中的一些变化(viewScope似乎它的所有值都被提升到root级别,因此viewScope.commandName在JSP中被引用为$ {commandName} EL)?我必须错过WebFlow工作方式的基本内容.有人能指出我正确的方向吗?
在 webflow 中,范围图本质上是为了便于区分服务器上的控制逻辑。在直接的 Spring MVC 中,这将是您的控制器,但在 webflow 中,您的流程或多或少直接服务于此目的。实际上,您放入范围映射中的所有内容都会汇总到请求属性中以在 JSP 上使用,但请求范围除外,该范围在流程返回时会被显式销毁。这就是 viewScope.commandName 在 JSP 中可用的原因 - 因为它与其他作用域一样,被汇总到一个大型请求属性映射中,然后将其放入请求中供 JSP 访问。
不同之处在于,首先使用生命周期较低的作用域。较低的作用域总是优先于较长生命周期的作用域,就像 Java 中的局部变量优先于同名的类级变量一样。因此,您需要确保使用唯一的参数名称,以防万一,以免发生冲突。
如果您确实需要该值,最简单的方法是在流程中使用 set 标签在适当的范围内设置该值,以便更容易命名,例如
<set name="viewScope.currentService" value="externalContext.nativeRequest.queryString" />
Run Code Online (Sandbox Code Playgroud)
这样,您的视图范围内就可以使用 EL 变量“currentService”。您可能希望使用渲染时或输入时将此值存储到您的视图中。对于这个特定的值,我可能会使用渲染时,因为它可能会根据视图的渲染方式而改变,但无论哪种方式都可能无关紧要。
| 归档时间: |
|
| 查看次数: |
1662 次 |
| 最近记录: |