再见,意大利面条式代码:如何一劳永逸地从JSP中清除Java
\n\n如果你曾经打开过旧的JSP文件,看到HTML、<% %>脚本和Java逻辑混杂在一起,你懂那种感觉。表示层与业务逻辑的混合让项目维护变成噩梦。Stack Overflow上关于"How can I avoid Java code in JSP files, using JSP 2?"的问题获得了数千次浏览——这并非没有原因。
好消息是:JSP 2(Java Server Pages 第2版)为我们提供了工具,可以永远告别脚本。在本文中,我将展示三种实际方法,将你的JSP变成干净、可读的模板。没有废话——只有代码和实践。
\n\n为什么脚本是邪恶的?开发者的视角
\n\n脚本(就是那些<% ... %>)违反了MVC的核心原则:逻辑与视图分离。以下是需要摆脱它们的三个原因:
- \n
- 维护复杂。当JSP中包含SQL查询和条件语句时,设计师无法安全地修改布局。 \n
- 难以测试。JSP内部的逻辑无法通过单元测试进行测试。 \n
- 可读性差。代码变成"意大利面条",Java与HTML混杂在一起。 \n
JSP 2提供了优雅的替代方案。让我们通过一个实际任务来解析它们:从数据库输出用户列表。
\n\n方法1:表达式语言(EL)——你的新朋友
\n\n表达式语言(EL)允许你在JSP中直接访问Java对象,而无需一行Java代码。${...}语法直观易懂。
之前(带Java代码):
\n\n<% \n User user = (User) request.getAttribute("user"); \n out.println("你好," + user.getName());\n%>\n\n之后(使用EL):
\n\n<p>你好,${user.name}</p>\n\nEL自动调用getter方法。如果user.getName()返回字符串——它会被插入到HTML中。如果对象为null——EL将不输出任何内容(不会出现NullPointerException)。
使用场景:用于输出request、session、application作用域或请求参数中的数据。
\n\n方法2:JSTL(JSP标准标签库)——无需Java的循环和条件
\n\nJSTL是一组现成的标签,覆盖了90%的典型任务:循环、条件、格式化、URL处理。只需在pom.xml(Maven)中添加依赖或下载JAR即可使用。
示例:将用户列表输出到表格中。
\n\n之前(脚本):
\n\n<table>\n <%\n List<User> users = (List<User>) request.getAttribute("users");\n for (User u : users) {\n %>\n <tr><td><%= u.getName() %></td><td><%= u.getEmail() %></td></tr>\n <%\n }\n %>\n</table>\n\n之后(JSTL + EL):
\n\n<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>\n<table>\n <c:forEach var="u" items="${users}">\n <tr>\n <td>${u.name}</td>\n <td>${u.email}</td>\n </tr>\n </c:forEach>\n</table>\n\n注意:没有一行Java代码!<c:forEach>标签像foreach循环一样工作,而${u.name}是EL表达式。代码变得可读且安全。
其他有用的JSTL标签:
\n- \n
<c:if test="${condition}">— 条件输出 \n <c:choose>— switch的替代 \n <c:set var="x" value="..." />— 创建变量 \n <fmt:formatDate>— 日期格式化 \n