• 【JavaWeb】jsp


    ⭐️ 一.jsp概念及其作用

    1.概念:jsp的全称是java server pages,java的服务器界面.
    2.作用: 代替servlet程序回传html页面的数据.
    因为servlet程序回传html页面的数据是一件非常繁琐的事情,开发成本和维护成本都极高.

    • 用servlet程序回传数据
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //通过响应的输出回传html页面数据
            resp.setContentType("text/html;charset=UTF-8");
            PrintWriter writer = resp.getWriter();
            writer.write("");
            writer.write("\r\n");
            writer.write("\r\n");
            writer.write("\r\n");
            writer.write("Title\r\n");
            writer.write("\r\n");
            writer.write("\r\n");
            writer.write(" 这是html页面数据\r\n");
            writer.write("\r\n");
            writer.write("\r\n");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 用jsp回传数据
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    a.jsp页面
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    ⭐️ 二.jsp的本质

    本质:是一个servlet程序

    当我们第一次访问jsp页面的时候,Tomcat服务器会帮我们把jsp页面翻译成为一个java源文件,并对它进行编译成为.class字节码程序

    在这里插入图片描述

    我们打开java源文件发现里面的内容为:

    在这里插入图片描述
    我们跟踪源代码发现,HttpJspBase类直接的继承了HttpServlet类.
    也就是说,jsp翻译出来java类,间接的继承了HttpServlet类,也就是说翻译出来的是一个sevlet程序.
    我们通过对翻译出来的Servlet程序的观察发现,其底层实现也是通过输出流,把html页面的数据回传给客户端.

    ⭐️三.jsp的三种语法

    1.jsp头部的page指令
    jsp的page指令可以修改jsp页面中一些重要的属性或者行为.
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    language属性 表示jsp翻译后是什么语言文件,暂时只支持ava.
    contentType属性 表示jsp返回的数据类型是什么.也是源码中response.setContentType参数值
    pageEncoding属性 表示当前jsp页面文件本身的字符集
    import属性 跟java源代码一样,用于导包导类.
    autoFlush属性 设置当out输出流缓冲区满了之后,是否自动刷新缓冲区,默认值是true
    buffer属性 设置out缓冲区的大小,默认是8kb.
    errorPage属性 设置当jsp页面运行出错时,自动跳转到错误页面的路径.
    isErrorPage属性 设置当前jsp页面是否是错误页面,默认是false.
    session属性 设置访问当前jsp页面,是否会创建HttpSession对象,默认是true.
    extends属性 设置jsp翻译出来的java类默认继承谁.
    注意:autoFlush属性和buffer属性是给out输出流使用.

    2.jsp中的常用脚本
    (1).声明脚本(极少用)
    格式:<%! 声明java代码 %>
    作用:可以给jsp翻译出来的java类定义属性方法甚至是静态代码块,内部类等.

    <body>
    //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");
          }
      %>
      //3.声明类方法
    <%!
        public int abc(){
            return 12;
        }
    %>
    //4.声明内部类
    <%!
        public static class A{
            private Integer id = 12;
            private String abc = "abc";
        }
    %>
    </body>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    (2).表达式脚本(常用)
    格式:<%=表达式%>
    作用:在jsp页面上输出数据.
    特点:
    第一点:所有的表达式脚本,都会被翻译到_jspService方法中.
    第二点:表达式脚本都会被翻译成为out.print()输出到页面上.
    第三点:由于表达式脚本翻译的内容都在_jspService方法中,所以_jspService方法中的对象都可以直接使用.
    第四点:表达式脚本中的表达式不能以分号结束.

    <%--1.输出整形--%>
    <%--2.输出浮点型--%>
    <%--3.输出字符串--%>
    <%--4.输出对象--%>
    <%--5.获得请求参数--%>
    <%=12 %> </br>
    <%=12.12 %> </br>
    <%="我是字符串" %> </br>
    <%=map %> </br>
    <%=request.getParameter("username")%>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (3).代码脚本
    格式:<% java语句 %>
    作用:可以在jsp页面中,编写我们自己需要的功能(写的是java语句)
    特点:
    第一点:代码脚本翻译后都在_jspService方法中.
    第二点:代码脚本由于翻译到_jspService方法中,所以在_jspService方法中的现有对象都可以直接使用.
    第三点:还可以由多个代码脚本块组合完成一个完整的java语句.
    第四点:``代码脚本可以和表达式脚本一起组合使用,在jsp页面上输出数据.

    <%--1.if语句--%>
    <%--2.for语句--%>
    <%--3.翻译后_jspService方法内的代码都可以写--%>
    <%
        int i = 12;
        if(i == 12){
    %>
         <h1>你好</h1>
    <%
        }
    %>
    <table border="1" cellspacing="0">
    <%
        for(int j = 0;j < 3;j++){
    %>
        <tr>
            <td><%=j + 1%></td>
        </tr>
    <%
        }
    %>
    <%
        String username = request.getParameter("username");
        System.out.println("用户名的请求参数值是:" + username);
    %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    3.jsp中的三种注释
    (1).html 注释
    在这里插入图片描述html注释会被翻译到java源代码中,在_jspService方法中,以out.writer输出到客户端.

    (2).java注释
    在这里插入图片描述
    java注释会被翻译到java源代码中.

    (3).jsp注释
    在这里插入图片描述
    jsp注释可以注掉jsp页面中所有代码.

    ⭐️四.jsp的九大内置对象

    在这里插入图片描述

    ⭐️五.jsp四大域对象

    四个与域对象分别是:
    pageContext (PageContextimpl类) 当前jsp页面范围内有效.
    request (HttpServletRequest类) 一次请求内有效.
    session (HttpSession类) 一个会话范围内有效,(打开浏览器访问服务器,直到关闭浏览器).
    application (ServletContext类) 整个web工程范围内有效(只要web工程不停止,数据都在).

    注意:
    域对象可以像Map一样是存取数据的对象,四个域对象功能一样,但对数据的存取范围不同.
    使用上的优先顺序: pageContext—request—session—application

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h1>scope.jsp页面</h1>
    <%
        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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ⭐️六.jsp中的out输出和response.getWriter输出的区别

    response中表示响应,经常用于设置返回给客户端的内容(输出).
    out也是给用户做输出使用的.
    在这里插入图片描述

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
            <%
                out.write("输出
    "
    ); out.flush(); response.getWriter().write("输出r
    "
    ); %> </body> </html>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注意:
    (1).由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下,我们在jsp页面中统一使用out来进行输出,避免打乱页面输出内容的顺序.
    (2).
    out.write() 输出字符串没有问题
    out.print() 输出任何数据都没有问题.(统一使用)

    ⭐️七.jsp的常用标签

    1.jsp静态包含

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    头部信息<br>
    主体内容<br>
    <%--
              <%@ include file="" %> 就是静态包含
              file 属性指定你要包含的jsp页面的路径
              地址中第一个斜杠 / 表示为http://ip:port/工程路径/ 映射到代码的web目录
              静态包含的特点:
              1.静态包含不会翻译被包含的jsp页面
              2.静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出.
    --%>
    <%@ include file="/include/footer.jsp"%>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    页脚信息<br>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    2.jsp动态包含

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    头部信息<br>
    主体内容<br>
    <%--
           <jsp:include page=""></jsp:include> 动态包含
           page 属性是指你要包含的jsp页面的路径
           动态包含和静态包含一样,把被包含的内容执行输出到包含位置
           动态包含的特点:
           1.动态包含会把被包含的jsp页面也翻译成java代码
           2.动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出.
           JsRuntimeLibrary.include(request,response,"/include/footer.jsp",out,false);
           3.动态包含还可以传递参数
    --%>
    <jsp:include page="/include/footer.jsp">
       <jsp:param name="username" value="root"/>
        <jsp:param name="password" value="root1"/>
    </jsp:include>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    页脚信息<br>
    <%=request.getParameter("password")%>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    3.jsp标签-转发
    <%
    // request.getRequestDispatcher(“/scope2.jsp”).forward(request,response);
    %>
    <%- - 就是请求转发标签 功能就是请求转发
    page 属性设置请求转发的路径
    –%>

    请求转发的使用说明:
    在这里插入图片描述

    ⭐️八.Listener监听器

    • Listener监听器是JavaWeb的三大组件之一
    • JavaWeb三大组件:Servlet程序Filter过滤器Listener监听器
    • Listener是JavaEE的规范(接口)
    • 监听器的作用:监听某种事物的变化,通过回调函数,反馈给客户(程序)去做一些相应的处理.

    1.ServletContextListener监听器

    • ServletContextListener可以监听ServletContext对象的创建和销毁.
    • ServletContext对象在web工程启动的时候创建,在web工程停止的时候销毁.
    • 监听到创建销毁之后都会分别调用ServletContextListener监听器的方法反馈.
    • 两个方法分别是:
    • contextInitialized(ServletContextEvent sce)
    • contextDestroyed(ServletContextEvent sce)

    ServletContextListener监听器监听ServletContext对象的步骤
    1.编写一个类去实现ServletContextListener
    2.实现其两个回调方法
    3.到web.xml中配置监听器

    public class Listener implements ServletContextListener {
        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            System.out.println("ServletContext对象被创建了");
        }
        @Override
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
            System.out.println("ServletContext对象被销毁了");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
     <listener>
        <listener-class>com.servlet.listener.Listener</listener-class>
        </listener>
    
    • 1
    • 2
    • 3
  • 相关阅读:
    【网络】tcpdump、Wireshark 案例超详细介绍
    【OpenCV】使用OpenCV调用手机摄像头
    (附源码)ssm教师工作量核算统计系统 毕业设计 162307
    2049. 统计最高分的节点数目-数组树构造+遍历求解最大值数目
    计算机毕业设计Java高校共享单车管理系统(源码+系统+mysql数据库+lw文档)
    【GNN】2022 G-Mixup: Graph Data Augmentation for Graph Classification
    基于TNEWS‘ 今日头条中文新闻(短文本)分类
    金仓数据库 KingbaseGIS 使用手册(11. KGIS函数列表)
    细节决定成败,Qlik数据洞察如何助力SEB化身“鹰眼”?
    R语言绘制热图
  • 原文地址:https://blog.csdn.net/qq_53798578/article/details/127715384