• 【JavaWeb】之JSP



    前言

    本文为JavaWeb基础JSP相关知识详细介绍~,Java全栈学习路线可参考: 【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~

    一、什么是JSP

    • Java Server Pages:Java服务器端页面,也和Servlet一样,用于动态web技术!
    • JSP的主要作用是代替Servlet程序回传HTML页面的数据

    JSP的特点:

    • 写JSP就像在写HTML

    JSP与HTML的区别:

    • HTML只给用户提供静态的数据
    • JSP页面中可以嵌入JAVA代码,为用户提供动态数据

    二、JSP原理

    1.JSP原理简介

    • JSP是在服务器内部工作的
    • IDEA中使用Tomcat会在IDEA的Tomcat中产生一个work目录,在电脑中的地址:
    C:\Users\J\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\bd396c0d-06d6-4a53-b293-bb717de8947c\work\Catalina\localhost\ROOT\org\apache\jsp
    
    • 1
    • JSP页面本质上是一个Servlet程序,第一次访问JSP页面时(运行Tomcat服务器后在浏览器地址栏输入路径),Tomcat服务器会将此JSP页面翻译成为一个Java源文件,并对其进行编译成为.class字节码文件(一个.java,一个.class),如下图:
      在这里插入图片描述
      当打开.java文件时发现其中的内容如下图(继承了HttpJsBase类):
      在这里插入图片描述
    • 而HttpJspBase类直接继承于HttpServlet类,即JSP翻译出来的Java类间接继承于HttpServlet类,证明JSP页面是一个Servlet程序JSP页面实际上会转变成java程序。
    • 浏览器向服务器发送请求,不管访问什么资源,其实都在访问Servlet!JSP最终也会被转换成java类!
    • JSP本质上就是Servlet!包含以下方法:
    //初始化
      public void _jspInit() { 
      }
    //销毁
      public void _jspDestroy() {
      }
    //JSPService
      public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    2.一个JSP做了什么

    (1)判断请求

    (2)内置一些对象

    final javax.servlet.jsp.PageContext pageContext;    //页面上下文
    javax.servlet.http.HttpSession session = null;        //session
    final javax.servlet.ServletContext application;        //application
    final javax.servlet.ServletConfig config;            //config
    javax.servlet.jsp.JspWriter out = null;                //out
    final java.lang.Object page = this;                    //当前 page
    HttpServletRequest request                            //请求
    HttpServletResponse response                        //响应
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (3)输出页面前增加的代码

    response.setContentType("text/html");            //设置响应的页面类型
    pageContext = _jspxFactory.getPageContext(this, request, response,
                      null, true, 8192, true);
    _jspx_page_context = pageContext;                
    application = pageContext.getServletContext();
    config = pageContext.getServletConfig();
    session = pageContext.getSession();
    out = pageContext.getOut();
    _jspx_out = out;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (4)以上的这些对象可以在JSP页面中直接使用

    • 在JSP页面中只要是JAVA代码就会原封不动的输出
    • 如果是HTML代码,就会被转换为:
    out.write("\r\n"); // 以这样的格式,输出到前端
    
    • 1

    三、JSP基础语法

    1.JSP表达式

    <%--JSP表达式
    <%= 变量或者表达式%>
    作用:用来将程序的输出,输出到客户端
    --%>
    <%= new java.util.Date()%>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.JSP脚本片段

    <%--jsp脚本片段--%>
    <%
        int sum = 0;
        for (int i = 0; i <= 100; i++) {
            sum += i;
        }
        out.println("

    Sum=" +sum+ "

    " ); %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    脚本片段的再实现

    <%
        int x = 10;
        out.println(x);
    %>
    <p>这是一个JSP文档</p>
    <%
        int y = 20;
        out.println(y);
    %>
    <%--在代码中嵌入HTML元素--%>
    <%
        for (int i = 0; i < 5; i++) {
    %>
        <h1>Hello world <%=i%></h1>
    <%
        }
    %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3.JSP声明

    • JSP声明:在JSP中嵌入Java代码即可,会被编译到JSP生成Java的类中!非JSP声明的代码会被生成到_jspService方法中!
    <%!
        static{
            System.out.println("Loading Servelet!");
        }
        private int globalVar = 0;
        public void oi(){
            System.out.println("进入了方法oi");
        }
    %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • JSP的注释不会在客户端显示,HTML的注释会显示!
    <%片段%>
    <%=表达式%>
    <%!声明%>
    
    <%--JSP注释--%>
    <!--HTML注释-->
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    四、JSP指令

    1.page指令

    • page指令用来定义JSP文件中的全局属性,它描述了与页面相关的一些信息,其作用域被它所在的JSP页面和其包含的文件。页面指令一般位于JSP页面的顶端,但是可以放在JSP页面的任何位置,无论把<%@page%>指令放在JSP文件中的哪个地方,它的作用范围都是整个JSP页面。
      以定制错误页面为例使用JSP指令
    <%--定制错误页面--%>
    <%@ page errorPage="error/500.jsp" %>
    
    • 1
    • 2

    2.include指令

    • include指令用于在当前JSP页面中加载需要插入的文件代码,即为页面插入一个静态文件,如JSP页面、HTML页面、文本文件或一段Java程序,这些加载的代码和原有的JSP代码合并成一个新的JSP文件。
    <%--
    @include:会将两个页面合二为一
    --%>
    <%@include file="common/header.jsp"%>
    <hr>
    <h1>网页主体</h1>
    <hr>
    <%@include file="common/footer.jsp"%>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.taglib指令

    • taglib指令用来指定页面中使用的标签库以及自定义标签的前缀。taglib指令语法格式:
    <%@taglib uri="tagLibraryURI" prefix="tagPrefix" %>
    
    • 1
    • uri(统一资源标识符)属性用于指定标记库的存放位置,并告诉JSP引擎在编译JSP程序时如何处理指定标签库中的标签,无默认值。uri属性可以是在TLD(标记库描述符)文件或web.xml文件中定义的标记库的符号名,也可以是TLD文件或JAR文件的相对路径。
    • prefix属性用于指定标记库中所有动作元素名中使用的前缀,无默认值。

    五、9大内置对象

    • request:请求对象
    • response:响应对象
    • pageContext:JSP的上下文对象
    • session:会话对象
    • application:ServletContext对象
    • config:ServletConfig对象
    • out:JSP输出流对象
    • page:指向当前JSP的对象
    • exception:异常对象

    4大域对象

    • pageContext:客户端向服务器发送请求,产生的数据只在当前的页面中有效
    • request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的
    • session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车
    • application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据
    <%
    pageContext.setAttribute("name1","oi1号");//保存的数据只在一个页面中有效
    request.setAttribute("name2","oi2号");//保存的数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3","oi3号");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","oi4号");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
    %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    后记

    Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~

  • 相关阅读:
    22.11.20补卡 javaSE多线程学习笔记
    66 跳跃游戏
    深蓝激光slam理论与实践-第一节笔记
    Unity新的Input System
    电子电器架构 —— 车载网关边缘节点总线转换
    CF gym 103855 M 切比雪夫距离转换
    [附源码]计算机毕业设计springboot教学辅助系统
    HTML知识小结
    Java学习之方法重写/覆盖
    Maven与IDEA的联系与详解
  • 原文地址:https://blog.csdn.net/qq_42146402/article/details/127414279