返回介绍

8.10 格式化集合

发布于 2025-04-22 20:10:01 字数 3087 浏览 0 评论 0 收藏

由于 EL 定义了如何写表达式而不是函数,因此无法直接打印或格式化集合,毕竟,打印和格式化不是 EL 负责的领域。然而,打印和格式化是两个不能忽视的重要任务。

如果你是 EL 3.0 的新手,但熟悉 JSP,那么格式化集合最简单的方法就是使用第 6 章中讨论的 JSTL。然而,具有强大的功能的 EL 3.0 应足以解决这些问题,并允许我们完全抛弃 JSTL。

例如,你可以尝试使用 forEach,类似于 JSTL 的 forEach。以下代码可以在 Tomcat 8 上运行。

$ {cities.stream().forEach(x - > pageContext.out.println(x))}

遗憾的是,这在 GlassFish 4 中不起作用,所以 forEach 不能通用。

我最终想出的两个解决方案不像 forEach 那样优雅,但在所有主要的 servlet 容器上都可用。第一个解决方案适用于 Java SE 7。第二个解决方案可能比第一个更优雅,但只适用于 Java SE 8。

8.10.1 使用 HTML 注释

List 的字符串表示形式如下所示:

[element-1,element-2,...]

现在,如果我想在 HTML 中呈现列表元素,需要这样写。

<ul>
  <li> element-1 </ li>
  <li> element-2 </ li> 
  ...
</ul>

现在,你可能已经注意到每个元素必须转向<li> element-n </ li>。我怎么做?如果 你一直密切关注,你可能仍然记得 map 方法可以用来转换每个元素。所以,我会有这样的内容:

$ {myList.stream().map(x - >"<li>"+ = x + ="</ li>").toList()}

它给了我这样的 List:

[<li> element-1 </ li>,<li> element-2 </ li>,...]

足够接近,但仍然需要删除括号和逗号。遗憾的是,你不能控制列表的字符串表示。好在你可以使用 HTML 注释。

所以,这里是一个例子:

<ul>
<!-${cities.stream().map(x - >"--> <li>"+ = x + ="</ li> <!--").toList()}-->
</ul>

结果如下所示:

<ul>
<!--[--><li>Paris</li><!--, --><li>Strasbourg</li><!--, -->
<li>London</li><!--, --><li>New York</li><!--, -->
<li>Beijing</li><!--, --><li>Amsterdam</li><!--, -->
<li>San Francisco</li><!--]-->
</ul>

这有效地注释掉了括号和逗号。虽然结果看起来有点凌乱,但它是有效的 HTML,更重要的是,它能工作!

图 8.2 显示了页面显示结果。

图片 1

图 8.2 使用 HTML 注释来格式化集合

这里有另一个例子,这个例子用表格格式化显示地址信息。

<table>
  <tr><th>Street</th><th>City</th></tr>
  <!--${addresses.stream().map(a->"--> 
<tr><td>"+=a.streetName+="</td><td>"+=a.city+="</td></tr><!--").toList()} 
-->
</table>

8.10.2 使用 String.join()

这第二个解决方案之所以有效,因为 EL 3.0 允许你引用静态方法。在 Java 8 中,String 类新增了一些静态方法,其中一个方法是 join,这正是我寻找的解决方案。有两个重载 join 方法,但这里要用到的一个方法如下所示。

public static String join(CharSequence delimiter,
    Iterable <?extends CharSequence> elements)

此方法返回用指定分隔符连接在一起的 CharSequence 元素组成的字符串。而 java.util. Collection 接口正好扩展了 Iterable。因此,你可以将 Collection 传递给 join 方法。

例如,下面是如何将列表格式化为 HTML 有序列表:

$ {"<ol> <li>"+ = String.join("</ li> <li>",城市)+ ="< li> </ ol>"}

此表达式适用于至少有一个元素的集合。如果你可能要处理一个空集合,这里是一个更好的表达式:

${empty cities? "" : "<ol><li>"
    += String.join("</li><li>", cities. stream().sorted().toList()) 
    += "</li></ol>"}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。