什么是jsp
jsp是服务器页面,主要是代替Servlet程序回传html页面的数据
jsp的本质
jsp本质上是一个Servlet程序
当我们第一次访问jsp页面的时候,Tomcat服务器会把jsp页面翻译成为一个java源文件,并且将它编译成一个.class字节码程序。
HttpJspBase 类。它直接地继承了 HttpServlet 类。也就是说。jsp 翻译出来的 java 类,它间接了继
承了 HttpServlet 类。也就是说,翻译出来的是一个 Servlet 程序,大部分代码由输出流完成
jsp的三种语法
jsp头部的page命令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
属性 | 作用 |
---|---|
language 属性 | 表示 jsp 翻译后是什么语言文件。暂时只支持 java。 |
contentType 属性 | 表示 jsp 返回的数据类型是什么。也是源码中 response.setContentType()参数值 |
pageEncoding 属性 | 表示当前 jsp 页面文件本身的字符集。 |
import 属性 | 跟 java 源代码中一样。用于导包,导类。 |
autoFlush 属性 | 设置当 out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是 true。 |
buffer 属性 | 设置 out 缓冲区的大小。默认是 8kb |
errorPage 属性 | 表示错误后自动跳转的路径 |
isErrorPage属性 | 设置当前jsp页面是否是错误信息页面,默认是false,如果是true,可以获取异常信息。 |
session 属性 | 设置访问当前jsp对象,是否会创建HttpSession对象,默认是true |
extends属性 | 设置jsp翻译出来的java类默认继承谁 |
jsp中的常用脚本
声明脚本(极少使用)
<%! 声明 java 代码 %>
作用:可以给 jsp 翻译出来的 java 类定义属性和方法甚至是静态代码块。内部类等。
表达式脚本(常用)
<%= 代码 %>
作用:在jsp页面上输出数据
特点:
- 所有的表达式脚本都会翻译到_jspService方法中
- 表达式脚本都会被翻译成out.print()输出到页面上
- 由于表达式脚本翻译的内容都在_jspService()方法中,所以_jspService()方法中的对象都可以直接使用。
- 表达式脚本不能以分号结束
代码脚本
<% java语句 %>
代码脚本的作用是:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)。
特点:
- 代码脚本也会翻译到_jspService()方法中
- 代码脚本由于翻译到_jspService()方法中,所以_jspService()方法中的对象都可以直接使用
- 还可以由多个代码脚本块组合完成一个完整的java语句
- 代码脚本可以和表达式脚本一起组合使用
jsp中的三种注释
html注释
<!-- html注释 -->
html注释会被翻译到java源代码中,在_jspService()方法中,以out.writter输出到客户端。
java注释
//单行注释
/* 多行注释*/
java注释也会被翻译到源代码中
jsp注释
<%-- jsp注释 --%>
jsp注释可以注掉jsp页面中所有代码
jsp九大内置对象
jsp中的内置对象,是指Tomcat在翻译jsp页面成为Servlet源代码后,内部提供的九大对象。
jsp四大域对象
对象 | 类型 | 作用范围 |
---|---|---|
pageContext | (PageContextImpl类) | 当前jsp页面范围内有效 |
request | (HttpServlet类) | 一个请求内有效 |
session | (HttpSession类) | 一个会话范围有效(打开浏览器访问服务器,直到关闭) |
application | (ServletContext类) | 整个web工程范围内都有效(只要web工程不停止,数据都在) |
域对象是可以像Map一样存取数据的对象,四个域对象功能一样,不同的是它们对数据的存取范围
从小到大的优先顺序:
pageContext===>>>request===>>>session===>>>application
jsp中的out输出和response.getWritter()输出的区别
由于 jsp 翻译之后,底层源代码都是使用 out 来进行输出,所以一般情况下。我们在 jsp 页面中统一使用 out 来进行输出。避免打乱页面输出内容的顺序。
jsp中的常用标签
jsp静态包含
<%--
<%@ include file=""%> 就是静态包含
file 属性指定你要包含的 jsp 页面的路径
地址中第一个斜杠 / 表示为 http://ip:port/工程路径/映射到代码的 web 目录
--%>
<%@ include file = "/include/footer.jsp">
静态包含的特点:
1 、静态包含不会翻译被包含的 jsp 页面。
2 、静态包含其实是把被包含的 jsp 页面的代码拷贝到包含的位置执行输出。
jsp动态包含
动态包含原理:
1 、动态包含会把包含的 jsp 页面也翻译成为 java 代码
2 、动态包含底层代码使用如下代码去调用被包含的 jsp 页面执行输出。
JspRuntimeLibrary.include(request, response, “/include/footer.jsp”, out, false);
3 、动态包含,还可以传递参数
<jsp:include page="footer.jsp">
<jsp:param name="password" value="123456"/>
</jsp:include>
jsp标签-转发
<%--请求转发标签--%>
<jsp:forward page="footer.jsp"></jsp:forward>
请求转发练习
SearchStudentServlet.java
package com.indi.servet;
import com.indi.pojo.Student;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class SearchStudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数
//发sql语句查询学生信息
//使用for循环生成查询生成到的数据做模拟
List<Student> studentList = new ArrayList<Student>();
for (int i = 0; i < 10; i++) {
int t = i + 1;
studentList.add(new Student(t, "name" + t, 18 + t, "phone" + t));
}
//保存查询到的结果到request域中
req.setAttribute("stuList",studentList);
//请求转发到showStudent.jsp页面
req.getRequestDispatcher("/test/showStudent.jsp").forward(req,resp);
}
}
showStudent.jsp
<%@ page import="com.indi.pojo.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: New
Date: 2020/3/27
Time: 11:17
To change this template use File | Settings | File Templates.
展示10条学生数据
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<style>
table{
border: 1px solid black;
width: 600px;
border-collapse: collapse;
}
td{
border: 1px solid black;
}
</style>
<body>
<%
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><button>删除</button> <button>修改</button></td>
</tr>
<% } %>
</table>
</body>
</html>
Student.java
package com.indi.pojo;
public class Student {
private Integer id;
private String name;
private Integer age;
private String phone;
//省略get、set等等
}
Listener监听器
Listener是JavaEE的规范,就是接口
主要作用是监听某种事物的变化,通过回调函数,反馈给客户(程序)做一些处理。
ServletContextListener
-
ServletContextListener可以监听ServletContext对象的创建和销毁
-
ServletContext对象在web工程启动的时候创建,在web工程停止的时候销毁
-
监听到创建和销毁之后都会分别调用到ServletContextListener监听器的方法反馈
分别是以下两个方法
public interface ServletContextListener extends EventListener {
/**
* 在ServletContext创建之后马上调用
*/
void contextInitialized(ServletContextEvent var1);
/**
* 在ServletContext销毁之后马上调用
*/
void contextDestroyed(ServletContextEvent var1);
}
监听器实现类:
package com.indi.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListenerImpl implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象创建了");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象销毁了");
}
}
web.xml 中的配置:
<listener>
<listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
</listener>