使用 JSF、MyFaces 和 MyFaces 迭代 HashMap 时出现问题 小面

发布于 2024-07-19 22:15:39 字数 901 浏览 11 评论 0 原文

我在循环 HashMap 将其值打印到屏幕上时遇到一些麻烦。 有人可以仔细检查我的代码,看看我做错了什么吗? 我似乎找不到什么问题,但一定有什么问题。

在 servlet 中,我将以下内容添加到请求中:

Map<String, String> facetValues = new HashMap<String, String>();
// Filling the map
req.setAttribute(facetField.getName(), facetValues);

在一种情况下,“facetField.getName()”的计算结果为“discipline”。 所以在我的页面中我有以下内容:

<ui:repeat value="${requestScope.discipline}" var="item">
  <li>Item: <c:out value="${item}"/>, Key: <c:out value="${item.key}"/>, Value: <c:out value="${item.item}"/></li>
</ui:repeat>

循环运行一次但所有输出都是空白?!? 如果 item 已经循环一次的话,我至少会期待 item 中的一些东西。 检查 Facelets 的调试弹出窗口,纪律就在那里并且在循环中。 将其打印到屏幕上会产生看起来像地图的结果(我缩短了输出):

{300=0, 1600=0, 200=0, ... , 2200=0}

我也尝试过 ac:forEach 但得到了相同的结果。 那么有人知道我哪里出错了吗?

感谢您的任何意见, 李

I'm having some trouble looping over a HashMap to print out it's values to the screen. Could someone double check my code to see what I'm doing wrong. I can't seem to find anything wrong but there must be something.

In a servlet, I am adding the following to the request:

Map<String, String> facetValues = new HashMap<String, String>();
// Filling the map
req.setAttribute(facetField.getName(), facetValues);

In one case "facetField.getName()" evaluates to "discipline". So in my page I have the following:

<ui:repeat value="${requestScope.discipline}" var="item">
  <li>Item: <c:out value="${item}"/>, Key: <c:out value="${item.key}"/>, Value: <c:out value="${item.item}"/></li>
</ui:repeat>

The loop is ran once but all the outputs are blank?!? I would have at least expected something in item if it's gone over the loop once. Checking the debug popup for Facelets, discipline is there and on the loop. Printing it to the screen results in something that looks like a map to me (I've shortened the output) :

{300=0, 1600=0, 200=0, ... , 2200=0}

I've also tried with a c:forEach but I'm getting the same results. So does anyone have any ideas where I'm going wrong?

Thanks for any input,
Lee

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

诺曦 2024-07-26 22:15:39

通过 el 2.2 支持,您可以像下面这样迭代地图。

<ui:repeat value="#{myBean.stats.keySet().toArray()}" var="x">
    <h:outputText value="#{myBean.stats.get(x)}" /><br />
</ui:repeat>

with el 2.2 support you can iterate maps like below.

<ui:repeat value="#{myBean.stats.keySet().toArray()}" var="x">
    <h:outputText value="#{myBean.stats.get(x)}" /><br />
</ui:repeat>
情绪失控 2024-07-26 22:15:39

仅接受 List 或 DataModel,而不接受 Sets 或 Maps。 这是 JSF 2.1 的路线图。

<ui:repeat> only accepts List or DataModel, not Sets or Maps. This is on the roadmap for JSF 2.1.

病女 2024-07-26 22:15:39

我想到了三件事:

1.

ui:repeat 的文档 没有说(它只说List),但我看到 UIRepeat 使用 DataModel 作为其模型(以 h:dataTable 的方式)。 Map 不会自动用 DataModel 类型包装 - 该类型不受隐式支持。 您需要将该值设置为您自己的DataModel 实现的实例,或者将它们作为隐式支持的类型提供(例如java.util.List)。

2.

我不确定您打算将这些值映射到什么:

${item}
${item.key}
${item.item}

如果您将“discipline”更改为List>类型,您可以绑定到键和值属性:

${item.key}
${item.value}

您可以像这样创建您的列表:

Map<String, String> facetValues = new HashMap<String, String>();
// Filling the map
List<Map.Entry<String, String>> discipline
        = new ArrayList<Map.Entry<String, String>>(facetValues.entrySet());

3.

常见问题解答建议 JSTL标签仅在组件树创建时评估。 我不清楚使用 c:out 作为 ui:repeat 的子项是否可以正常工作。 您可能需要使用 h:outputText 代替。 (当然,我可能是错的——我还没有尝试过。)


在 servlet 中,我将以下内容添加到请求中

这听起来像是在 JSF 中将某些内容放入请求范围的奇怪方法,但我相信您知道自己在做什么!

Three things occur to me:

1.

The documentation for ui:repeat doesn't say it (it only says List), but I see UIRepeat uses DataModel as its model (in the manner of h:dataTable). Map will not be automatically wrapped with a DataModel type - the type is not implicitly supported. You will need to either make the value an instance of your own DataModel implementation or provide them as an implicitly supported type (e.g. java.util.List).

2.

I am not sure what you intend these values to map to:

${item}
${item.key}
${item.item}

If you change "discipline" to be of type List<Map.Entry<String,String>>, you could bind to the key and value properties:

${item.key}
${item.value}

You can create your list like so:

Map<String, String> facetValues = new HashMap<String, String>();
// Filling the map
List<Map.Entry<String, String>> discipline
        = new ArrayList<Map.Entry<String, String>>(facetValues.entrySet());

3.

The FAQ suggests that JSTL tags are only evaluated at component tree creation time. It is unclear to me whether using c:out as a child of ui:repeat will work properly. You might need to use h:outputText instead. (I could be wrong about this, of course - I have not tried it.)


In a servlet, I am adding the following to the request

That sounds like an odd way to put something into request scope in JSF, but I'll trust that you know what you're doing!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文