【JavaWeb
第八章 JSP 动态网页技术
创作日期:2021-12-27
8.1 JSP 介绍
JSP(全称JavaServer Pages)是一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成 HTML,XML 或其他格式文档的Web 网页,然后返回给请求者。JSP 技术以 Java 语言作为脚本语言,为用户的 HTTP 请求提供服务,并能与服务器上的其它 Java 程序共同处理复杂的业务需求。
8.1.1 JSP 的作用
JSP 的主要作用是代替 Servlet 程序回传 html 页面的数据,因为 Servlet 程序回传 html 页面数据是一件非常繁琐的事情,开发成本和维护成本都极高
8.1.2 JSP 的本质
JSP 本质就是一个 Servlet 程序
8.2 JSP 的三种语法
8.2.1 JSP 头部的 page 指令
Jsp 的 page 指令可以修改 jsp 页面中一些重要的属性或者行为
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- language 属性:表示 JSP 翻译后的语言文件格式,暂时只支持 java
- contenType 属性:JSP 返回的数据类型,也是 response.setContentType() 参数值
- pageEncoding 属性:JSP 页面文件本身的字符集
- import 属性:跟 java 源代码中一样,用于导包,导类
- autoFlush 属性:设置当 out 输出缓冲区满了,是否自动刷新冲级区,默认为 true
- buffer 属性:设置 out 缓存区的大小,默认 8kb
- errorPage 属性:设置当 JSP 页面运行时出错,自动跳转页面的路径
- isErrorPage 属性:设置当前 JSP 页面是否是错误信息页面,默认是 false
- session 属性:设置访问当前 JSP 页面,是否会创建 HttpServlet 对象,默认是 true
- extends 属性:设置 JSP 底层 Servlet 程序默认继承的类
8.2.2 JSP 中的常用脚本
- 声明脚本
- 格式:<%! 声明 java 代码 %>
- 作用:可以给 JSP 翻译出来的 Java 类定义属性和方法,内部类和静态代码块等
- 练习:
<%@ page import="java.util.List" %>
<%@ page import="java.util.LinkedList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%-- 声明类属性 --%>
<%!private String userName;private int usrAge;private boolean usrSex;private static List<String> userHobbysList;
%>
<%-- 声明 static 静态代码块 --%>
<%!static {userHobbysList = new LinkedList<>();userHobbysList.add("lmq");userHobbysList.add("yxg");userHobbysList.add("ljh");}
%>
<%-- 声明类方法 --%>
<%!public void userEatKind(){System.out.println("eatDinner!");}public String userPlayKind(String playKind){return playKind;}
%>
<%-- 声明内部类 --%>
<%!public static class userSchoolTeacher{private String userTeacherName;private int usrTeacherAge;private boolean usrTeacherSex;private static List<String> userTeacherHobbysList;}
%>
</body>
</html>
- 表达式脚本:
- 格式:<%= 表达式脚本 %>
- 作用:在 JSP 页面上输出数据
- 特点:
- 所有表达式脚本都会被翻译到 _jspService() 方法中
- 表达式脚本都会被翻译成为 out.print() 输出到页面上
- _jspService() 方法中的对象都可以直接使用
- 表达式脚本中的表达式不能以分号结束
- 练习:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%!public static class User {private String userName = "lmq";}
%>
<%-- 输出整型 --%>
<%= 12 %><br>
<%-- 输出浮点型 --%>
<%= 3.1415926 %><br>
<%-- 输出字符串 --%>
<%= "中华人民共和国" %><br>
<%-- 输出对象 --%>
<%= new User().userName %>
</body>
</html>
- 代码脚本:
- 格式:<% java 语句 %>
- 作用:在 JSP 页面中,编写我们自己需要的需求功能
- 特点:
- 代码脚本翻译之后都在 _jspService() 方法中
- 代码脚本由于翻译到 _jspService() 方法中,所以 _jspService() 方法中的现有对象都可以直接使用
- 可以由多个代码脚本块组合完成一个完成的 java 语句
- 代码脚本可以和表达式脚本还有 HTML 语言交互使用
- 练习:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%-- if 语句 --%>
<%Integer nextData = 1;if (nextData == 1) {System.out.println("Yes");} else {System.out.println("No");}
%>
<%-- for 循环语句 --%>
<table border="1" cellspacing="0"><%for (int i = 0; i < 10; i++) {
%><tr><td><%= "第" + (i + 1) + "行"%><br></td></tr><%System.out.println("第"+i+1+"行");}
%>
</body>
</html>
8.2.3 JSP 中的三种注释
- HTML 注释
- JAVA 注释
- JSP 注释
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<!-- this is html 注释 -->
<%//this is java 单行注释
/* this is java 多行注释 */
%>
<%-- this is jsp 注释--%>
</body>
</html>
8.2.4 练习
在 JSP 页面中输出九九乘法口诀表
<%-- PrintHtml.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1 align="center">九九乘法口诀表</h1><table align="center" border="1" cellspacing="0"><% for (int i = 1; i < 10; i++) { %><tr><% for (int j = 1; j < i + 1; j++) { %><td><%= j + "*" + i + "=" + i * j + " " %></td><% } %></tr><% } %></table>
</body>
</html>
8.3 JSP 的对象
8.3.1 九大内置对象
- request:请求对象
- response:响应对象
- session:会话对象
- pageConetext:JSP 的上下文对象
- application:ServletContext 对象
- config:ServletConfig 对象
- out:jsp 输出流对象
- page:指向当前的 jsp 的对象
- exception:异常对象
8.3.2 四大域对象
域对象是可以像 Map 一样存取数据的对象,四个域对象功能一样,不同的是它们对数据的存取范围有区别
- PageContextImpl 类:pageContext 对象,当前 JSP 页面范围内有效
- HttpServletRequest 类:request 对象,一次请求内有效
- HttpSession 类:session 对象,一个会话范围内有效
- ServletContext 类:application 对象,整个 web 工程范围内都有效
application => session=> request => pageContext
8.3.3 JSP 中的 out 输出和 response.getWriter
- response.getWriter 输出
- out 输出
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><%response.getWriter().write("response 输出 <br>");out.write("out 输出");%>
</body>
</html>
- 执行 out.flush() 操作,会把 out 缓冲区中的数据追加写入到 response 缓冲区末尾
- 执行 response 的刷新操作,把全部数据写给客户端
- 可以使用 out.print() 来进行输出
8.4 JSP 的常用标签
8.4.1 JSP 静态包含
- 静态包含,就是把包含 JSP 页面内的代码拷贝到所包含的位置执行输出
- <%@ include file=""%> 就是静态包含,file 属性指定你要包含的 JSP 页面的路径
<%-- PrintHtml.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
jsp 页面1<br>
jsp 页面2<br>
<%@include file="PrintHtml2.jsp"%>
</body>
</html>// 通过include方法标签设置连接页面进行组合显示
<%-- PrintHtml2.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
jsp 页面3<br>
</body>
</html>
8.4.2 JSP 动态包含
- 动态包含,就是把包含 JSP 页面内的代码拷贝到所包含的位置执行输出
- 动态包含支持传递参数
- <jsp:include page=""></jsp:include>,page 属性指定你要包含的 JSP 页面的路径
<%-- PrintHtml.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
jsp 页面1<br>
jsp 页面2<br>
<jsp:include page="PrintHtml2.jsp"></jsp:include>
</body>
</html>// 通过include方法标签设置连接页面进行组合显示
<%-- PrintHtml2.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
jsp 页面3<br>
</body>
</html>
8.4.3 JSP 标签-转发
- <jsp:forward page=""></jsp:forward> 是请求转发标签
- page 属性设置请求转发的网址路径
<%-- PrintHtml.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
jsp 页面1<br>
jsp 页面2<br>
<jsp:forward page="PrintHtml2.jsp"></jsp:forward>
</body>
</html>
8.5 Listener 监听器
8.5.1 Listener 监听器的概念
- Listener 监听器它是 JavaWeb 的三大组件之一,JavaWeb 的三大组件分别是:Servlet 程序,Filter 过滤器,Listener 监听器
- Listener 它是 JavaEE 的规范,就是接口,监听器的作用是监听某种事务的变化,然后通过回调函数,反馈给客户程序去做一些相应的处理
8.5.2 SerContextListener 监听器
- ServletContextListenter 可以监听 ServletContext 对象的创建和销毁
- ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁
- 监听到创建和销毁之后都分别会调用 ServletContextListenter 监听器的方法反馈
使用 ServletContextListenter 监听 ServletContext 对象
- 编写类来实现 ServletContextListenter 接口 调用其两个回调方法
/* ServletContextListenerImpl.java */
package com.jsp.Listener;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;/*** @Description: ServletContext 监听器* @author: XFDQ.lmq* @create: 2022-08-11 16:36*/
public class ServletContextListenerImpl implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("ServletContext 对象被创建");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("ServletContext 对象被销毁");}
}
- 在 web.xml 中进行配置监听器
<listener><listener-class>ServletContextListenerImpl 路径</listener-class>
</listener>
上一节:
下一节:
【JavaWeb
第八章 JSP 动态网页技术
创作日期:2021-12-27
8.1 JSP 介绍
JSP(全称JavaServer Pages)是一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成 HTML,XML 或其他格式文档的Web 网页,然后返回给请求者。JSP 技术以 Java 语言作为脚本语言,为用户的 HTTP 请求提供服务,并能与服务器上的其它 Java 程序共同处理复杂的业务需求。
8.1.1 JSP 的作用
JSP 的主要作用是代替 Servlet 程序回传 html 页面的数据,因为 Servlet 程序回传 html 页面数据是一件非常繁琐的事情,开发成本和维护成本都极高
8.1.2 JSP 的本质
JSP 本质就是一个 Servlet 程序
8.2 JSP 的三种语法
8.2.1 JSP 头部的 page 指令
Jsp 的 page 指令可以修改 jsp 页面中一些重要的属性或者行为
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- language 属性:表示 JSP 翻译后的语言文件格式,暂时只支持 java
- contenType 属性:JSP 返回的数据类型,也是 response.setContentType() 参数值
- pageEncoding 属性:JSP 页面文件本身的字符集
- import 属性:跟 java 源代码中一样,用于导包,导类
- autoFlush 属性:设置当 out 输出缓冲区满了,是否自动刷新冲级区,默认为 true
- buffer 属性:设置 out 缓存区的大小,默认 8kb
- errorPage 属性:设置当 JSP 页面运行时出错,自动跳转页面的路径
- isErrorPage 属性:设置当前 JSP 页面是否是错误信息页面,默认是 false
- session 属性:设置访问当前 JSP 页面,是否会创建 HttpServlet 对象,默认是 true
- extends 属性:设置 JSP 底层 Servlet 程序默认继承的类
8.2.2 JSP 中的常用脚本
- 声明脚本
- 格式:<%! 声明 java 代码 %>
- 作用:可以给 JSP 翻译出来的 Java 类定义属性和方法,内部类和静态代码块等
- 练习:
<%@ page import="java.util.List" %>
<%@ page import="java.util.LinkedList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%-- 声明类属性 --%>
<%!private String userName;private int usrAge;private boolean usrSex;private static List<String> userHobbysList;
%>
<%-- 声明 static 静态代码块 --%>
<%!static {userHobbysList = new LinkedList<>();userHobbysList.add("lmq");userHobbysList.add("yxg");userHobbysList.add("ljh");}
%>
<%-- 声明类方法 --%>
<%!public void userEatKind(){System.out.println("eatDinner!");}public String userPlayKind(String playKind){return playKind;}
%>
<%-- 声明内部类 --%>
<%!public static class userSchoolTeacher{private String userTeacherName;private int usrTeacherAge;private boolean usrTeacherSex;private static List<String> userTeacherHobbysList;}
%>
</body>
</html>
- 表达式脚本:
- 格式:<%= 表达式脚本 %>
- 作用:在 JSP 页面上输出数据
- 特点:
- 所有表达式脚本都会被翻译到 _jspService() 方法中
- 表达式脚本都会被翻译成为 out.print() 输出到页面上
- _jspService() 方法中的对象都可以直接使用
- 表达式脚本中的表达式不能以分号结束
- 练习:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%!public static class User {private String userName = "lmq";}
%>
<%-- 输出整型 --%>
<%= 12 %><br>
<%-- 输出浮点型 --%>
<%= 3.1415926 %><br>
<%-- 输出字符串 --%>
<%= "中华人民共和国" %><br>
<%-- 输出对象 --%>
<%= new User().userName %>
</body>
</html>
- 代码脚本:
- 格式:<% java 语句 %>
- 作用:在 JSP 页面中,编写我们自己需要的需求功能
- 特点:
- 代码脚本翻译之后都在 _jspService() 方法中
- 代码脚本由于翻译到 _jspService() 方法中,所以 _jspService() 方法中的现有对象都可以直接使用
- 可以由多个代码脚本块组合完成一个完成的 java 语句
- 代码脚本可以和表达式脚本还有 HTML 语言交互使用
- 练习:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%-- if 语句 --%>
<%Integer nextData = 1;if (nextData == 1) {System.out.println("Yes");} else {System.out.println("No");}
%>
<%-- for 循环语句 --%>
<table border="1" cellspacing="0"><%for (int i = 0; i < 10; i++) {
%><tr><td><%= "第" + (i + 1) + "行"%><br></td></tr><%System.out.println("第"+i+1+"行");}
%>
</body>
</html>
8.2.3 JSP 中的三种注释
- HTML 注释
- JAVA 注释
- JSP 注释
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<!-- this is html 注释 -->
<%//this is java 单行注释
/* this is java 多行注释 */
%>
<%-- this is jsp 注释--%>
</body>
</html>
8.2.4 练习
在 JSP 页面中输出九九乘法口诀表
<%-- PrintHtml.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1 align="center">九九乘法口诀表</h1><table align="center" border="1" cellspacing="0"><% for (int i = 1; i < 10; i++) { %><tr><% for (int j = 1; j < i + 1; j++) { %><td><%= j + "*" + i + "=" + i * j + " " %></td><% } %></tr><% } %></table>
</body>
</html>
8.3 JSP 的对象
8.3.1 九大内置对象
- request:请求对象
- response:响应对象
- session:会话对象
- pageConetext:JSP 的上下文对象
- application:ServletContext 对象
- config:ServletConfig 对象
- out:jsp 输出流对象
- page:指向当前的 jsp 的对象
- exception:异常对象
8.3.2 四大域对象
域对象是可以像 Map 一样存取数据的对象,四个域对象功能一样,不同的是它们对数据的存取范围有区别
- PageContextImpl 类:pageContext 对象,当前 JSP 页面范围内有效
- HttpServletRequest 类:request 对象,一次请求内有效
- HttpSession 类:session 对象,一个会话范围内有效
- ServletContext 类:application 对象,整个 web 工程范围内都有效
application => session=> request => pageContext
8.3.3 JSP 中的 out 输出和 response.getWriter
- response.getWriter 输出
- out 输出
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><%response.getWriter().write("response 输出 <br>");out.write("out 输出");%>
</body>
</html>
- 执行 out.flush() 操作,会把 out 缓冲区中的数据追加写入到 response 缓冲区末尾
- 执行 response 的刷新操作,把全部数据写给客户端
- 可以使用 out.print() 来进行输出
8.4 JSP 的常用标签
8.4.1 JSP 静态包含
- 静态包含,就是把包含 JSP 页面内的代码拷贝到所包含的位置执行输出
- <%@ include file=""%> 就是静态包含,file 属性指定你要包含的 JSP 页面的路径
<%-- PrintHtml.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
jsp 页面1<br>
jsp 页面2<br>
<%@include file="PrintHtml2.jsp"%>
</body>
</html>// 通过include方法标签设置连接页面进行组合显示
<%-- PrintHtml2.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
jsp 页面3<br>
</body>
</html>
8.4.2 JSP 动态包含
- 动态包含,就是把包含 JSP 页面内的代码拷贝到所包含的位置执行输出
- 动态包含支持传递参数
- <jsp:include page=""></jsp:include>,page 属性指定你要包含的 JSP 页面的路径
<%-- PrintHtml.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
jsp 页面1<br>
jsp 页面2<br>
<jsp:include page="PrintHtml2.jsp"></jsp:include>
</body>
</html>// 通过include方法标签设置连接页面进行组合显示
<%-- PrintHtml2.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
jsp 页面3<br>
</body>
</html>
8.4.3 JSP 标签-转发
- <jsp:forward page=""></jsp:forward> 是请求转发标签
- page 属性设置请求转发的网址路径
<%-- PrintHtml.jsp --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
jsp 页面1<br>
jsp 页面2<br>
<jsp:forward page="PrintHtml2.jsp"></jsp:forward>
</body>
</html>
8.5 Listener 监听器
8.5.1 Listener 监听器的概念
- Listener 监听器它是 JavaWeb 的三大组件之一,JavaWeb 的三大组件分别是:Servlet 程序,Filter 过滤器,Listener 监听器
- Listener 它是 JavaEE 的规范,就是接口,监听器的作用是监听某种事务的变化,然后通过回调函数,反馈给客户程序去做一些相应的处理
8.5.2 SerContextListener 监听器
- ServletContextListenter 可以监听 ServletContext 对象的创建和销毁
- ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁
- 监听到创建和销毁之后都分别会调用 ServletContextListenter 监听器的方法反馈
使用 ServletContextListenter 监听 ServletContext 对象
- 编写类来实现 ServletContextListenter 接口 调用其两个回调方法
/* ServletContextListenerImpl.java */
package com.jsp.Listener;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;/*** @Description: ServletContext 监听器* @author: XFDQ.lmq* @create: 2022-08-11 16:36*/
public class ServletContextListenerImpl implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("ServletContext 对象被创建");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("ServletContext 对象被销毁");}
}
- 在 web.xml 中进行配置监听器
<listener><listener-class>ServletContextListenerImpl 路径</listener-class>
</listener>
上一节:
下一节: