JSp
什么是jsp为什么要学习它?
* jsp 全称Java Server Pages是为了解决动态生成HTML文档的技术
* Servlet程序输出HTML文档比较麻烦
* 访问jsp必须通过浏览器访问Tomcat 服务器再访问jsp页面
* jsp页面是一个类似于HTML的一个页面,直接放在WebContent目录下,和HTML一样
* jsp的默认编码集是iso-8859-1修改jsp的默认编码为UTF-8
* jsp的本质是一个servlet程序
* jsp的html页面内容都被翻译到Servlet中的service方法中直接输出
jsp的语法
1. 头部声明文件的介绍(page 指令介绍)
* <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
* language 属性 值只能是 java。 表示翻译的得到的是 java 语言的
* contentType 属性 设置响应头 contentType 的内容
* pageEncoding 属性 设置当前 jsp 页面的编码
* import 属性 给当前 jsp 页面导入需要使用的类包
* autoFlush 属性 设置是否自动刷新 out 的缓冲区,默认为 true
* buffer 属性 设置 out 的缓冲区大小。默认为 8KB
* errorPage 属性 设置当前 jsp 发生错误后,需要跳转到哪个页面去显示错误信息
* isErrorPage 属性 设置当前 jsp 页面是否是错误页面。是的话,就可以使用 exception 异
* session 属性 设置当前 jsp 页面是否获取 session 对象,默认为 true
* extends 属性 给服务器厂商预留的 jsp 默认翻译的 servlet 继承于什么类
2. jsp 中的三种脚本介绍
1. 第一种,声明脚本:
* 声明脚本格式如下:
* <%!
java代码
%>
* 声明脚本块中,我们可以做4件事
* 我们可以定义全局变量
* 定义static静态代码块
* 定义方法
* 定义内部类
2. 第二种,表达式脚本(***重点,使用很多):
* 表明脚本格式如下:
<%=表达式 %>
* 表达式脚本用于向页面输出内容。
* 表达式脚本 翻译到Servlet程序的service方法中,以out.print()打印输出
* out 是jsp的一个内置对象,用于生成html的源代码
* 不要以分号结尾,否则会报错
* 表达式脚本可以输出任意类型
1. 输出整型
2. 输出浮点型
3. 输出字符串
4. 输出对象
3. 代码脚本(****重点使用最多)
* 代码脚本格式
* <% java代码 %>
* 代码脚本里可以书写任意的 java 语句。
* 代码脚本的内容都会被翻译到 service 方法中。所以 service 方法中可以写的 java 代码,都可以书写到代码脚本中
JSP的注释
1. //单行Java注释
2. /*
多行Java注释
*/
3. 单行注释和多行注释能在翻译后的java源代码中看见
4. <%-- jsp注释--%> jsp注释在翻译的时候会直接接被忽略掉
5. <!-- html注释 --> html 注释会被翻译到java代码中输出到HTML页面中查看
jsp九大内置对象
1. request 对象 请求对象,可以获取请求信息
2. response对象 响应对象, 可以设置响应对象
3. pageContext 对象 当前页面上下文对象,可以在当前上下文保存属性信息
4. session对象 会话对象,可以获取会话信息
5. exception对象 异常对象只有在jsp页面的page指令中设置 isErrorPage="true" 的时候才会存在
6. application对象 ServletContext对象实例,可以获取整个工程的一些信息
7. config对象 ServletConfig对象实例,可以获取Servlet的配置信息
8. out对象 输出流
9. page对象 表示当前Servlet对象实例(无用,用它不如使用this对象)
* 九大内置对象都是可以在代码脚本和表达式脚本中直接使用的对象
jsp四大域对象
常用来保存数据信息
1. pageContext 可以保存数据在同一个jsp页面中使用
2. request 可以保存数据在同一个request对象中使用,经常用于在转发的时候传递数据
3. session 可以保存在一个会话中使用
4. application (ServletContext) 就是ServletCont对象
jsp中out输出流和response.getwriter() 输出流

image.png
jsp的常用标签(重点***)
* 静态包含,动态包含,转发
1. 静态包含--很常用
* <%@ include file=""%>
* 静态包含就是包含的页面内容原封不动的输出到包含的位置
2. 动态包含--很少用
* <jsp:include page=""></jsp:include>
* 动态包含会把包含的 jsp 页面单独翻译成 servlet 文件,然后在执行到时候再调用翻译的 servlet 程序。并把计算的结果返回。
* 动态包含是在执行的时候,才会加载。所以叫动态包含。
3. 页面转发--常用
* <jsp:forward page=""></jsp:forward>
* <jsp:forward 转发功能相当于request.getRequestDispatcher("/xxxx.jsp").forward(request, response); 的功能
4. 区别:见下面
5. 在这里需要补充说明一点:我们在工作中,几乎都是使用静态包含。理由很简单。因为 jsp 页面虽然可以写 java 代码,做其他的功能操作。但是由于 jsp 在开发过程中被定位为专门用来展示页面的技术。也就是说。jsp 页面中,基本上只有 html,css,js。还有一些简单的 EL,表达式脚本等输出语句。所以我们都使用静态包含。
| 静态包含和动态包含区别 | 静态包含 | 动态包含 |
|---|---|---|
| 是否生成java文件 | 不生成 | 生成 |
| service方法中的区别 | 把包含的内容原封拷贝到service中 | JspRuntimeLibray.include方法 |
| 是否可以传递参数 | 不能 | 能 |
| 编译次数 | 1 | 包含的文件+1 |
| 适用范围 | 适用包含纯静态内容(CSS,HTML,JS),或没有非常耗时操作。或大量 java 代码的 jsp | 包含需要传递参数。含有大量 java |
Listener 监听器
* 什么是监听器?监听器就是实时监视一些事物状态的程序,我们称为监听器。
* 就好像朝阳群众?朝阳区只要有哪个明星有什么不好的事,他们都会知道,然后举报。
* 那么朝阳群众就是监听器,明星就是被监视的事物,举报就是响应的内容。
* 又或者说是,电动车的报警器。当报警器锁上的时候。我们去碰电动车,电动车就会报警。
* 报警器,就是监听器,电动车就是被监视的对象。报警就是响应的内容。
* 适用步骤
1. 第一步: 定义一个类,然后去继承生命周器的监听接口
2. 第二步: 在web.xml文件中去配置
3. ServletContextListener 监听器,一定要在 web.xml 文件中配置之后才会生效
4. <listener>
<listener-class>全类名</listener-class>
</listener>
5. 声明周期监听的两个方法
1. public void contextInitialized(ServletContextEvent sce) 是ServletContext 对象的创建回调
2. public void contextDestroyed(ServletContextEvent sce) 是 ServletContext 对象的销毁回调
* 演示:我们以 ServletContext 的监听器为例演示如下:
1. 创建一个 ServletContextListenerImpl 类实现 ServletContextListener 接口。
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServletContextListenerImpl implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 对象被创建了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext 对象被销毁了");
}
}
2. 在 web.xml 文件中的配置如下:
<listener>
<listener-class>com.atguigu.listener.RequestListener</listener-class>
</listener>
3. 3)这个时候,启动 web 工程和正常停止 web 工程,后台都会打印: