基本概念
什么是jsp,它有什么作用
- jsp的全称是Java server pages。Java的服务器页面
- jsp的主要作用是代替Servlet程序回传html页面的数据
- 因为Servlet程序回传html页面是一件非常繁琐的事情。开发成本和维护成本都极高
如何创建jsp的页面
选中web_app,new-jsp文件
如何访问
jsp 页面和html 页面一样,都是存放在web 目录下。访问也跟访问html 页面一样。
比如:
在web 目录下有如下的文件:
web 目录
a.html 页面访问地址是:>>>>>> http://ip:port/工程路径/a.html
b.jsp 页面访问地址是:>>>>>> http://ip:port/工程路径/b.jsp
jsp的本质
- jsp页面本质上是一个Servlet程序
- 当我们第一次访问jsp页面的时候。Tomcat服务器会帮我们把jspp页面翻译成为一个Java源文件。并且对它进行编译成.class字节码程序。
- 我们跟踪原代码发现,HttpJspBase 类。它直接地继承了HttpServlet 类。也就是说。jsp 翻译出来的java 类,它间接了继承了HttpServlet 类。也就是说,翻译出来的是一个Servlet 程序
jsp的三种语法
jsp头部的page指令
jsp 的page 指令可以修改jsp 页面中一些重要的属性,或者行为。
<%--
Created by IntelliJ IDEA.
User: ningqian
Date: 2021/5/10
Time: 16:56
To change this template use File | Settings | File Templates.
--%>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %>
<%@ page errorPage="/error500.jsp"
language="java" %>
<%--errorPage表示错误后自动跳转的路径,这个路径一般以斜杠打头,它表示请求地址为:http://ip:port/工程路径/ <br/>
映射到代码的web目录--%>
<html>
<head>
<title>Title</title>
</head>
<body>
这是html数据
</body>
</html>
i. language 属性表示jsp 翻译后是什么语言文件。暂时只支持java。
ii. contentType 属性表示jsp 返回的数据类型是什么。也是源码中response.setContentType()参数值
iii. pageEncoding 属性表示当前jsp 页面文件本身的字符集。
iv. import 属性跟java 源代码中一样。用于导包,导类。
两个属性是给out 输出流使用=====
v. autoFlush 属性设置当out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是true。
vi. buffer 属性设置out 缓冲区的大小。默认是8kb
vii. errorPage 属性设置当jsp 页面运行时出错,自动跳转去的错误页面路径。
viii. isErrorPage 属性设置当前jsp 页面是否是错误信息页面。默认是false。如果是true 可以
获取异常信息。
ix. session 属性设置访问当前jsp 页面,是否会创建HttpSession 对象。默认是true。
x. extends 属性设置jsp 翻译出来的java 类默认继承谁。
jsp的常用脚本
声明脚本(极少使用)
格式
<%! 声明的内容 %>
作用
- 声明类属性
- 声明静态代码块
- 声明类的方法
- 声明内部类
示例
<%--1.声明类属性--%>
<%!
private Integer id;
private String name;
private static Map<String,Object> map;
%>
<%--2.静态代码块--%>
<%!
static{
map = new HashMap<String,Object>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
}
%>
<%--3. 声明类的方法--%>
<%!
public int sum(){
return 1+1;
}
%>
<%--4. 声明内部类--%>
<%!
public static class A{
private int num;
private String nickname;
}
%>
表达式脚本(经常使用)
格式
<%=表达式%>
作用
在jsp页面上输出数据
示例
<%--1. 输出整形--%>
<%=12%> <br/>
<%--2. 输出浮点型--%>
<%=13.14%><br/>
<%--3. 输出字符串--%>
<%="字符串"%><br/>
<%--4. 输出对象--%>
<%=map%><br/>
特点
1、所有的表达式脚本都会被翻译到_jspService() 方法中
2、表达式脚本都会被翻译成为out.print()输出到页面上
3、由于表达式脚本翻译的内容都在_jspService() 方法中,所以_jspService()方法中的对象都可以直接使用。
4、表达式脚本中的表达式不能以分号结束。
代码脚本
格式
<%
java语句
%>
作用
可以在jsp页面中,编写我们自己需要的功能(Java语句)
特点
- 可以由多个代码脚本块组合完成一个完整的java 语句。
- 代码脚本还可以和表达式脚本一起组合使用,在jsp 页面上输出数据
示例
<%
for(int i=0;i<3;i++){
%>
<%="你还好吗"%><br/>
<%
System.out.println("宁好难受");
}
%>
jsp的九大内置对象
** jsp中的内置对象,是指Tomcat在翻译jsp页面成为Servlet源代码后,内部提供的九大对象,叫内置对象**
- request 请求对象
- response 响应对象
- pageContext jsp的上下文对象
- session 会话对象
- application ServletContext对象
- config ServletConfig对象
- out jsp输出流对象
- page 指向当前jsp的对象
- exception 异常对象
jsp的四大域对象
域对象是可以像Map一样存取数据的对象,四个域对象功能一样,不同的是他们对数据的存取范围不同
pageContext、request、application、session
pageContext
- 所属类:PageContextImpl类
- 存取范围:当前jsp页面
request
- 所属类:HttpServletRequest
- 存取范围:一次请求有效
session
- 所属类:HttpSession类
- 存取范围:一次会话有效(打开浏览器访问服务器,直到关闭浏览器)
application
- 所属类:ServletContext类
- 存取范围:整个web工程(只要web工程不停止,数据都在)
示例
- 创建一个jsp页面,命名为scope.jsp
<%--
Created by IntelliJ IDEA.
User: ningqian
Date: 2021/5/10
Time: 21:18
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>jsp的九大内置对象</title>
</head>
<body>
<h1>scope.jsp页面</h1>
<%
/*往四个域中分别保存了数据*/
/*如果pageContext对象没有setAttribute方法,需要到tomcat的安装目录下的lib文件夹下找到jsp-api.jar导入到项目中*/
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>
- 创建第二个jsp页面,命名为scope2.jsp
<%--
Created by IntelliJ IDEA.
User: ningqian
Date: 2021/5/10
Time: 21:18
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>jsp的九大内置对象</title>
</head>
<body>
<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>
</html>
- 测试
(1) 启动服务器,打开浏览器,输入http://localhost:8080/jsp/scope.jsp,查看四个域对象存的属性值
(2)在地址栏输入http://localhost:8080/jsp/scope2.jsp,查看四个域对象存的属性值
(3)关闭浏览器,重新输入http://localhost:8080/jsp/scope2.jsp
(4)重新配置服务器,刷新浏览器,查看四个域对象存的属性值
四大域对象的使用顺序
按照有效范围由小到大使用
pageContext->request->session->application
jsp中的out输出和response.getWriter输出的区别
由于jsp 翻译之后,底层源代码都是使用out 来进行输出,所以一般情况下。我们在jsp 页面中统一使用out 来进行输出。避
免打乱页面输出内容的顺序。
out.write() 输出字符串没有问题
out.print() 输出任意数据都没有问题(都转换成为字符串后调用的write 输出)
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标签转发
<%--
<jsp:forward page=""></jsp:forward> 是请求转发标签,它的功能就是请求转发
page 属性设置请求转发的路径
--%>
<jsp:forward page="/scope2.jsp"></jsp:forward>
Listener监听器
1、Listener 监听器它是JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监
听器。
2、Listener 它是JavaEE 的规范,就是接口
3、监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。
ServletContextListener 监听器
ServletContextListener 它可以监听ServletContext 对象的创建和销毁。
ServletContext 对象在web 工程启动的时候创建,在web 工程停止的时候销毁。
监听到创建和销毁之后都会分别调用ServletContextListener 监听器的方法反馈。
两个方法分别是:
public interface ServletContextListener extends EventListener {
/**
* 在ServletContext 对象创建之后马上调用,做初始化
*/
public void contextInitialized(ServletContextEvent sce);
/**
* 在ServletContext 对象销毁之后调用
*/
public void contextDestroyed(ServletContextEvent sce);
}
使用ServletContextListener 监听器监听ServletContext 对象
1、编写一个类去实现ServletContextListener
2、实现其两个回调方法
3、到web.xml 中去配置监听器
监听器实现类:
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 对象被销毁了");
}
}
web.xml 中的配置:
<!--配置监听器-->
<listener>
<listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
</listener>