内容回顾:
三种脚本元素对比
元素类型 | 语法 | 作用域 | 典型用途 |
---|---|---|---|
声明 | <%! %> | 成员级别 | 定义方法/全局变量 |
脚本片段 | <% %> | 方法内局部 | 写Java逻辑代码 |
表达式 | <%= %> | 输出内容到响应流 | 显示动态内容 |
4.1顶目描述与实现
实现静态包含功能,编写三个不同类型的文件,然后将这三个不同类型的文件静态包含于某一 JSP 文件中,运行效果如图所示。
实现过程:
1. 编写三个不同类型的被包含文件
分别是 exam4_1_inclu.html、exam4_1_inclu.jsp和exam4_1_inclu.txt 。
代码见程序4-1~程序4-3。
【程序4-1】 exam4_1_inclu.html
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<meta charset="UTF-8">
<title>被包含了HTML文件</title>
</head>
<body>
1.include1.html文件被包含了
</body>
</html>
【程序4-2】 exam4_1_inclu.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>带有包含文件的jsp样例</title>
</head>
<body>
<%="2.include1.jsp文件被包含了" %>
</body>
</html>
【程序 4-3】 exam4_1_inclu.txt
<h2>
3.include1.txt文件被包含了
</h2>
注意:三个文件的编码格式都是UTF-8(选中文件,右键查看属性)
如果是外部创建的txt文档,另存时可以修改为UTF-8编码
2. 编写 JSP 包含文件,包含上述三个文件。
【 程序4-4】 exam4_1_include.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>这是包含文件</title>
</head>
<body>
<h2>以下文件被包含了</h2>
<%-- 包含HTML文件 --%>
<jsp:include page="exam4_1_inclu.html"/><br>
<%-- 包含jsp文件 --%>
<jsp:include page="exam4_1_inclu.jsp"/><br>
<%-- txt --%>
<jsp:include page="exam4_1_inclu.txt"/>
</body>
</html>
代码执行结果:
代码分析:
使用<jsp:include> 包含了之前定义的三种类型的文件,分别是 html、jsp 和txt文件。
被包含的文件内容会在此页面中输出其内容。
<jsp:include>为 JSP 页面包含指令。
查看网页源代码:
4.2 <jsp:include> 和 <%@ include %> 的区别
这两个 JSP 包含指令在功能上相似,但在实现方式和适用场景上有重要区别:
1. 包含时机
-
<%@ include %>
(静态包含)-
在 JSP 文件编译时被包含
-
发生在 JSP 转换为 Servlet 的阶段
-
被包含文件的内容会直接插入到主 JSP 中
-
-
<jsp:include>
(动态包含)-
在请求处理时被包含
-
发生在页面执行阶段
-
被包含文件独立编译,运行时合并
-
静态包含过程:
分为以下三步:
-
将被包含的 jsp文件1 放入 jsp文件2 中
-
将文件2 放入服务器解析
-
生成一个.java 文件
动态包含过程:
分为以下五步:
-
将被包含的 jsp文件1 直接放入服务器解析
-
生成文件1.java文件
-
将文件1的结果放入文件2中
-
再将文件2 放入服务器解析
-
生成一个文件2.java 文件
2. 性能特点
特性 | <%@ INCLUDE %> | <JSP:INCLUDE> |
---|---|---|
编译速度 | 较慢(需要重新编译整个文件) | 较快(被包含文件独立编译) |
执行速度 | 较快(已预编译) | 较慢(运行时包含) |
内存占用 | 较高(合并为一个Servlet) | 较低(各自独立) |
3. 代码变化影响
-
静态包含:修改被包含文件后,必须重新编译主 JSP 文件才能看到变化
-
动态包含:修改被包含文件后立即生效,无需重新编译主文件
4. 参数传递
-
静态包含:不能传递参数,被包含文件直接访问主文件的变量
-
动态包含:可以通过
<jsp:param>
传递参数:<jsp:include page="header.jsp"> <jsp:param name="title" value="首页"/> </jsp:include>
5. 错误检测
-
静态包含:编译时就能发现被包含文件的错误
-
动态包含:运行时才能发现被包含文件的错误
6. 适用场景
使用 <%@ include %>
:
-
内容很少变化(如页眉、页脚)
-
需要共享变量和导入
-
追求最佳运行时性能
使用 <jsp:include>
:
-
内容经常变化
-
需要传递参数
-
被包含内容需要条件判断
-
希望模块化开发
示例对比
静态包含示例:
<%@ include file="header.jsp" %>
<main>主体内容</main>
<%@ include file="footer.jsp" %>
动态包含示例:
<jsp:include page="${user.isAdmin ? 'admin_header.jsp' : 'user_header.jsp'}"/>
<main>主体内容</main>
<jsp:include page="footer.jsp">
<jsp:param name="year" value="2025"/>
</jsp:include>
user.isAdmin ? A : B的解释:
三元条件表达式:如果 user.isAdmin 返回 true → 包含 admin_header.jsp
如果 user.isAdmin 返回 false → 包含 user_header.jsp
典型应用场景:
-
权限区分:管理员和普通用户看到不同的页头
-
主题切换:根据用户偏好显示不同风格的头部
-
AB测试:随机展示不同版本的页面模块
最佳实践建议
-
优先使用
<jsp:include>
除非有明确的性能需求 -
对频繁变化的模板使用动态包含
-
对静态不变的代码片段使用静态包含
-
需要参数传递时只能使用动态包含
-
注意编码一致性,特别是混合使用时
4.3 新知识点——JSP 指令:page 指令、include指令
JSP指令是为JSP 引擎而设计的。
它们并不直接产生任何可见的输出,而只是告诉引擎 如何处理其余的 JSP 页面。
JSP 指令有三种,分别为页面设置指令page、页面包含指令 include 和标记指令taglib。
JSP 指令一般语法形式为:
<%@指令名称 属性="值"%>
1. page指令
page 指令通过设置内部的多个属性来定义JSP 文件中的全局特性。
需要注意的是,page 指令只能对当前自身页面进行设置,即每个页面都有自身的page指令。如果没有对属性进行 设 置 ,JSP 将使用默认指令属性值。
表2-1中定义了page 指令的常用属性。
指令属性 | 说 明 |
---|---|
autoFlush | <%@page autoFlush="true|false"%>指定当数据输出缓冲区满时,是否自动将缓冲区数据输出到客户端并清空缓冲区 |
buffer | <%@page buffer="none|8 KB|size KB"%>为out对象指定发送信息到客户端浏览器的信息缓存大小。 若设置为none,则表示不 使用缓存,而直接通过PrintWriter对象进行输出;如果该属性值定为数值,则输出缓冲 区的大小不应小于该值;默认值是8 KB(因服务器不同可能有所不同,但大多数情况下 都是8 KB) |
contentType | 指定JSP页面发送到客户端的信息使用的MIME类型和字符编码类型。 默认的MIME类型是text/html,默认的字符集是ISO-8859-1。如果是中文HTML显示,则可 以使用如下形式:contentType="text/html;charset=GBK" |
errorPage | <%@page errorPage="relativeURL"%>该属性用来指定一个当前页面出现异常时所跳转的显示页面。 如果属性值是以“/”开 头的路径、则将在当前应用程序的根目录下查找文件;否则,将在当前页面的目录下查 找文件。如errorPage="a,jsp",要与isErrorPage配合来使用 |
extends | <%@page extends="package.class"%>指定将一个JSP页面转换成Servlet后所要继承的父类,但是需要慎重地使用它,它会 限制JSP的编译能力 |
import | <%@page import=”(package.class|package.黄},..."%>import属性类似于Java里面的import语句,用来向JSP文件中导入需要用到的包。 在page指令中可多次使用该属性导入多个包 |
info | <%@page info="text"%>该属性可设置为任意字符申,如当前页面的作者或其他有关的页面信息。 可通过 Servlet.getServletInfo()方法来获取设置的字符申 |
isErrorPage | <%@page isErrorPage="true|false"%>设置当前页面是否为错误页面,在其他页面设置errorPage属性后,出现错误后会跳转至该页面 |
isThreadSafe | <%@page isThreadSafe="true|false"%>指定JSP页面是否支持多线程访问。 默认值是true,表示可以同时处理多个客户请求。 如果设置为false,JSP页面在一个时刻就只能响应一个请求 |
language | <%@page language="java"%>说明在JSP文件中使用的脚本语言,目前只能使用java |
pageEncoding | <%@page pageEncoding="ISO-8859-1"%>JSP页面的字符编码,默认值为“ISO-8859-1”,如果是中文则可以设置为pageEncoding =“GBK” |
session | <%@page session="true|false"%>定义是否在客户浏览JSP页面时使用HTTP的session对象。 如果值为true,则可以使用 Bession对象;如果值为false,则不能使用session对象,否则会出错。默认值为true |
对于如上page操作指令,import指令可以重复出现多次,其他属性只能出现一次。
page 指令的使用举例如下:
【 程序2-5】 exam4_2_pagel.jsp
<%@page language="java" contentType="text/html;charset=UTF-8"
pageEncoding=“UTF-8”%>
<H2> 测试 contentType!</H2>
代码分析:
本例中,设置了<%@page%> 指 令 的
-
language 属性:指定开发语言为 Java;
-
contentType 属性:指定MIME 类型(多用途互联网邮件扩展类型)是一种标准化的数据格式描述方法,用于标识互联网上的数据类型)为text/html
-
charset属性:指定页面的字符编码集 为 UTF-8;
-
pageEncoding 属性:,指定页面的字符编码为UTF-8。
charset属性和 pageEncoding 属性通常设置为相同的值,以确保页面内容的正确显示。
显示效果如图2-2所示。
上例中,指定 contentType属性的 MIME 类型为 text/html,也可以指定 contentType属 性的MIME 类型为其他类型,如Word 等。
下面通过MIME 设置使JSP 响应结果用Word 打 开。
【程序2-6】 exam4_3_page2.jsp
<%@page language="java" contentType="application/msword;charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2> 测试 contentType!</h2>
</body>
</html>
代码运行后会跳转到网页里,下载该文件
选中此文件,右键选择打开方式为word形式,结果如下:
对比一下,用其他方式打开此文件(如txt文档),显示的是源代码:
代码分析:使用<%@page%> 中的 contentType="application/msword" 设置本页面的 MIME 类型为Word, 以 Word 文件进行显示,运行效果如图2-3所示。
import指令案例
如何使用JSP脚本元素和日期格式化
【程序2-6】 exam4_3_page3.jsp
<%@page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="java.util.*,java.text.*" %><!-- 导入java.util和java.text包(用于日期处理) -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2> 使用JSP脚本元素和日期格式化</h2>
<%
//设置格式化日期
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");//创建SimpleDateFormat对象,设置中文日期格式
String date = format.format(new Date());//格式化当前日期为字符串
%>
你好,山东农业工程学院,现在是:<%=date%>
</body>
</html>
代码运行如下:
Java 8+ 替代方案(推荐)
如果使用 Java 8 或更高版本,建议使用更现代的 DateTimeFormatter
:
<%@page import="java.time.LocalDateTime, java.time.format.DateTimeFormatter" %>
<%
//设置格式化日期
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//创建SimpleDateFormat对象,设置中文日期格式
String date = LocalDateTime.now().format(format);//格式化当前日期为字符串
%>
你好,山东农业工程学院,现在是:<%=date%>
优势:
-
线程安全
-
更清晰的 API
-
支持时区处理
总结:
-
复杂项目推荐使用 Java 8 的日期时间 API(
java.time
包) -
简单场景可直接用 JSTL 的
<date:formatDate>
:
2. include指令
在JSP 开发中,可以将一些重用的代码写入一个单独的文件中,然后通过include 指令引 用该文件,从而缓解代码的冗余问题,修改也比较方便。
JSP中include指令的功能说明:用于将不同的文件插入到当前JSP页面的指定位置
include 指令语法格式为:
<%@include file="被包含的文件路径"%>
include也被称为静态包含指令,包含的文件可以是JSP 文件、HTML 文件、文本文件和 Java程序段。
静态包含指令只是简单地将内容合在一起显示,所以,在一个完整的页面中,对 于<html> 、<head> 、<title> 、<body> 等元素只能出现一次,如果重复出现,则会造成HTML错误。
<%@ include%>指令将会在JSP编译时插入一个包含文本或代码的文件,当使用<%@ include%>指令时,这个包含的过程就当是静态的,静态的包含就是指这个被包含的文件将会被插入到当前JSP文件中去。
(1) 包含的文件是 JSP文件:这个包含的JSP的文件的代码将会被执行;(相当于将包含文件中定义的JSP代码插入到当前JSP文件中)
(2)包含的文件是HTML文件:HTML文件的内容将会插入到当前JSP文件放<%@ include%>指令的地方。
(3)包含的文件是文本文件:文本文件的内容将会插入到当前JSP文件放<%@ include%>指令的地方。