JSP
jsp 的本质 ,其实是一个 Servlet 程序
JSP的语法
jsp 文件头部声明介绍(page 指令介绍)
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8” %>
language 属性 | 值只能是 java。 表示翻译的得到的是 java 语言的 |
pageEncoding 属性 | 设置当前 jsp 页面的编码 |
contentType 属性 | 设置响应头 contentType 的内容 |
import 属性 | 给当前 jsp 页面导入需要使用的类包 |
autoFlush 属性 | 设置是否自动刷新 out 的缓冲区,默认为 true |
buffer 属性 | 设置 out 的缓冲区大小。默认为 8KB |
errorPage 属性 | 设置当前 jsp 发生错误后,需要跳转到哪个页面去显示错误信息 |
isErrorPage 属性 | 设置当前 jsp 页面是否是错误页面。是的话,就可以使用 exception 异常对象 |
session 属性 | 设置当前 jsp 页面是否获取 session 对象,默认为 true |
extends 属性 | 给服务器厂商预留的 |
jsp 中的三种脚本介绍
第一种:声明脚本
翻译对照:
第二种:表达式脚本
翻译对照:
第三种:代码脚本
码脚本的格式是:
<%
java 语句
%>
代码脚本的作用是:可以在 jsp 页面中,编写我们自己需要的功能(写的是 java 语句)
代码脚本的特点是:
- 代码脚本翻译之后都在_jspService 方法中
- 代码脚本由于翻译到_jspService()方法中,所以在_jspService()方法中的现有对象都可以直接使用。
- 还可以由多个代码脚本块组合完成一个完整的 java 语句。
- 代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据
翻译对照:
jsp 中的注释
jsp 九大内置对象
内置对象 | 介绍 |
request | 请求对象,可以获取请求信息 |
response | 响应对象。可以设置响应信息 |
pageContext | 当前页面上下文对象。可以在当前上下文保存属性信息 |
session | 会话对象。可以获取会话信息 |
exception | 异常对象只有在 jsp 页面的 page 指令中设置 isErrorPage=“true” 的时候才会存在 |
application | ServletContext 对象实例,可以获取整个工程的一些信息 |
config | ServletConfig 对象实例,可以获取 Servlet 的配置信息 |
out | 输出流 |
page | 表示当前 Servlet 对象实例(无用,用它不如使用 this 对象) |
九大内置对象,都是我们可以在【代码脚本】中或【表达式脚本】中直接使用的对 象
jsp 四大域对象
四大域对象经常用来保存数据信息
域对象 | 作用域 |
pageContext | 可以保存数据在同一个 jsp 页面中使用 |
request | 可以保存数据在同一个 request 对象中使用。经常用于在转发的时候传递数据 |
session | 可以保存在一个会话中使用 |
application(ServletContext) | 就是 ServletContext 对象 |
jsp 中 out 输出流 和 response.getwriter() 输出流
由于 jsp 翻译之后,底层源代码都是使用 out 来进行输出,所以一般情况下。我们在 jsp 页面中统一使用 out 来进行输出。避 免打乱页面输出内容的顺序。
out.write() 输出字符串没有问题
out.print() 输出任意数据都没有问题(都转换成为字符串后调用的 write 输出)
深入源码,浅出结论:在 jsp 页面中,可以统一使用 out.print()来进行输出
jsp常用标签
静态包含
示例说明:
<%--
<%@ include file=""%> 就是静态包含
file 属性指定你要包含的 jsp 页面的路径
地址中第一个斜杠 / 表示为 http://ip:port/工程路径/ 映射到代码的 web 目录
静态包含的特点:
1、静态包含不会翻译被包含的 jsp 页面。
2、静态包含其实是把被包含的 jsp 页面的代码拷贝到包含的位置执行输出。
--%>
<%@ include file="/include/footer.jsp"%>
动态包含
示例说明:
<%--
<jsp:include page=""></jsp:include> 这是动态包含
page 属性是指定你要包含的 jsp 页面的路径
动态包含也可以像静态包含一样。把被包含的内容执行输出到包含位置
动态包含的特点:
1、动态包含会把包含的 jsp 页面也翻译成为 java 代码
2、动态包含底层代码使用如下代码去调用被包含的 jsp 页面执行输出。
JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
3、动态包含,还可以传递参数
--%>
<jsp:include page="/include/footer.jsp">
<jsp:param name="username" value="bbj"/>
<jsp:param name="password" value="root"/>
</jsp:include>
动态包含底层原理图:
转发
示例说明:
<%--
<jsp:forward page=""></jsp:forward> 是请求转发标签,它的功能就是请求转发
page 属性设置请求转发的路径
--%>
<jsp:forward page="/scope2.jsp"></jsp:forward>
案例
九九乘法表
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style type="text/css">
table{
width: 650px;
}
</style>
</head>
<body>
<%-- 练习一:在jsp页面中输出九九乘法口诀表 --%>
<h1 align="center">九九乘法口诀表</h1>
<table align="center">
<% for (int i = 1; i <= 9; i++) { %>
<tr>
<% for (int j = 1; j <= i ; j++) { %>
<td><%=j + "x" + i + "=" + (i*j)%></td>
<% } %>
</tr>
<% } %>
</table>
</body>
</html>
jsp 输出一个表格,里面有 10 个学生信息
<%@ page import="java.util.List" %>
<%@ page import="com.atguigu.pojo.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style>
table{
border: 1px blue solid;
width: 600px;
border-collapse: collapse;
}
td,th{
border: 1px blue solid;
}
</style>
</head>
<body>
<%--练习二:jsp输出一个表格,里面有10个学生信息。--%>
<%
List<Student> studentList = (List<Student>) request.getAttribute("stuList");
%>
<table>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>电话</td>
<td>操作</td>
</tr>
<% for (Student student : studentList) { %>
<tr>
<td><%=student.getId()%></td>
<td><%=student.getName()%></td>
<td><%=student.getAge()%></td>
<td><%=student.getPhone()%></td>
<td>删除、修改</td>
</tr>
<% } %>
</table>
</body>
</html>
监听器Listener
- Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监 听器。
- Listener 它是 JavaEE 的规范,就是接口
- 监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。
ServletContextListener 监听器
ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。
ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。
监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈 。
方法如下:
public interface ServletContextListener extends EventListener {
/**
* 在 ServletContext 对象创建之后马上调用,做初始化
*/
public void contextInitialized(ServletContextEvent sce);
/**
* 在 ServletContext 对象销毁之后调用
*/
public void contextDestroyed(ServletContextEvent sce);
}
配置监听器
<!--配置监听器-->
<listener>
<listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
</listener>
实现类:
public class MyServletContextListenerImpl implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 对象被创建了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext 对象被销毁了");
}
}