文章目录
- ⭐️ 一.jsp概念及其作用
- ⭐️ 二.jsp的本质
- ⭐️三.jsp的三种语法
- ⭐️四.jsp的九大内置对象
- ⭐️五.jsp四大域对象
- ⭐️六.jsp中的out输出和response.getWriter输出的区别
- ⭐️七.jsp的常用标签
- ⭐️八.Listener监听器
⭐️ 一.jsp概念及其作用
1.概念:jsp的全称是java server pages,java的服务器界面.
2.作用: 代替servlet程序回传html页面的数据.
因为servlet程序回传html页面的数据是一件非常繁琐的事情,开发成本和维护成本都极高.
- 用servlet程序回传数据
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过响应的输出回传html页面数据
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("<!DOCTYPE html>");
writer.write("<html lang=\"en\">\r\n");
writer.write("<head>\r\n");
writer.write("<meta charset=\"UTF-8\">\r\n");
writer.write("<title>Title</title>\r\n");
writer.write("</head>\r\n");
writer.write("<body>\r\n");
writer.write(" 这是html页面数据\r\n");
writer.write("<body>\r\n");
writer.write("</html>\r\n");
}
- 用jsp回传数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
a.jsp页面
</body>
</html>
⭐️ 二.jsp的本质
本质:是一个servlet程序
当我们第一次访问jsp页面的时候,Tomcat服务器会帮我们把jsp页面翻译成为一个java源文件,并对它进行编译成为.class字节码程序

我们打开java源文件发现里面的内容为:

我们跟踪源代码发现,HttpJspBase类直接的继承了HttpServlet类.
也就是说,jsp翻译出来java类,间接的继承了HttpServlet类,也就是说翻译出来的是一个sevlet程序.
我们通过对翻译出来的Servlet程序的观察发现,其底层实现也是通过输出流,把html页面的数据回传给客户端.
⭐️三.jsp的三种语法
1.jsp头部的page指令
jsp的page指令可以修改jsp页面中一些重要的属性或者行为.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
language属性 表示jsp翻译后是什么语言文件,暂时只支持ava.
contentType属性 表示jsp返回的数据类型是什么.也是源码中response.setContentType参数值
pageEncoding属性 表示当前jsp页面文件本身的字符集
import属性 跟java源代码一样,用于导包导类.
autoFlush属性 设置当out输出流缓冲区满了之后,是否自动刷新缓冲区,默认值是true
buffer属性 设置out缓冲区的大小,默认是8kb.
errorPage属性 设置当jsp页面运行出错时,自动跳转到错误页面的路径.
isErrorPage属性 设置当前jsp页面是否是错误页面,默认是false.
session属性 设置访问当前jsp页面,是否会创建HttpSession对象,默认是true.
extends属性 设置jsp翻译出来的java类默认继承谁.
注意:autoFlush属性和buffer属性是给out输出流使用.
2.jsp中的常用脚本
(1).声明脚本(极少用)
格式:<%! 声明java代码 %>
作用:可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块,内部类等.
<body>
//1.声明类属性
<%!
private Integer id;
private String name;
private static Map<String,Object> map;
%>
//2.声明static静态代码块
<%!
static{
map = new HashMap<String,Object>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
}
%>
//3.声明类方法
<%!
public int abc(){
return 12;
}
%>
//4.声明内部类
<%!
public static class A{
private Integer id = 12;
private String abc = "abc";
}
%>
</body>
(2).表达式脚本(常用)
格式:<%=表达式%>
作用:在jsp页面上输出数据.
特点:
第一点:所有的表达式脚本,都会被翻译到_jspService方法中.
第二点:表达式脚本都会被翻译成为out.print()输出到页面上.
第三点:由于表达式脚本翻译的内容都在_jspService方法中,所以_jspService方法中的对象都可以直接使用.
第四点:表达式脚本中的表达式不能以分号结束.
<%--1.输出整形--%>
<%--2.输出浮点型--%>
<%--3.输出字符串--%>
<%--4.输出对象--%>
<%--5.获得请求参数--%>
<%=12 %> </br>
<%=12.12 %> </br>
<%="我是字符串" %> </br>
<%=map %> </br>
<%=request.getParameter("username")%>
(3).代码脚本
格式:<% java语句 %>
作用:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)
特点:
第一点:代码脚本翻译后都在_jspService方法中.
第二点:代码脚本由于翻译到_jspService方法中,所以在_jspService方法中的现有对象都可以直接使用.
第三点:还可以由多个代码脚本块组合完成一个完整的java语句.
第四点:``代码脚本可以和表达式脚本一起组合使用,在jsp页面上输出数据.
<%--1.if语句--%>
<%--2.for语句--%>
<%--3.翻译后_jspService方法内的代码都可以写--%>
<%
int i = 12;
if(i == 12){
%>
<h1>你好</h1>
<%
}
%>
<table border="1" cellspacing="0">
<%
for(int j = 0;j < 3;j++){
%>
<tr>
<td>第<%=j + 1%>行</td>
</tr>
<%
}
%>
<%
String username = request.getParameter("username");
System.out.println("用户名的请求参数值是:" + username);
%>
3.jsp中的三种注释
(1).html 注释
html注释会被翻译到java源代码中,在_jspService方法中,以out.writer输出到客户端.
(2).java注释

java注释会被翻译到java源代码中.
(3).jsp注释

jsp注释可以注掉jsp页面中所有代码.
⭐️四.jsp的九大内置对象

⭐️五.jsp四大域对象
四个与域对象分别是:
pageContext (PageContextimpl类) 当前jsp页面范围内有效.
request (HttpServletRequest类) 一次请求内有效.
session (HttpSession类) 一个会话范围内有效,(打开浏览器访问服务器,直到关闭浏览器).
application (ServletContext类) 整个web工程范围内有效(只要web工程不停止,数据都在).
注意:
域对象可以像Map一样是存取数据的对象,四个域对象功能一样,但对数据的存取范围不同.
使用上的优先顺序: pageContext—request—session—application
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>scope.jsp页面</h1>
<%
pageContext.setAttribute("key","pageContext");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
%>
pageContext:<%= pageContext.getAttribute("key") %></br>
request:<%= request.getAttribute("key")%></br>
session:<%= session.getAttribute("key")%></br>
application:<%= application.getAttribute("key")%></br>
<%
request.getRequestDispatcher("/scope2.jsp").forward(request,response);
%>
</body>
</html>
<h1>scope2.jsp页面</h1>
pageContext:<%=pageContext.getAttribute("key")%></br>
request:<%=request.getAttribute("key")%></br>
session:<%=session.getAttribute("key")%></br>
application:<%=application.getAttribute("key")%></br>
</body>
⭐️六.jsp中的out输出和response.getWriter输出的区别
response中表示响应,经常用于设置返回给客户端的内容(输出).
out也是给用户做输出使用的.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.write("输出</br>");
out.flush();
response.getWriter().write("输出r</br>");
%>
</body>
</html>
注意:
(1).由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下,我们在jsp页面中统一使用out来进行输出,避免打乱页面输出内容的顺序.
(2).
out.write() 输出字符串没有问题
out.print() 输出任何数据都没有问题.(统一使用)
⭐️七.jsp的常用标签
1.jsp静态包含
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
头部信息<br>
主体内容<br>
<%--
<%@ include file="" %> 就是静态包含
file 属性指定你要包含的jsp页面的路径
地址中第一个斜杠 / 表示为http://ip:port/工程路径/ 映射到代码的web目录
静态包含的特点:
1.静态包含不会翻译被包含的jsp页面
2.静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出.
--%>
<%@ include file="/include/footer.jsp"%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
页脚信息<br>
</body>
</html>

2.jsp动态包含
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
头部信息<br>
主体内容<br>
<%--
<jsp:include page=""></jsp:include> 动态包含
page 属性是指你要包含的jsp页面的路径
动态包含和静态包含一样,把被包含的内容执行输出到包含位置
动态包含的特点:
1.动态包含会把被包含的jsp页面也翻译成java代码
2.动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出.
JsRuntimeLibrary.include(request,response,"/include/footer.jsp",out,false);
3.动态包含还可以传递参数
--%>
<jsp:include page="/include/footer.jsp">
<jsp:param name="username" value="root"/>
<jsp:param name="password" value="root1"/>
</jsp:include>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
页脚信息<br>
<%=request.getParameter("password")%>
</body>
</html>

3.jsp标签-转发
<%
// request.getRequestDispatcher(“/scope2.jsp”).forward(request,response);
%>
<%- -<jsp:forward page=""></jsp:forward> 就是请求转发标签 功能就是请求转发
page 属性设置请求转发的路径
–%>
<jsp:forward page=“/scope2.jsp”></jsp:forward>
请求转发的使用说明:

⭐️八.Listener监听器
Listener监听器是JavaWeb的三大组件之一- JavaWeb三大组件:
Servlet程序、Filter过滤器、Listener监听器 - Listener是
JavaEE的规范(接口) - 监听器的作用:监听某种事物的变化,通过
回调函数,反馈给客户(程序)去做一些相应的处理.
1.ServletContextListener监听器
ServletContextListener可以监听ServletContext对象的创建和销毁.ServletContext对象在web工程启动的时候创建,在web工程停止的时候销毁.- 监听到
创建和销毁之后都会分别调用ServletContextListener监听器的方法反馈. - 两个方法分别是:
contextInitialized(ServletContextEvent sce)contextDestroyed(ServletContextEvent sce)
ServletContextListener监听器监听ServletContext对象的步骤
1.编写一个类去实现ServletContextListener
2.实现其两个回调方法
3.到web.xml中配置监听器
public class Listener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象被创建了");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象被销毁了");
}
}
<listener>
<listener-class>com.servlet.listener.Listener</listener-class>
</listener>












![[附源码]java毕业设计大学生足球预约信息](https://img-blog.csdnimg.cn/39b0ca75106e4c418606d0ace5c02f93.png)





