什么是jsp,它有什么作用?
- jsp的全称是java servlet pages 。java的服务器页面。
- jsp的主要作用是代替servlet程序回传html页面。
- 因为Servlet程序回传 html 页面数据是一件非常繁琐的事情,开发成本和维护成本都极高。如下:
- 然而使用jsp之后就很轻松就能实现以下html数据的回传,jsp文件和html文件一样都是放在webapp下
package com.atguigu.servlet;
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.io.PrintWriter;
public class PringHtml extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write(" <!DOCTYPE html>\r\n");
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的本质是什么?
jsp页面本质上是一个servlet程序,当我们第一次访问jsp页面的时候,Tomcat服务器会帮我们把jsp文件页面翻译成一个java源文件,并且对它进行编译成一个字节码程序。如下就是源文件的内容
我们跟踪源代码发现,HttpJspBase 类。它直接的继承了 HttpServlet 类。也就是说, jsp 翻译出来的 java 类,它间接的继承了 HttpServlet 类,也就是说翻译出来的是一个 Servlet 程序。
jsp底层的实现也是通过输出流,把html页面数据回传个客户端。
jsp头部的page指令
//jsp的page指令可以修改jsp页面的一些重要的属性或者行为
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- language 属性:表示jsp翻译过后是什么语言文件,暂时只支持java
- contentType 属性:表示jsp返回的数据类型是什么,也是源码中 response.setContentType()参数值
- pageEncoding 属性:表示jsp页面文件本身的字符集
- import 属性:跟java源代码一样用于导包,导类
以下两个属性是给out输出流使用的 - autoFlush 属性:设置out输出流缓冲区满了之后,是否自动刷新,默认是true
- buffer 属性:设置out缓冲区的大小,默认是8kb
- errorPage 属性:设置当jsp页面运行时出错,自动跳转的错误页面路径
- isErrorPage 属性:设置当前jsp页面是否为错误信息页面,默认是false 如果是true可以获取异常信息
- session 属性:设置访问当前jsp页面,是否会创建 HttpSession 对象,默认是true
- extends 属性:设置翻译出来的jsp类默认继承谁
jsp中的常用脚本
1、声明脚本
声明脚本的格式:
<%!声明java代码%>
作用:可以给翻译出来的java类定义属性和方法,甚至是静态代码块,内部类等。
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: x2773
Date: 2021/11/17
Time: 9:19
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这是 html 页面数据
<%--练习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");
map.put("key4","value4");
map.put("key5","value5");
}
%>
<%--练习3:
声明类的方法
--%>
<%!
public int abc(){
return 12;
}
%>
<%--练习4:
声明内部类
--%>
<%!
public static class A{
private int id = 12;
private String name = "zhangsan";
}
%>
</body>
</html>
2、表达式脚本
表达式脚本的格式:
<%=表达式%>
作用:给jsp页面上传输数据
<%--练习1:
输出整型数据
--%>
<%=12%>
<%--练习2:
输出浮点型数据
--%>
<%=12.12%>
<%--练习3:
输出字符串
--%>
<%="abcdefg"%>
<%--练习1:
输出对象
--%>
<%!
static {
map = new HashMap<String,Object>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
map.put("key4","value4");
map.put("key5","value5");
}
%>
<%=map%>
表达式脚本的特点:
3、代码脚本
代码脚本格式:
<% 代码脚本 %>
作用:可以在jsp页面中编写我们想要的需要的功能(下的是Java语句)
<%--练习1:
if语句
--%>
<%
int i = 12;
if(i == 12){
System.out.println("我爱我家");
}else {
System.out.println("我是中国人");
}
%>
<%--练习2:
for循环语句
--%>
<%
for (int j = 0;j<10;j++){
System.out.println(j);
}
%>
<%--练习3:
翻译后的Java文件中的_jspService方法内的代码都可以写,
--%>
<%
String username = request.getParameter("username");
System.out.println("用户名的请求参数值是:"+username);
%>
代码脚本的特点:
jsp中的三种注释
jsp九大内置对象
jsp四大域对象
pageContext.setAttribute()方法和out.setAttribute()方法得引入下面的包才有
jsp中的out输出和response.getWriter输出的区别
由于jsp翻译之后,底层源代码都是使用out.write()来进行输出,所以一般情况下,我们在jsp页面中统一使用out来进行输出,避免打乱页面输出的内容。
jsp的常用标签
1、jsp静态包含
2、jsp动态包含
动态包含的底层原理
3、jsp标签-请求转发
<%--
<jsp:forward page=""></jsp:forward>请求转发
和
<%
request.getRequestDispatcher("/scope.jsp").forward(request,response);
%>
一样效果
page指定要请求转发的jsp页面路径
--%>
<jsp:forward page="/scope.jsp"></jsp:forward>
jsp的两个练习题
练习一:在jsp页面输出九九乘法口诀表
<%--
Created by IntelliJ IDEA.
User: x2773
Date: 2021/11/18
Time: 9:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table>
<%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" %><%--
Created by IntelliJ IDEA.
User: x2773
Date: 2021/11/18
Time: 10:17
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
List<Student> students = new ArrayList<>();
for (int i = 0;i<10;i++){
int t = i+1;
students.add(new Student(t,"name"+t,18+t,"phone"+t));
}
%>
<table>
<%for (Student student : students) {%>
<tr>
<td><%student.getId();%></td>
<td><%student.getName();%></td>
<td><%student.getAge();%></td>
<td><%student.getPhone();%></td>
</tr>
<%}%>
</table>
</body>
</html>
jsp请求转发的使用说明
流程图
SeachStudentServlet类
package com.atguigu.servlet;
import com.atguigu.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 SeachStudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求的参数
// 发sql语句查询学生信息
// 使用for循环生成查询到的信息做模拟
List<Student> students = new ArrayList<>();
for (int i = 0;i<10;i++){
int t = i+1;
students.add(new Student(t,"name"+t,18+t,"phone"+t));
}
// 保存查询到的结果,到request域中
req.setAttribute("stu",students);
// 请求转发到jsp页面中
req.getRequestDispatcher("/test/showStudent.jsp").forward(req,resp);
}
}
showStudent.jsp
<%@ page import="com.atguigu.pojo.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: x2773
Date: 2021/11/18
Time: 10:56
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
List<Student> students = (List<Student>) request.getAttribute("stu");
%>
<table>
<%for (Student student : students) {%>
<tr>
<td><%student.getId();%></td>
<td><%student.getName();%></td>
<td><%student.getAge();%></td>
<td><%student.getPhone();%></td>
</tr>
<%}%>
</table>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>PringHtml</servlet-name>
<servlet-class>com.atguigu.servlet.PringHtml</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PringHtml</servlet-name>
<url-pattern>/pringHtml</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SeachStudentServlet</servlet-name>
<servlet-class>com.atguigu.servlet.SeachStudentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SeachStudentServlet</servlet-name>
<url-pattern>/seachStudentServlet</url-pattern>
</servlet-mapping>
</web-app>
结果
什么是Listener监听器?
- Listener 监听器他是javaWeb的三大组件之一,JavaWeb的三大组件为:Servlet程序、Filter过滤器、Listener监听器。
- Listener监听器是javaEE的规范,就是接口
- 监听器的作用是:监听某种事物的变化,然后通过回调函数反馈给用户(程序)去做一些相应的处理
ServletContextListener监听器
- ServletContextListener 它可以监听 ServletContext 对象的创建和销毁
- ServletContext 对象在web工程启动的时候创建,在web工程停止的时候销毁
- 监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈
- 两个方法分别是:
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package javax.servlet; import java.util.EventListener; public interface ServletContextListener extends EventListener { /** *ServletContext 对象创建之后马上调用,做初始化 */ public void contextInitialized(ServletContextEvent sce); /** *ServletContext 对象销毁之后调用 */ public void contextDestroyed(ServletContextEvent sce); }
如何使用 ServletContextListener 监听器监听 ServletContext 对象
使用步骤如下:
- 编写一个类去实现 ServletContextListener
- 实现两个回调方法
- 到 web.xml 中去配置监听器