4. 制作有包含文件的 JSP 页面

内容回顾:

三种脚本元素对比

元素类型语法作用域典型用途
声明<%! %>成员级别定义方法/全局变量
脚本片段<% %>方法内局部写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> (动态包含)

    • 请求处理时被包含

    • 发生在页面执行阶段

    • 被包含文件独立编译,运行时合并

静态包含过程:

分为以下三步:

  1. 将被包含的 jsp文件1 放入 jsp文件2 中

  2. 将文件2 放入服务器解析

  3. 生成一个.java 文件

动态包含过程:

分为以下五步:

  1. 将被包含的 jsp文件1 直接放入服务器解析

  2. 生成文件1.java文件

  3. 将文件1的结果放入文件2中

  4. 再将文件2 放入服务器解析

  5. 生成一个文件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测试:随机展示不同版本的页面模块

最佳实践建议

  1. 优先使用 <jsp:include> 除非有明确的性能需求

  2. 对频繁变化的模板使用动态包含

  3. 对静态不变的代码片段使用静态包含

  4. 需要参数传递时只能使用动态包含

  5. 注意编码一致性,特别是混合使用时

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

  • 支持时区处理

总结:

  1. 复杂项目推荐使用 Java 8 的日期时间 API(java.time 包)

  2. 简单场景可直接用 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%>指令的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值