JSP 指令
page、include、taglib 三个指令的属性与常见用法。
page 指令
<%@ page contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"
import="java.util.*, java.time.LocalDate"
session="true"
errorPage="/WEB-INF/errors/500.jsp"
isErrorPage="false"
buffer="8kb"
autoFlush="true"
isELIgnored="false"
trimDirectiveWhitespaces="true" %>| Attribute | Meaning |
|---|---|
| contentType | 响应的 MIME 与字符集,决定浏览器怎么解析 |
| pageEncoding | JSP 源文件本身的编码,决定容器怎么读文件 |
| import | 唯一可以在同一页多次出现的属性 |
| session | false 时不创建 session,session 隐式对象不可用 |
| errorPage | 本页抛异常时转到哪里 |
| isErrorPage | true 时可用 exception 隐式对象 |
| buffer / autoFlush | 输出缓冲大小与满时是否自动刷新 |
pageEncoding tells the container how to read the file; the charset in contentType tells the browser how to read the response. Setting both to UTF-8 is the safe move — setting only one eventually garbles something.include 指令
<%@ include file="/WEB-INF/parts/header.jsp" %>Static include pastes the target file in at translation time, merging both into one servlet. The included file must not repeat <!DOCTYPE>/<html> and should not declare conflicting page attributes.
taglib 指令
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %>
<%@ taglib prefix="fn" uri="jakarta.tags.functions" %>
<c:forEach var="u" items="${users}">
<p><c:out value="${u.name}"/> — <fmt:formatDate value="${u.created}" pattern="yyyy-MM-dd"/></p>
</c:forEach>prefix is your page-local alias; uri must match the TLD. JSTL 1.x uses http://java.sun.com/jsp/jstl/core, JSTL 2.0+ (Jakarta) uses jakarta.tags.core.
一个完整的页面头
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="com.example.model.User" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %>
<%-- 到这里为止都不产生任何输出 --%>
<!DOCTYPE html>
<html lang="zh-CN">Keep directives at the top: they emit nothing, but appearing after HTML puts stray blank lines in the body and can even trigger IllegalStateException once the response is committed.
page 指令
<%@ page contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"
import="java.util.*, java.time.LocalDate"
session="true"
errorPage="/WEB-INF/errors/500.jsp"
isErrorPage="false"
buffer="8kb"
autoFlush="true"
isELIgnored="false"
trimDirectiveWhitespaces="true" %>| 属性 | 含义 |
|---|---|
| 内容类型 | 响应的 MIME 与字符集,决定浏览器怎么解析 |
| 页面编码 | JSP 源文件本身的编码,决定容器怎么读文件 |
| 导入 | 唯一可以在同一页多次出现的属性 |
| 会话 | false 时不创建 session,session 隐式对象不可用 |
| 错误页 | 本页抛异常时转到哪里 |
| 是错误页 | true 时可用 exception 隐式对象 |
| 缓冲 | 输出缓冲大小与满时是否自动刷新 |
pageEncoding 与 contentType 里的 charset 是两件事:前者告诉容器「这个文件是什么编码」,后者告诉浏览器「响应是什么编码」。两个都写 UTF-8 最省事,只写一个迟早出乱码。include 指令
<%@ include file="/WEB-INF/parts/header.jsp" %>静态包含在翻译期把目标文件的内容原样插入,两个文件合成一个 Servlet。所以被包含的文件不能有 <!DOCTYPE>、<html> 这类重复结构,也不该自己声明冲突的 page 属性。
JSP 指令
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %>
<%@ taglib prefix="fn" uri="jakarta.tags.functions" %>
<c:forEach var="u" items="${users}">
<p><c:out value="${u.name}"/> — <fmt:formatDate value="${u.created}" pattern="yyyy-MM-dd"/></p>
</c:forEach>prefix 是页面上用的前缀,可以自定义;uri 必须和标签库的 TLD 声明一致。JSTL 1.x 用 http://java.sun.com/jsp/jstl/core,JSTL 2.0+(Jakarta)用 jakarta.tags.core。
一个完整的页面头
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="com.example.model.User" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %>
<%-- 到这里为止都不产生任何输出 --%>
<!DOCTYPE html>
<html lang="zh-CN">指令放在文件最前面是好习惯:它们不产生输出,但如果在 HTML 之后出现,中间的空行会被算进响应体,某些情况下还会导致 IllegalStateException(响应已提交)。