- 内容提要
- 作者简介
- 译者简介
- 前言
- HTTP
- Servlet 和 JSP
- 下载 Spring 或使用 STS 与 Maven/Gradle
- 手动下载 Spring
- 使用 STS 和 Maven/Gradle
- 下载 Spring 源码
- 本书内容简介
- 下载示例应用
- 第 1 章Spring 框架
- 第 2 章模型 2 和 MVC 模式
- 第 3 章Spring MVC 介绍
- 第 4 章基于注解的控制器
- 第 5 章数据绑定和表单标签库
- 第 6 章转换器和格式化
- 第 7 章验证器
- 第 8 章表达式语言
- 第 9 章JSTL
- 第 10 章国际化
- 第 11 章上传文件
- 第 12 章下载文件
- 第 13 章应用测试
- 附录 A Tomcat
- 附录 B Spring Tool Suite 和 Maven
- 附录 C Servlet
- 附录 D JavaServer Pages
- 附录 E 部署描述符
8.10 格式化集合
由于 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 显示了页面显示结果。

图 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>"}绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论