《jsp》

本文详细介绍了JSP的基本概念、作用、本质,包括JSP的page指令、脚本元素、注释、内置对象和域对象,以及jsp输出、标签、请求转发和Listener监听器的使用。通过实例解析了JSP的实战应用,如九九乘法口诀表和学生信息表格的展示,以及ServletContextListener监听器的配置和使用。
摘要由CSDN通过智能技术生成

 什么是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" %>

  1. language 属性:表示jsp翻译过后是什么语言文件,暂时只支持java
  2. contentType 属性:表示jsp返回的数据类型是什么,也是源码中 response.setContentType()参数值
  3. pageEncoding 属性:表示jsp页面文件本身的字符集
  4. import 属性:跟java源代码一样用于导包,导类

    以下两个属性是给out输出流使用的
  5. autoFlush 属性:设置out输出流缓冲区满了之后,是否自动刷新,默认是true
  6. buffer 属性:设置out缓冲区的大小,默认是8kb
  7. errorPage 属性:设置当jsp页面运行时出错,自动跳转的错误页面路径
  8. isErrorPage 属性:设置当前jsp页面是否为错误信息页面,默认是false 如果是true可以获取异常信息
  9. session 属性:设置访问当前jsp页面,是否会创建 HttpSession 对象,默认是true
  10. 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监听器?

  1. Listener 监听器他是javaWeb的三大组件之一,JavaWeb的三大组件为:Servlet程序、Filter过滤器、Listener监听器。
  2. Listener监听器是javaEE的规范,就是接口
  3. 监听器的作用是:监听某种事物的变化,然后通过回调函数反馈给用户(程序)去做一些相应的处理

ServletContextListener监听器

  1. ServletContextListener 它可以监听 ServletContext 对象的创建和销毁
  2. ServletContext 对象在web工程启动的时候创建,在web工程停止的时候销毁
  3. 监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈
  4. 两个方法分别是:
    //
    // 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 对象

使用步骤如下:

  1. 编写一个类去实现 ServletContextListener 
  2. 实现两个回调方法
  3. 到  web.xml 中去配置监听器 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值