• 10、JavaWeb启程——JSP


    1、JSP概述

    【简介】: JSP的全名为Java Server Page,是运行在服务端的Java页面,以前学习的HTML是运行在浏览器端。JSP是运行在服务器上,最终还是解析成静态的HTML,运行在浏览器。我们在浏览器上看到的HTML页面,其实就是JSP在服务器上运行的结果。

    1、JSP优势

    技术特点
    HTML静态页面 :优点:方便美化页面操作,写js和css代码比较方便 缺点:不能写动态内容
    Server运行在服务器上的小程序,优点:制作动态内容,缺点:不方便HTML以及css和js代码的书写
    JSPJSP=html+servlet 特点:既有HTML的优点,方便美化页面又有servlet的优点:可以在页面中书写Java代码,可以制作动态页面

    2、JSP执行过程

    【图示】:
    在这里插入图片描述
    【流程概述】:

    • 1、浏览器请求jsp页面,Tomcat中的JspServlet会先将jsp文件翻译为Servlet文件xxx_jsp.java
    • 2、将翻译的文件 xxx_jsp.java编译为字节码文件xxx_jsp.class
    • 3、加载字节码文件xxx_jsp.class并创建xxx_jsp对象
    • 4、调用xxx_jsp的service()方法处理请求并响应数据

    3、JSP基本语法

    1、JSP的注释

    JSP注释说明
    <%-- 注释内容–%>这里的注释不会翻译到servlet中,在翻译到java文件的时候会忽略注释中的内容,所以最终我们在页面源码中是看不到注释内容的

    2、JSP脚本片段

    JSP脚本片段说明
    语法<%java代码;%>
    作用在jsp的页面上执行一段Java代码,必须符合Java语法规则,每行代码以分号结束;可以在脚本片段中使用Java的语法;代码会被翻译到service方法中

    3、JSP脚本表达式

    JSP脚本表达式说明
    语法<%= 变量名或表达式%> 翻译成 Servlet 变成 out.print() 打印输出 注意:后面没有分号
    作用直接输出变量的值或对表达式进行计算
    • 代码演示
    JSP脚本表达式:
    <%
    String name = "孙悟空";
    %>
    <%=name%> <br>
    <%=3*4%> <br>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4、JSP的声明

    JSP声明说明
    语法<%! 全局变量或方法 %>
    作用用于在JSP页面上声明全局变量或方法 注:很少在页面上声明方法
    • 代码演示
    <h2>JSP声明</h2>
    <%--JSP脚本片段--%>
    <%
    String name = "jack";
    %>
    <%--JSP声明--%>
    <%!
    String name="rose";
    %>
    <%=name%><br>
    <%=this.name%><br>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4、JSP转发和重定向

    1、转发和重定向的作用

    • 用于web组件的跳转,从A组件跳转到另一个组件

    2、转发概述

    1、跳转位置

    • 发生在服务器端进行资源的跳转

    2、转发原理

    在这里插入图片描述

    3、转发的方法

    • request.getRequestDispatcher(“/要跳转到的地址”).forward(request, response)

    4、代码演示

    • OneServlet
    package cn.simplelife.work._01forward;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * @ClassName OneServlet
     * @Description
     * @Author simplelife
     * @Date 2022/10/25 9:43
     * @Version 1.0
     */
    
    @WebServlet(value = "/forward/oneServlet")
    public class OneServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
            String username = req.getParameter("username");
            System.out.println("one——begin——username = " + username);
            System.out.println("---------------------------------------");
            // 跳转到forward/twoServlet做响应打印用户名
            req.getRequestDispatcher("/forward/twoServlet").forward(req, resp);
            System.out.println("第一个跳转后servlet执行");
            // 第一个servlet做响应 此时的响应不会做出响应
    //        PrintWriter writer = resp.getWriter();
    //        writer.println("第一个servlet结束");
        }
    }
    
    
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • TwoServlet
    package cn.simplelife.work._01forward;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * @ClassName OneServlet
     * @Description
     * @Author simplelife
     * @Date 2022/10/25 9:43
     * @Version 1.0
     */
    
    @WebServlet(value = "/forward/twoServlet")
    public class TwoServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 设置响应格式
            resp.setContentType("text/html;charset=utf-8");
            // 获取/forward/oneServlet携带的用户名信息
            String username = req.getParameter("username");
            System.out.println("two——获取——one的username = " + username);
            // 获取输出流对象
            PrintWriter writer = resp.getWriter();
            // 响应给浏览器
            writer.println("第二个servlet响应的数据:" + 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    3、重定向概述

    1、跳转位置

    • 在浏览器端进行页面跳转

    2、重定向原理

    在这里插入图片描述

    3、重定向方法

    • response.sendRedirect(“要跳转的地址”)

    4、代码演示

    • OneServlet
    package cn.simplelife.work._02redirect;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * @ClassName OneServlet
     * @Description
     * @Author simplelife
     * @Date 2022/10/25 9:43
     * @Version 1.0
     */
    
    @WebServlet(value = "/redirect/oneServlet")
    public class OneServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
    
            String username = req.getParameter("username");
            System.out.println("one——begin——username = " + username);
            System.out.println("---------------------------------------");
            // 跳转到forward/twoServlet做响应打印用户名
            resp.sendRedirect("/redirect/twoServlet");
            System.out.println("第一个跳转后servlet执行");
            // 转发可以访问到WEB-INF下的资源文件 重定向不能访问
            // 因为重定向是在浏览器端重新发起请求,转发是在服务器端进行
            // 重定向可以进行跨域访问,地址栏会发生变化
            // 转发不可以进行跨域访问,因为是在本服务器内进行转发,地址栏不会发生变化,只发生一次请求
    //        req.getRequestDispatcher("/WEB-INF/hello.jsp").forward(req, resp);
            // 第一个servlet做响应 此时的响应不会做出响应
    //        PrintWriter writer = resp.getWriter();
    //        writer.println("第一个servlet结束");
        }
    }
    
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • TwoServlet
    package cn.simplelife.work._01forward;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * @ClassName OneServlet
     * @Description
     * @Author simplelife
     * @Date 2022/10/25 9:43
     * @Version 1.0
     */
    
    @WebServlet(value = "/forward/twoServlet")
    public class TwoServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 设置响应格式
            resp.setContentType("text/html;charset=utf-8");
            // 获取/forward/oneServlet携带的用户名信息
            String username = req.getParameter("username");
            System.out.println("two——获取——one的username = " + username);
            // 获取输出流对象
            PrintWriter writer = resp.getWriter();
            // 响应给浏览器
            writer.println("第二个servlet响应的数据:" + 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    4、转发和重定向的区别

    区别转发重定向
    目录服务器的根目录浏览器的根目录
    地址栏地址栏不发生变化地址栏发生变化
    跳转位置在服务器端跳转在浏览器端跳转
    请求对象请求数据不会丢失,因为是同一个请求请求数据有可能丢失,因为不是同一个请求
    WEB-INF下的资源可以跳转到不可以跳转到
    跨域问题请求转发不可以跳转到其他域名或项目下的资源可以进行跨域访问

    5、转发和重定向的选择

    • 如果需要保留请求域中的数据就使用转发
    • 如果想访问WEB-INF下的资源就使用转发
    • 要跳转到其他域使用重定向

    6、请求和转发之后的代码会不会执行

    • 无论是请求转发还是重定向,后续代码都会执行,但是一般情况下转发和重定向之后不会再有代码,因为没有实际意义了。

    5、三大作用域

    1、什么是作用域

    • 用于Servlet之间数据的共享的服务器内存区域,作用域结构是一个Map

    2、作用域的类型

    作用域类型作用域范围
    请求域HttpServletRequest只在同一次请求中起作用
    会话域HttpSession同一个会话中起作用,第一次访问到浏览器关闭的整个过程
    上下文作用域ServletContext同一个应用中起作用,服务器启动知道服务器关闭的整个过程都起作用

    3、作用域方法

    与作用域有关的方法作用
    Object getAttribute(“键”)从中得到一个值
    void setAttribute(“键”,Object数据)向作用域中存储键值对数据
    void removeAttribute(“键”)删除作用域中的键值对数据

    4、作用域的选择

    • 先考虑作用范围小的作用域,如果小作用范围的作用域能满足需求就使用小作用范围的作用域。
    • 考虑顺序:请求域–>会话域–>上下文域
  • 相关阅读:
    React 学习笔记 2022-08
    Unity Hub添加模块问题
    代碼隨想錄算法訓練營|第六十二天|84.柱状图中最大的矩形。刷题心得(c++)
    PHP Warning: Module ‘curl‘ already loaded in Unknown on line 0
    文字识别的
    Vue3学习:如何在Vue3项目中创建一个axios实例
    Kubernetes学习笔记-一
    whisperspeech 英文TTS的实现
    Redis系列-Redis性能优化与安全【9】
    springBoot源码之servlet与reactive
  • 原文地址:https://blog.csdn.net/m0_37911124/article/details/127700982