美文网首页
[java]28、JSP

[java]28、JSP

作者: 史记_d5da | 来源:发表于2022-03-13 17:16 被阅读0次

    1、概述

    JSPJavaServer Pages 的简称, 是一种动态网页技术标准

    1.1、JSP 的基本使用

    指令
    <%@ page %>:配置当前页面信息
    <%@ include %>:包含其他页面
    <%@ taglib %>:导入标签库
    输出
    <%= 需要输出的内容 %> (代码最终都运行在 _jspService 方法中)

    <h1><%=age%>></h1> // 输出年龄
    

    等价于 out.print (需要输出的内容)
    嵌入 java 代码
    <% Java代码 %> (代码最终都运行在 _jspService 方法中)

    <%
        for (int i = 0; i < 10; i++) {
    %>
        <h1>我是好学生</h1>
    <%
        }
    %>
    

    注释
    <%-- 注释内容 --%>
    HTMLCSSJS 注释照常使用
    声明
    <%! 声明成员变量、方法 %>

    <%!
        private int age = 10;
        public void test() {
            System.out.println("123");
        }
    %>
    

    JSP 的本质是 Servlet
    1、查看Tomcat 启动日志,查看CATALINA_BASE

    CATALINA_BASE
    打开对应的文件路径可以看到test.jsp 最终转换为 test_jsp.java 文件
    test_jsp.java
    2、打开 test_jsp 文件, test_jsp 的继承关系:
    test_jsp => org.apache.jasper.runtime.HttpJspBase => jakarta.servlet.http.HttpServlet
    _jspService
    3、所有 test.jsp 的请求都会调用 _jspService 方法

    2、Servlet + JSP

    2.1、Servlet + JSP的请求过程
    Servlet + JSP
    2.2、taglibs 配置

    1、Servlet + JSP的相结合,需要使用到 ApacheTaglibs
    如果使用其核心标签库,只需要下载2个jar包即可
    jakarta.servlet.jsp.jstl-2.0.0.jarjakarta.servlet.jsp.jstl-api-2.0.0.jar
    2、将 jar 包加入到WEV-INF/lib 中,并且右击选择 Add as Library

    Add as Library
    或者在 Manven 中添加依赖
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jakarta.servlet.jsp.jstl</artifactId>
        <version>2.0.0</version>
    </dependency>
    

    3、使用 taglib指令导入 JSTL 核心标签库
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    2.2、EL 表达式、JSTL 标签库

    1、ELExpression Language的简称
    ${obj.property}${obj["property"]}${obj[propertyVar]}
    emptynot empty
    2、JSTLJSP Standard Tag Library 的简称,译为“JSP标准标签库”,由 ApacheJakarta 小组维护
    3、EL 表达式、 JSTL标签库都可以简化JSP代码
    4、常用标签
    <c:if test="条件">
    <c:forEach items="集合" var="元素" varStatus="循环相关的信息">

    <c:choose><c:when test="条件"><c:otherwise>

    2.3、转发(forward)

    RequestDispatcher 进行数据转发代码

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          request.setAttribute("customers", getCustomers());
          // 转发到list.jsp页面进行数据展示
          RequestDispatcher dispatcher = request.getRequestDispatcher("/page/list.jsp");
          dispatcher.forward(request, response);
    }
    
    数据转发链条

    1、转发只能在同一个Context中进行请求转发
    2、在同一次请求中,可以转发多次,形成一个转发链条

    • 可以通过request.setAttributerequest.getAttribute来共享数据
    • 每次转发都会创建一个新的request对象,用成员变量request指向前一个request对象
      转发链
      转发链

    3、在转发链条上,所有的attribute都存储在头部的 Request对象中

    2.4、重定向

    1、重定向:服务器通知客户端重新发送请求到新的任意URL地址

    重定向
    重定向请求

    3、转发 VS 重定向

    转发代码:request.getRequestDispatcher("/page/list.jsp").forward(request, response);

    • 只能转发到同一个 Context下,路径中不用包含 ContextPath
    • 客户端只发送一次请求
    • 浏览器地址栏的 URL 不会发生变化
    • 转发的操作只由服务器完成

    重定向代码:response.sendRedirect("/crm2/list");

    • 可以重定向到任意 URL,如果从定向到同一个 Context 下,路径中需要包含 ContextPath
    • 客户端发了两次请求
    • 浏览器地址栏的 URL 会发生变化
    • 重定向的操作由服务器+客户端配合完成

    4、JSP的9大内置对象

    jsp的9大内置对象
    创建main.jsp运行tomcat
    <body>
    <%
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
        System.out.println(page);
        System.out.println(pageContext);
        System.out.println(out);
        System.out.println(config);
    %>
    // http://localhost:8080/test/main.jsp?name=sj
    <input type="text" value="${param.name}">
    </body>
    

    在控制台找到CATALINA_HOME目录/work/Catalina/localhost/test/test项目中找到main_jsp.java文件。

    // 用于共享数据,仅限于当前页面
    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;
    

    4个域对象:pageContextrequestsessionapplication
    共享范围从左至右,逐渐增大
    利用EL表达式从JSP域对象中获取数据
    EL表达式可以通过param,直接获取参数

    jsp对象

    相关文章

      网友评论

          本文标题:[java]28、JSP

          本文链接:https://www.haomeiwen.com/subject/osdldrtx.html