gpt4 book ai didi

jsf - 使用 with a dynamic query string in "outcome"

转载 作者:行者123 更新时间:2023-12-04 14:34:05 25 4
gpt4 key购买 nike

在我的 JSF 应用程序中,我有一个页面链接,该页面是使用动态查询字符串构建的:

<h:link outcome="list?#{controller.queryString}" value="Example" />

我不能使用 <f:param> ,因为每个请求包含的参数数量都会发生变化。

问题在于查询字符串是URL 编码,因为某些参数值可以包含=。 .结果是查询字符串在结果 HTML 中被编码了两次。

list?a=b%3Dc 的结果变成:

<a href=".../list.xhtml?a=b%253Dc">Example</a>

查看 JSF 规范(默认 NavigationHandler 算法),我找不到任何关于查询字符串中编码的信息。但我认为 com.sun.faces.application.NavigationHandlerImpl.findImplicitMatch是一个相当hacky的实现。

我的问题:我是否使用了 <h:link>以错误的方式(按设计工作)或者这是某种错误?

我目前的解决方案是使用 <h:outputLink>相反 - 这会阻止使用任何导航规则。

最佳答案

如果#{controller.queryString}至少是 View 范围或更广泛,那么你可以使用 Map<String, String>使用未编码的值并使用 <c:forEach>动态生成<f:param>条目。

private Map<String, String> params;
<h:link ...>
<c:forEach items="#{bean.params}" var="entry">
<f:param name="#{entry.key}" value="#{entry.value}" />
</c:forEach>
</h:link>

但是如果它是请求范围的(例如取决于用户输入),那么您需要使用请求范围的 bean 并在 ajax 更新链接之前在操作方法中显式重建 View ,如下所示,以便 JSTL 标记在渲染响应期间再次运行。

String viewId = context.getViewRoot().getViewId();
UIViewRoot view = context.getApplication().getViewHandler().createView(context, viewId);
context.setViewRoot(view);

如果请求范围内的 bean 不是一个选项,那么最好的办法是在 ViewHandler#getBookmarkableURL() 的帮助下手动生成 URL。 ,将 View ID 和参数作为 Map 传递.

url = context.getApplication().getViewHandler().getBookmarkableURL(context, outcomeViewId, params, false);
<a href="#{bean.url}">...</a>

如果您仅依赖隐式导航,结果 View ID 很容易。

另见:

关于jsf - 使用 <h :link> with a dynamic query string in "outcome",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40363933/

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