JSP 语法
脚本元素、表达式、声明、注释,以及为什么现在推荐 EL 与 JSTL。
Key PointsJSP 有五种语法元素:注释、指令、脚本片段、表达式、声明;现代写法只用指令 + EL + JSTL。
五种元素
| Syntax | Name | Purpose |
|---|---|---|
| <%-- --%> | Comment | 不发送到浏览器 |
| <%@ %> | Directive | 页面级设置、包含、标签库 |
| <% %> | Scriptlet | 任意 Java 语句 |
| <%= %> | Expression | 输出一个值,不加分号 |
| <%! %> | Declaration | 类的成员变量与方法 |
脚本片段
JSP
<%
String[] langs = {"Java", "Go", "Rust"};
int total = 0;
for (String s : langs) {
total += s.length();
}
%>
<p>共 <%= langs.length %> 门语言,名称总长 <%= total %></p>Output
共 3 门语言,名称总长 12表达式
JSP
<%= "abc".toUpperCase() %>
<%= 10 / 3.0 %>
<%= new java.util.Date() %>Output
ABC
3.3333333333333335
Tue Nov 03 14:25:09 CST 2026An expression takes no semicolon and no if/for statements. It becomes out.print(expr), so anything that yields a value works.
声明
JSP
<%!
private static final int MAX = 100;
private String repeat(String s, int n) {
return s.repeat(n);
}
%>
<p><%= repeat("-", 10) %></p>
<p>上限 <%= MAX %></p>Output
----------
上限 100三种注释
JSP
<%-- JSP 注释:不翻译,不出现在响应里 --%>
<!-- HTML 注释:会发到浏览器,用户查看源码可见 -->
<% // Java 单行注释:只在脚本片段内有效
/* 多行注释 */
%><%-- --%> is the only real comment. Wrapping Java in <!-- --> breaks: the <%= %> inside still executes and the result is visible to users.为什么现在少用脚本
| EL + JSTL | ||
|---|---|---|
| Readability | Java 与 HTML 混杂 | 标签即语义 |
| Null safety | 要手动判 null | ${empty x} 天然安全 |
| Testability | 逻辑埋在页面里 | 逻辑回到 Java |
| Escaping | 手写转义,容易漏 | <c:out> 默认转义 |
JSP
<%-- 旧写法:空值会输出 null,还容易漏转义 --%>
<p>用户名:<%= user.getName() %></p>
<%-- 新写法:空值输出空串,默认 HTML 转义 --%>
<p>用户名:<c:out value="${user.name}"/></p>五种元素
| 语法 | 名称 | 作用 |
|---|---|---|
| 注释 | 注释 | 不发送到浏览器 |
| 指令 | 指令 | 页面级设置、包含、标签库 |
| 脚本 | 脚本 | 任意 Java 语句 |
| 表达式 | 表达式 | 输出一个值,不加分号 |
| 声明 | 声明 | 类的成员变量与方法 |
脚本片段
JSP
<%
String[] langs = {"Java", "Go", "Rust"};
int total = 0;
for (String s : langs) {
total += s.length();
}
%>
<p>共 <%= langs.length %> 门语言,名称总长 <%= total %></p>Output
共 3 门语言,名称总长 12表达式
JSP
<%= "abc".toUpperCase() %>
<%= 10 / 3.0 %>
<%= new java.util.Date() %>Output
ABC
3.3333333333333335
Tue Nov 03 14:25:09 CST 2026表达式里不能加分号,也不能写 if/for 这类语句。它被翻译成 out.print(表达式),所以任何能返回值的表达式都可以。
声明
JSP
<%!
private static final int MAX = 100;
private String repeat(String s, int n) {
return s.repeat(n);
}
%>
<p><%= repeat("-", 10) %></p>
<p>上限 <%= MAX %></p>Output
----------
上限 100三种注释
JSP
<%-- JSP 注释:不翻译,不出现在响应里 --%>
<!-- HTML 注释:会发到浏览器,用户查看源码可见 -->
<% // Java 单行注释:只在脚本片段内有效
/* 多行注释 */
%><%-- --%> 才是真注释。用 <!-- --> 包住 Java 代码会出问题——里面的 <%= %> 照样执行,而且内容会暴露给用户。为什么现在少用脚本
| Scriptlet | EL + JSTL | |
|---|---|---|
| 可读性 | Java 与 HTML 混杂 | 标签即语义 |
| 空值 | 要手动判 null | ${empty x} 天然安全 |
| 可测试性 | 逻辑埋在页面里 | 逻辑回到 Java |
| 转义 | 手写转义,容易漏 | <c:out> 默认转义 |
JSP
<%-- 旧写法:空值会输出 null,还容易漏转义 --%>
<p>用户名:<%= user.getName() %></p>
<%-- 新写法:空值输出空串,默认 HTML 转义 --%>
<p>用户名:<c:out value="${user.name}"/></p>