从JSP中移除Java代码:JSP 2的3种强大方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

再见,意大利面条式代码:如何一劳永逸地从JSP中清除Java

\n\n

如果你曾经打开过旧的JSP文件,看到HTML、<% %>脚本和Java逻辑混杂在一起,你懂那种感觉。表示层与业务逻辑的混合让项目维护变成噩梦。Stack Overflow上关于"How can I avoid Java code in JSP files, using JSP 2?"的问题获得了数千次浏览——这并非没有原因。

\n\n

好消息是:JSP 2(Java Server Pages 第2版)为我们提供了工具,可以永远告别脚本。在本文中,我将展示三种实际方法,将你的JSP变成干净、可读的模板。没有废话——只有代码和实践。

\n\n

为什么脚本是邪恶的?开发者的视角

\n\n

脚本(就是那些<% ... %>)违反了MVC的核心原则:逻辑与视图分离。以下是需要摆脱它们的三个原因:

\n\n
    \n
  • 维护复杂。当JSP中包含SQL查询和条件语句时,设计师无法安全地修改布局。
  • \n
  • 难以测试。JSP内部的逻辑无法通过单元测试进行测试。
  • \n
  • 可读性差。代码变成"意大利面条",Java与HTML混杂在一起。
  • \n
\n\n

JSP 2提供了优雅的替代方案。让我们通过一个实际任务来解析它们:从数据库输出用户列表。

\n\n

方法1:表达式语言(EL)——你的新朋友

\n\n

表达式语言(EL)允许你在JSP中直接访问Java对象,而无需一行Java代码。${...}语法直观易懂。

\n\n

之前(带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\n

EL自动调用getter方法。如果user.getName()返回字符串——它会被插入到HTML中。如果对象为null——EL将不输出任何内容(不会出现NullPointerException)。

\n\n

使用场景:用于输出request、session、application作用域或请求参数中的数据。

\n\n

方法2:JSTL(JSP标准标签库)——无需Java的循环和条件

\n\n

JSTL是一组现成的标签,覆盖了90%的典型任务:循环、条件、格式化、URL处理。只需在pom.xml(Maven)中添加依赖或下载JAR即可使用。

\n\n

示例:将用户列表输出到表格中。

\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表达式。代码变得可读且安全。

\n\n

其他有用的JSTL标签:

\n
    \n
  • <c:if test="${condition}"> — 条件输出
  • \n
  • <c:choose> — switch的替代
  • \n
  • <c:set var="x" value="..." /> — 创建变量
  • \n
  • <fmt:formatDate> — 日期格式化
  • \n
\n\n

方法3:自定义标签(用户自定义

博客

书籍推荐