- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 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/
我是一名优秀的程序员,十分优秀!