• 74.【JavaWeb -02】


    (十二)、Cookie

    36.会话

    1.会话定义:
    会话打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器这个过程
    可以称之为会话。
    2.有状态会话:
    服务端Session先给小朋友A发了一个邀请函Cookie,这就证明小朋友A可以来参加
    Session聚会,并且有留存登入聚会的信息,曾经来过,就叫做有状态会话。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    37.保存会话的两种技术

    1.cookie:
    (1).客户端技术:(响应,请求)
    2.session:
    (1).服务器技术: 利用这个技术可以保存会话的用户信息,我们可以把信息或则数据
    放在session里面
    3.常见的应用:
    网站登入之后,下次就不用登入了,第二次直接登入
    4.一个网站cookie是否存在上限?
    (1).一个cookie只能保存一个信息
    (2).一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
    (3).300个cookie浏览器上限
    (4).Cookie大小有限制4kb
    5.删除cookie:
    (1).不设置有效期,关闭浏览器,自动失效
    (2).设置有效期为0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1.请求获得cookie:
    Cookie[] cookies = req.getCookies();
    2.获得cookie的键key
    cookie.getName()
    3.获得cookie的值value
    cookie.getValue();
    4.将字符串参数解析为带符号的十进制 long 
    parseLong(String s) 
    5.创建一个cookie key 和 value
    Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+""); 
    6.cookie的生存期
    cookie.setMaxAge(24*60*60);
    7.响应给客户端cookie
    resp.addCookie(cookie);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    package com.Jsxs.Cookie;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Date;
    
    //保存用户上一次访问的时间
    public class Demo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //        服务器告诉你来的时间,把这个时间封装成为一个信件,你带来信件,我就知道是你来了
            resp.setCharacterEncoding("utf-16");
            req.setCharacterEncoding("utf-16");
    
            PrintWriter out = resp.getWriter();
    //        cookie,是服务端从客户端获取,客户端需要请求服务端先得到cookie
            Cookie[] cookies = req.getCookies();     //这里返回一个数组,说明存在多个。
    //        判断cookie数组是否存在
            if (cookies != null){
    //            如果存在了怎么办?
                out.write("您上一次访问的时间是:");
                for (int i = 0; i < cookies.length; i++) {
                    Cookie cookie = cookies[i];
                    if (cookie.getName().equals("lastLoginTime")){
    //                    获取cookie中的值
                        long l = Long.parseLong(cookie.getValue());
                        Date date = new Date(l);
                        out.write(date.toLocaleString());
                    }
                }
            }else {
                out.write("您第一次访问本次网站,我们将会对您的信息进行详细的保存");
            }
    //        服务器相应一个cookie
            Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
            cookie.setMaxAge(24*60*60);
            resp.addCookie(cookie);
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    • 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
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    这里是引用

    再创建一个DEMO2,并且创建一个cookie的key,一定要和demo1的key相等,进行替换的操作。
    
    • 1
    package com.Jsxs.Cookie;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class Demo2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
            cookie.setMaxAge(0);
            resp.addCookie(cookie);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    这里是引用

    38.编码和解码(养成习惯)

    编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程

    1.编码:
    String string=URLEncoder.encode("字符串","utf-8")
    2.解码:
    String string=URLDecoder.decode("字符串","UTF-8")
    3.JSP文件上写:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    package com.Jsxs.Cookie;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    
    public class Demo3 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setCharacterEncoding("utf-16");
            req.setCharacterEncoding("utf-16");
            PrintWriter out = resp.getWriter();
            Cookie[] cookies = req.getCookies();
            if(cookies!=null){
                out.write("您带了小饼干,我很欢迎");
                for (int i = 0; i < cookies.length; i++) {
                    Cookie cookie = cookies[i];
                    if(cookie.getName().equals("name")){
    
                        System.out.println(URLDecoder.decode(cookie.getValue(),"UTF-8"));
                    }
                }
            }else {
                out.write("第一次登入还没创建到cookie");
            }
    
            Cookie cookie = new Cookie("name", URLEncoder.encode("吉士先生","UTF-8"));
            resp.addCookie(cookie);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
    • 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
    • 42

    在这里插入图片描述

    (十三)、Session(重点)

    39.session详解:

    1.什么是session?
    (1).服务器会给每一个用户(浏览器)创建一个Session对象;
    (2).一个Session单独占一个浏览器
    (3).用户登入之后,整个网站都能访问它。==》保存购物车的信息
    2.Session和Cookie的区别:
    (1).Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
    (2).Session是把用户的数据写到用户独占的Session中,服务器端保存 (保存重要的)
    (3).Session由服务端创建,不要我们new,
    3.Session使用场景:
    (1).保存一个用户登入信息,可以登入多个服务端的网页
    (2).在整个网站中会使用的数据,将其保存在session中,
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    1.Session的创建和赋值

    package com.Jsxs.Cookie;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URLEncoder;
    
    public class Demo4 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setCharacterEncoding("UTF-16");
            req.setCharacterEncoding("UTF-16");
            resp.setContentType("text/html");
            PrintWriter out = resp.getWriter();
    //      请求得到session
            HttpSession session = req.getSession();
    //       给session中存东西
            session.setAttribute("name","吉士先生");
    //        获取session的ID
            String id = session.getId();
    //        判断session是否是新的
            if(session.isNew()){
                out.write("session新的装备已经创建,ID"+id);
            }else {
                out.write("session已经在服务器中存在了"+id);
            }
    //        实质: 调用session的时候,会自动生成一个cookie,所以此时此刻会显示所有
    //        Cookie cookie = new Cookie("JSESSIONID","id");
    //        resp.addCookie(cookie);
    
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    • 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

    在这里插入图片描述

    2.得到创建的Session的值:

    
    package com.Jsxs.Cookie;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    
    public class Demo5 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-16");
            resp.setCharacterEncoding("UTF-16");
            resp.setContentType("text/html");
            PrintWriter out = resp.getWriter();
    
            HttpSession session = req.getSession();
            String name = (String) session.getAttribute("name");
            out.write(name);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
    • 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

    这里是引用

    3.运用对象:

    package com.Jsxs.Cookie;
    
    import com.Jsxs.Cookie.Object.Person;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URLEncoder;
    
    public class Demo4 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setCharacterEncoding("UTF-16");
            req.setCharacterEncoding("UTF-16");
            resp.setContentType("text/html");
            PrintWriter out = resp.getWriter();
    //      请求得到session
            HttpSession session = req.getSession();
    //       给session中存东西
            session.setAttribute("name",new Person("吉士先生",23));
    //        获取session的ID
            String id = session.getId();
    //        判断session是否是新的
            if(session.isNew()){
                out.write("session新的装备已经创建,ID"+id);
            }else {
                out.write("session已经在服务器中存在了"+id);
            }
    //        实质: 调用session的时候,会自动生成一个cookie,所以此时此刻会显示所有
    //        Cookie cookie = new Cookie("JSESSIONID","id");
    //        resp.addCookie(cookie);
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    • 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

    在这里插入图片描述

    在这里插入图片描述

    4.删除和移除的操作:

    package com.Jsxs.Cookie;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    public class Demo6 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            HttpSession session = req.getSession();
    //        移除name
            session.removeAttribute("name");
    //        注销session
            session.invalidate();
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    一个浏览器对应一个Session,删除和移除的操作:在这里插入图片描述

    5.web配置过期

        <session-config>
    <!--        单位是min-->
            <session-timeout>1</session-timeout>
        </session-config>
    
    • 1
    • 2
    • 3
    • 4

    这里是引用
    在这里插入图片描述
    在这里插入图片描述

    (十四)、JSP原理刨析

    40.什么是JSP?

    Java Server Pages: Java服务端页面,也和Servlet一样,用于动态的web开发
    1.最大的特点:
    (1).写JSP就像在写HTML
    (2).写JSP不用在web里面注册信息。
    2.区别:
    (1).HTML只给用户提供静态的数据
    (2).JSP页面中可以嵌入JAVA代码,为用户提供动态数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    41.JSP原理

    1.服务器内部工作:
    Tomcat中,有一个work目录,IDEA使用Tomcat会在IDEA中产生一个work目录
    
    • 1
    • 2
    2.我的电脑地址:
    C:\Users\22612\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\246560f4-bb63-4256-89d3-6446385cc047
    
    • 1
    • 2

    发现页面转化为java程序

    在这里插入图片描述
    浏览器向服务器发动请求,不管访问什么资源,其实都是在访问Servlet!
    JSP,最终也会被转化为一个java类。

    JSP本质上就是一个Servlet
    在这里插入图片描述

    3.JSP代码界面:
    
    • 1

    这里是引用
    在这里插入图片描述

    初始化
      public void _jspInit() {
      }
    销毁
      public void _jspDestroy() {
      }
    JSPServlet:
      public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.判断请求:
    2.内置一些对象:

        final javax.servlet.jsp.PageContext pageContext;   //页面上下文
        javax.servlet.http.HttpSession session = null;     //session
        final javax.servlet.ServletContext application;    //applicationContext
        final javax.servlet.ServletConfig config;   //配置
        javax.servlet.jsp.JspWriter out = null;   //输出
        final java.lang.Object page = this;     //当前页
    	final javax.servlet.http.HttpServletRequest request,  //请求
    	final javax.servlet.http.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文件中进行使用

    在这里插入图片描述

    <html>
    <body>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%
        String name="吉士先生";
    %>
    name:<%=name%>
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    在这里插入图片描述

    42.JSP基础语法

    1.依赖

    1.首先要创建一个普通的模板,我们要添加四个依赖。

    <dependencies>
    <!--Servlet的依赖-->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
            </dependency>
    <!--JSP的依赖-->
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>javax.servlet.jsp-api</artifactId>
                <version>2.2.1</version>
            </dependency>
    <!--JSTL表达式的依赖-->
            <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
            <dependency>
                <groupId>javax.servlet.jsp.jstl</groupId>
                <artifactId>jstl-api</artifactId>
                <version>1.2</version>
            </dependency>
    <!--standard标签-->
            <!-- https://mvnrepository.com/artifact/taglibs/standard -->
            <dependency>
                <groupId>taglibs</groupId>
                <artifactId>standard</artifactId>
                <version>1.1.2</version>
            </dependency>
    
        </dependencies>
    
    • 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
    1.任何语言都有自己的语法,JAVA中有,JSP作为java技术的一种应用,它拥有一些
    自己扩充的语法(知道即可,) Java所有语法都支持!1. out 进行输出面板
    
    • 1
    • 2
    • 3
    2.JSP表达式:

    2.JSP表达式:

    <%--JSP表达式
        作用: 用来将程序的输出,输出到客户端,不能写方法
        格式:
        <%= 变量或表达式%>
    --%>
      <%=new java.util.Date()%>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    3.热部署设置

    3.热部署设置: 就是可以不再重启服务端的前提下进行数据更新.jsp代码可以热更新,而java和web.xml配置的却不能进行热更新。

    在这里插入图片描述
    在这里插入图片描述

    4.JSP脚本片段

    4.JSP脚本片段

    <%--  jsp脚本--%>
      <%
          int sum=0;
        for (int i = 0; i < 100; i++) {
          sum+=i;
        }
      out.print(sum);
      %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这里是引用

    5.全局和局部

      <%
          int x=10;
          out.print(x);
      %>
    <hr/>
    <%
      int y=10;
      out.print(x+y);
    %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里是引用

    5.HTML内嵌JAVA,Java内嵌HTML

    6.HTML内嵌JAVA,Java内嵌HTML

    <%--  嵌入HTML语句--%>
    <%
      for (int i = 0; i < 5; i++) {
    %>
      <h5>你好 吉士先生! <%= i%></h5>
      <hr/>
    <%
      }
    %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里是引用

    6.JSP声明
    1.基本格式:
    <%! %>
    2.含义: JSP声明会被编译到JSP生成的java类中去,就是用来写方法和全局变量
    
    • 1
    • 2
    • 3
    <%!
    static {
      System.out.println("加载servlet");
    }
    private int globVar=0;
    
    public void Jsxs(){
      System.out.println("进入了方法JSXS");
    }
    %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    7.总结
    <% %>   片段
    <%= %>  变量和表达式和输出
    <%! %>  方法和全局变量
    <%-- --%>  JSP注释
    <!-- -->    HEML注释
    
    • 1
    • 2
    • 3
    • 4
    • 5

    43.JSP指令

    <%@page %>>     配置页面 建议写在上面
    
    
    
    • 1
    • 2
    • 3
    1.500 代码错页面替换(利用配置)
    <%@page errorPage="跳转到那个jsp" %>>
    
    • 1
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@page errorPage="error/500.jsp" %>>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        int x=1/0;
    %>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这里是引用
    在这里插入图片描述

    2.404代码页面替换(web配置)

    web配置如下

    <error-page>
    <error-code>404</error-code>
     <location>/error/404.jsp</location>
    </error-page>
    
    • 1
    • 2
    • 3
    • 4

    这里是引用
    在这里插入图片描述

    3.el表达式
    1.el表达式:
    ${pageContext.request.contextPath} 
    用于解决使用相对路径时出现的问题,它的作用是取出所部署项目的名字
     2.使用el表达式进行输出
    <h1>输出的值为</h1>
    <h3>${name1}</h3>
    <h3>${name2}</h3>
    <h3>${name3}</h3>
    <h3>${name4}</h3> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里是引用

    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <img src="${pageContext.request.contextPath}/image/2.jpg" alt="错误">
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    4.页面合并指令
    <%@include file="被合并的位置"%
    
    • 1
    <%--JSP标签--%>
    <jsp:include page="合并的位置"></jsp:include>
    
    • 1
    • 2
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%@include file="Common/header.jsp"%>
    <h2>网页主体</h2>
    <%@include file="Common/footer.jsp"%>
    <hr/>
    <%--JSP标签--%>
    <jsp:include page="Common/header.jsp"></jsp:include>
    <jsp:include page="Common/footer.jsp"></jsp:include>
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这里是引用

    5.标签页面合并指令和JSP指令合并的区别

    1.JSP指令合并,就是合并为一个页面。可能会起冲突.
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.标签页面拼接指令,本质上是三个页面,不起冲突
    在这里插入图片描述
    在这里插入图片描述

    6.界面介绍

    服务器启动之后,直接进入的是web目录。

    在这里插入图片描述

    7.九大内置对象
    (1).    final javax.servlet.jsp.PageContext pageContext;   //页面上下文
    (2).    javax.servlet.http.HttpSession session = null;     //session
    (3).    final javax.servlet.ServletContext application;    //applicationContext
    (4).    final javax.servlet.ServletConfig config;   //配置
    (5).    javax.servlet.jsp.JspWriter out = null;   //输出
    (6).    final java.lang.Object page = this;     //当前页
    (7).	final javax.servlet.http.HttpServletRequest request,  //请求
    (8).	final javax.servlet.http.HttpServletResponse response  //响应
    (9).	exception  异常
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1.重点的四个对象:
    (1).PageContext pageContext;    保存的数据只在一个页面中有效  
    假如出了当前页面的话,就会死亡.
    (2).HttpServletRequest request; 保存的数据只在一次请求中有效,请求转发会携带这个数据
    先出本次页面,请求转发,如果转发失败就会立刻死亡 (用户看完就没用了,比如 新闻)
    (3).HttpSession session;       保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    浏览器啥时候关闭,我啥时候死亡  (用户用完之后,等下还要用,比如购物车)
    (4).ServletContext application; 保存的数据只在服务器中有效,从打开服务器到关闭服务器
    服务器啥时候关闭,我啥时候死亡  (一个用户用完了,其他用户还要用。比如 统计服务器人数,聊天数据)
    
    从底层到高层(作用域) pageContext-->request-->session-->application
    pageContext才有find方法
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1.保存的页面只在一个页面中有效,出了页面就会死亡
    在这里插入图片描述
    2.保存的页面如果不经过转发,就会死亡
    在这里插入图片描述
    3.如果利用session,直到用户关闭浏览器才会去掉session
    在这里插入图片描述
    在这里插入图片描述
    4.最高级服务器关闭:数据才会消失.
    在这里插入图片描述

     pageContext.setAttribute("name1","吉士先生1");   //保存的数据只在一个页面中有效
        request.setAttribute("name2","吉士先生2");      //保存的数据只在一次请求中有效,请求转发会携带这个数据
        session.setAttribute("name3","吉士先生3");      //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
        application.setAttribute("name4","吉士先生4");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器
    
    • 1
    • 2
    • 3
    • 4

    验证页面和转发的局限

    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%--内置对象--%>
    <%
        pageContext.setAttribute("name1","吉士先生1");   //保存的数据只在一个页面中有效
        request.setAttribute("name2","吉士先生2");      //保存的数据只在一次请求中有效,请求转发会携带这个数据
        session.setAttribute("name3","吉士先生3");      //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
        application.setAttribute("name4","吉士先生4");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器
    %>
    <%
    //通过pageContext进行获取存的信息
      String name1 = (String) pageContext.findAttribute("name1");
      String name2 = (String) pageContext.findAttribute("name2");
      String name3 = (String) pageContext.findAttribute("name3");
      String name4 = (String) pageContext.findAttribute("name4");
    
    
    %>
    <%--使用el表达式进行输出--%>
    <h1>输出的值为</h1>
    <h3>${name1}</h3>
    <h3>${name2}</h3>
    <h3>${name3}</h3>
    <h3>${name4}</h3>
    
    </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
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    <%--
      Created by IntelliJ IDEA.
      User: 22612
      Date: 2022/11/12
      Time: 8:47
      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>
    <%
    //通过pageContext进行获取存的信息
      String name1 = (String) pageContext.findAttribute("name1");
      String name2 = (String) pageContext.findAttribute("name2");
      String name3 = (String) pageContext.findAttribute("name3");
      String name4 = (String) pageContext.findAttribute("name4");
    
    
    %>
    <%--使用el表达式进行输出--%>
    <h1>输出的值为</h1>
    <h3>${name1}</h3>
    <h3>${name2}</h3>
    <h3>${name3}</h3>
    <h3>${name4}</h3>
    
    </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
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    1.第一个页面在这里插入图片描述

    第二个页面打开,在这里插入图片描述

    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%--内置对象--%>
    <%
        pageContext.setAttribute("name1","吉士先生1");   //保存的数据只在一个页面中有效
        request.setAttribute("name2","吉士先生2");      //保存的数据只在一次请求中有效,请求转发会携带这个数据
        session.setAttribute("name3","吉士先生3");      //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
        application.setAttribute("name4","吉士先生4");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器
    %>
    <%
    //通过pageContext进行获取存的信息
      //从底层到高层(作用域) page-->request-->session-->application
      String name1 = (String) pageContext.findAttribute("name1");
      String name2 = (String) pageContext.findAttribute("name2");
      String name3 = (String) pageContext.findAttribute("name3");
      String name4 = (String) pageContext.findAttribute("name4");
      pageContext.forward("/pageDemo2.jsp");
    
    
    %>
    <%--使用el表达式进行输出--%>
    <h1>输出的值为</h1>
    <h3>${name1}</h3>
    <h3>${name2}</h3>
    <h3>${name3}</h3>
    <h3>${name4}</h3>
    
    </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
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    <%--
      Created by IntelliJ IDEA.
      User: 22612
      Date: 2022/11/12
      Time: 8:47
      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>
    <%
    //通过pageContext进行获取存的信息
      String name1 = (String) pageContext.findAttribute("name1");
      String name2 = (String) pageContext.findAttribute("name2");
      String name3 = (String) pageContext.findAttribute("name3");
      String name4 = (String) pageContext.findAttribute("name4");
    
    %>
    <%--使用el表达式进行输出--%>
    <h1>输出的值为</h1>
    <h3>${name1}</h3>
    <h3>${name2}</h3>
    <h3>${name3}</h3>
    <h3>${name4}</h3>
    
    </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
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    转发:这里是引用

    44.JSP标签,JSTL标签,EL表达式

    1.EL表达式:

    1.定义:
    语言是一种简单的语言,提供了在 JSP 中简化表达式的方法,目的是为了尽量减少JSP页面中的Java代码,使得JSP页面的处理 程序 编写起来更加简洁,便于开发和维护。 [2] 在JSP中访问模型对象是通过EL表达式的语法来表达。 所有EL表达式的格式都是以“$ {}”表示。

    2.作用:
    (1).获取数据

    1. 默认从小到大的范围中找,找到第一个就返回。 
    ${name}
    2.获取指定的位置: 切记没有pageScope
    获取request作用域中的username: ${requestScope.username}
    获取session作用域中的username: ${sessionScope.username}
    获取application作用域中的username: ${applicationScope.username}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>EL表达式</title>
    </head>
    <body>
    <%
        pageContext.setAttribute("username","zhangsan");
        request.setAttribute("username","lisi");
        session.setAttribute("username","wangwu");
        application.setAttribute("username","zhaoliu");
    %>
      ${username}
      ${username}
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这里是引用

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>EL表达式</title>
    </head>
    <body>
    <%
        pageContext.setAttribute("username","zhangsan");
        request.setAttribute("username","lisi");
        session.setAttribute("username","wangwu");
        application.setAttribute("username","zhaoliu");
    %>
      ${requestScope.username}
      ${sessionScope.username}
      ${applicationScope.username}
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这里是引用

    3.获得集合中的值和集合的长度         array是集合的变量名.
    ${arry[1]}--${arry[2]}
    ${arry.size()}
    
    • 1
    • 2
    • 3
    <%@ page import="java.util.ArrayList" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>EL表达式</title>
    </head>
    <body>
    <%
        ArrayList<String> list=new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        request.setAttribute("arry",list);
    %>
    ${arry[1]}--${arry[2]}<br>
    ${arry.size()}
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    这里是引用

    (2).执行运算

     + - * / == && ||
    
    • 1
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>EL表达式</title>
    </head>
    <body>
    <%
        request.setAttribute("a",15);
        request.setAttribute("b",6);
        request.setAttribute("c","bb");
        request.setAttribute("d","cc");
        request.setAttribute("e","cc");
    %>
    ${a}+${b}
    ${a+b}
    <br>
    ${a}-${b}
    ${a-b}
    <br>
    ${a}/${b}
    ${a/b}
    <br>
    ${a}*${b}
    ${a*b}
    <br>
    ${a==b}
    <br>
    ${d==e}
    <br>
    ${1==2}
    <hr>
    ${1>2 && 2>1}
    <hr>
    ${1>2 || 2>1}
    </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
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述

    (3).获取web开发的常用对象

    ${param.参数名}   获取文本框里面的值
     <input type="text" name="userName" value="${param.userName}">
    
    • 1
    • 2

    在这里插入图片描述

    (4).调用java方法

    2.JSP标签
    1.跳转标签:
    <jsp:forward page="跳转给谁?"></jsp:forward>
    2.跳转页面并附带参数:
    <jsp:forward page="跳转给谁?">
        <jsp:param name="name" value="吉士xs"/>
        <jsp:param name="age" value="21"/>
    </jsp:forward>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.跳转页面:
    在这里插入图片描述
    2.跳转页面附带参数:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3.JSTL标签

    STL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。

    JSTL标签库的使用就是为了弥补HTML标签的不足,他自定义了许多标签,可以供我们使用,标签的
    功能和java的代码一样。
    JSTl使用步骤:
    (1).引入对应的taglib
    (2).使用其中的方法。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这里是引用

    核心标签:
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>Tomcat中也要引入 jstl包和stand包,要不然会报错.
    
    格式化标签:
    SQL标签:
    XML标签:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    <c:if/> 语句的用法
    <c:if test="${判断}" var="isadmin"></c:if>
    <c:out value="${isadmin}"/>
    
    • 1
    • 2
    • 3
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%--引入JST核心标签库,我们才能使用核心标签库--%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <form action="JSTL.jsp" method="get">
    //获得文本框中的值,
      <input type="text" name="userName" value="${param.userName}">
      <input type="submit" value="登入">
    </form>
    <%--判断如果提交的用户名是管理员,那么就登入成功--%>
    <c:if test="${param.userName=='admin'}" var="isadmin">
      <c:out value="管理员欢迎您!"/>
    </c:if>
    <c:out value="${isadmin}"/>
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    这里是引用

    1.SWITCH()的用法
    
    2.定义变量的用法:
    <c:set var="变量名" value="值"></c:set>
    
    • 1
    • 2
    • 3
    • 4
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%--定义一个变量score 值为85--%>
    <c:set var="score" value="82"></c:set>
    <c:choose>
    
        <c:when test="${score>=90}">
            你的成绩为:<c:out value="A" ></c:out>
        </c:when>
        <c:when test="${score>=80}">
            你的成绩为:<c:out value="B" ></c:out>
        </c:when>
        <c:when test="${score>=70}">
            你的成绩为:<c:out value="C" ></c:out>
        </c:when>
        <c:when test="${score>=60}">
            你的成绩为:<c:out value="D" ></c:out>
        </c:when>
    
    </c:choose>
    
    </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
    • 25
    • 26
    • 27
    • 28
    • 29

    这里是引用

    3.遍历的操作
    <c:forEach var="变量名" items="${遍历谁}" begin="从那开始" end="结束" step="步长">
    
    • 1
    • 2
    <%@ page import="java.util.ArrayList" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        ArrayList<String> strings = new ArrayList<>();
        strings.add(0,"张三");
        strings.add(1,"李四");
        strings.add(2,"王二");
        strings.add(3,"小王");
    //    放入到request中,目的是为了节省空间
        request.setAttribute("list",strings);
    %>
    <c:forEach var="people" items="${list}">
        <c:out value="${people}"><br/></c:out>
    </c:forEach>
    </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

    这里是引用

  • 相关阅读:
    不甘于被强势厂商捆绑,中国移动未来或自研5G基站
    IDEA自定义代码快捷指令
    微信小程序如何利用接口返回经纬计算实际位置并且进行导航功能【下】
    AI作诗,模仿周杰伦创作歌词<->实战项目
    Python操作MySQL基础使用
    探索人工智能的世界:构建智能问答系统之前置篇
    看DevExpress丰富图表样式,如何为基金公司业务创新赋能
    Gumroad如何使用美国虚拟visa卡购买图集教程?gumroad国内银行卡能付款吗?gumroad付款教程?
    ReactNative原理与核心知识点
    Nessus扫描结果出现在TE.IO或者ES容器结果查看问题解决方案
  • 原文地址:https://blog.csdn.net/qq_69683957/article/details/127789145