大数据最全B站---【狂神说Java】JavaWeb入门到实战---笔记

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

工作3-5年之后,可以尝试手写Tomcat服务器;

下载Tomcat:

  1. 安装or解压
  2. 了解配置文件及目录结构
  3. 这个东西的作用

3、Tomcat

3.1、安装tomcat tomcat

官网:http://tomcat.apache.org/

3.2、Tomcat启动和配置

文件夹作用:

访问测试:http://localhost:8080/

可能遇到的问题:

  1. Java环境变量没有配置
  2. 闪退问题:需要配置兼容性
  3. 乱码问题:配置文件中设置

可以修改 conf/logging.properties 中的 java.util.logging.ConsoleHandler.encoding = GBK 解决乱码问题

3.3、配置

可以配置启动的端口号

  • tomcat的默认端口号为:8080
  • mysql:3306
  • http:80
  • https:443

    可以配置主机的名称

    • 默认的主机名为:localhost->127.0.0.1
    • 默认网站应用存放的位置为:webapps
       

      高难度面试题:

      请你谈谈网站是如何进行访问的!

      1. 输入一个域名;回车

      2. 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射;

        1. 有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
         127.0.0.1 www.qinjiang.com
        
        1. 没有:去DNS服务器找,找到的话就返回,找不到就返回找不到;

      4.可以配置一下环境变量(可选性)

      3.4、发布一个web网站

      不会就先模仿

      • 将自己写的网站,放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了

        网站应该有的结构

        --webapps :Tomcat服务器的web目录
        	-ROOT
        	-kuangstudy :网站的目录名
        		- WEB-INF
        			-classes : java程序
        			-lib:web应用所依赖的jar包
        			-web.xml :网站配置文件
        		- index.html 默认的首页
        		- static 
                    -css
                    	-style.css
                    -js
                    -img
                 -.....
        

        HTTP协议:面试

        Maven:构建工具

        • Maven安装包

          Servlet入门

          • HelloWorld!
          • Servlet配置 ·原理

            4、Http

            4.1、什么是HTTP

            (超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。

            • 文本:html,字符串,…
            • 超文本:图片,音乐,视频,定位,地图.……
            • 端口:80

              Https:安全的

              4.2、两个时代
              • http1.0
                • HTTP/1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接
                • http2.0
                  • HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。
                    4.3、Http请求
                    • 客户端–发请求(Request)–服务器

                      百度:

                      Request URL:https://www.baidu.com/   请求地址
                      Request Method:GET    get方法/post方法
                      Status Code:200 OK    状态码:200
                      Remote(远程) Address:14.215.177.39:443
                      Accept:text/html  
                      Accept-Encoding:gzip, deflate, br
                      Accept-Language:zh-CN,zh;q=0.9    语言
                      Cache-Control:max-age=0
                      Connection:keep-alive
                      
                      4.3.1、请求行
                      • 请求行中的请求方式:GET
                      • 请求方式:Get,Post,HEAD,DELETE,PUT,TRACT.…
                        • get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
                        • post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。
                          4.3.2、消息头
                          Accept:告诉浏览器,它所支持的数据类型
                          Accept-Encoding:支持哪种编码格式  GBK   UTF-8   GB2312  ISO8859-1
                          Accept-Language:告诉浏览器,它的语言环境
                          Cache-Control:缓存控制
                          Connection:告诉浏览器,请求完成是断开还是保持连接
                          HOST:主机..../.
                          
                          4.4、Http响应
                          • 服务器–响应…….客户端

                            百度:

                            Cache-Control:private    缓存控制
                            Connection:Keep-Alive    连接
                            Content-Encoding:gzip    编码
                            Content-Type:text/html   类型 
                            4.4.1、响应体
                            Accept:告诉浏览器,它所支持的数据类型
                            Accept-Encoding:支持哪种编码格式  GBK   UTF-8   GB2312  ISO8859-1
                            Accept-Language:告诉浏览器,它的语言环境
                            Cache-Control:缓存控制
                            Connection:告诉浏览器,请求完成是断开还是保持连接
                            HOST:主机..../.
                            Refresh:告诉客户端,多久刷新一次;
                            Location:让网页重新定位;
                            
                            4.4.2、响应状态码

                            200:请求响应成功200

                            3xx:请求重定向·重定向:你重新到我给你新位置去;

                            4xx:找不到资源404·资源不存在;

                            5xx:服务器代码错误 500 502:网关错误

                            常见面试题:

                            当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?

                            5、Maven

                            我为什么要学习这个技术?

                            1. 在Javaweb开发中,需要使用大量的jar包,我们手动去导入;
                            2. 如何能够让一个东西自动帮我导入和配置这个jar包。

                            由此,Maven诞生了!

                            5.1、Maven项目架构管理工具

                            我们目前用来就是方便导入jar包的!

                            Maven的核心思想:约定大于配置

                            • 有约束,不要去违反。

                              Maven会规定好你该如何去编写我们Java代码,必须要按照这个规范来;

                              5.2、下载安装Maven

                              官网:https://maven.apache.org/

                              下载完成后,解压即可;

                              小狂神友情建议:电脑上的所有环境都放在一个文件夹下,方便管理;

                              5.3、配置环境变量

                              在我们的系统环境变量中配置如下配置:

                              • M2_HOME maven目录下的bin目录
                              • MAVEN_HOME maven的目录
                              • 在系统的path中配置%MAVEN_HOME%\bin

                                测试Maven是否安装成功,保证必须配置完毕!

                                5.4、阿里云镜像
                                • 镜像:mirrors
                                • 作用:加速我们的下载
                                • 国内建议使用阿里云的镜像
                                   nexus-aliyun *,!jeecg,!jeecg-snapshots Nexus aliyun http://maven.aliyun.com/nexus/content/groups/public 

                                  D:Enmvironment\apache-maven-3.6.2conf\ettings.xml

                                  (狂神老师配置源和仓库的文件位置)

                                  5.5、本地仓库

                                  在本地的仓库,远程仓库; 建立一个本地仓库:localRepository

                                  D:\Environment\apache-maven-3.6.2\maven-repo
                                  5.6 ~ 5.13、笔记-下载地址

                                  (拒接度盘)下载地址:https://lanzoui.com/ibuibxi

                                  后面的 5.6 ~ 5.13 + 案例演示 (图)

                                  后面第 5 剩下部分的笔记建议配合狂神的

                                  “javaweb-06:IDEA中Maven的操作”、

                                  “javaweb-07:解决大家遇到的一些问题”

                                  仔细(回)看

                                  6、Servlet

                                  6.1、Servlet简介
                                  • Servlet就是sun公司开发动态web的一门技术
                                  • Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
                                    • 编写一个类,实现Servlet接口
                                    • 把开发好Java类部署到web服务器中。

                                      把实现了Servlet接口的Java程序叫做,Servlet

                                      6.2、HelloServlet

                                      Serlvet接口Sun公司有两个默认的实现类:HttpServlet,GenericServled

                                      6.2、HelloServlet
                                      1. 构建一个普通的Maven项目,等理面的sc目录,以后我们的学习就在这个项目里面建立Moudel;这个空的工程就题Maven主工程;
                                      2. 关于Maven父子工程的理解;

                                        父项目中会有

                                        servlet-01 

                                      子项目会有

                                        javaweb-02-servlet com.kuang 1.0-SNAPSHOT 

                                      父项目中的java子项目可以直接使用

                                      son extends father
                                      
                                      1. Maven环境优化
                                        1. 修改web.xml为最新的
                                        2. 将maven的结构搭建完整

                                          .

                                      2. 编写一个Servlet程序
                                        1. 编写一个普通类
                                        2. 实现Servlet接口,这里我们直接继承HttpServlet
                                       public class HelloServlet extends HttpServlet {
                                               
                                               //由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样;
                                               @Override
                                               protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                   //ServletOutputStream outputStream = resp.getOutputStream();
                                                   PrintWriter writer = resp.getWriter(); //响应流
                                                   writer.print("Hello,Serlvet");
                                               }
                                           
                                               @Override
                                               protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                   doGet(req, resp);
                                               }
                                           } 
                                      1. 编写Servlet的映射

                                        为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需

                                        要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;

                                         hello com.kuang.servlet.HelloServlet    hello /hello  
                                      1. 配置Tomcat

                                        注意:配置项目发布的路径就可以了

                                      2. 启动测试,OK!

                                      6.3、Servlet原理

                                      Servlet是由Web服务器调用,web服务器在收到浏览器请求之后,会:

                                      6.4、Mapping问题
                                      1. 一个Servlet可以指定一个映射路径

                                        .

                                        hello /hello 
                                      1. 一个servlet可以指定多个映射路径
                                        hello /hello   hello /hello2   hello /hello3   hello /hello4   hello /hello5  
                                      1. 一个servlet可以指定通用映射路径
                                        hello /hello/* 
                                      1. 默认请求路径
                                         hello /* 
                                      1. 指定一些后缀或者前缀等等…
                                         hello *.qinjiang 
                                      1. 优先级问题

                                        指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;

                                         error com.kuang.servlet.ErrorServlet   error /*  
                                      6.5、ServletContext

                                      web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;

                                      6.5.1、共享数据

                                      我在这个Servlet中保存的数据,可以在另外一个servlet中拿到;

                                      public class HelloServlet extends HttpServlet {
                                          @Override
                                          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                              
                                              //this.getInitParameter() 初始化参数
                                              //this.getServletConfig() Servlet配置
                                              //this.getServletContext() Servlet上下文
                                              ServletContext context = this.getServletContext();
                                              String username = "秦疆"; //数据
                                              context.setAttribute("username",username); //将一个数据保存在了ServletContext中,名字为:username 。值 username
                                          }
                                      }
                                      
                                      public class GetServlet extends HttpServlet {
                                          @Override
                                          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                              ServletContext context = this.getServletContext();
                                              String username = (String) context.getAttribute("username");
                                              resp.setContentType("text/html");
                                              resp.setCharacterEncoding("utf-8");
                                              resp.getWriter().print("名字"+username);
                                          }
                                          @Override
                                          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                              doGet(req, resp);
                                          }
                                      }
                                      
                                        hello com.kuang.servlet.HelloServlet   hello /hello   getc com.kuang.servlet.GetServlet   getc /getc 

                                      测试访问结果;

                                      6.5.2、获取初始化参数
                                         url jdbc:mysql://localhost:3306/mybatis 
                                      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                          ServletContext context = this.getServletContext();
                                          String url = context.getInitParameter("url");
                                          resp.getWriter().print(url);
                                      }
                                      
                                      6.5.3、请求转发
                                      @Override
                                      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                          ServletContext context = this.getServletContext();
                                          System.out.println("进入了ServletDemo04");
                                          //RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //转发的请求路径
                                          //requestDispatcher.forward(req,resp); //调用forward实现请求转发;
                                          context.getRequestDispatcher("/gp").forward(req,resp);
                                      }
                                      

                                      4、读取资源文件

                                      Properties

                                      • 在java目录下新建properties
                                      • 在resources目录下新建properties

                                        发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath:

                                        思路:需要一个文件流

                                        username=root12312
                                        password=zxczxczxc
                                        
                                        public class ServletDemo05 extends HttpServlet {
                                            @Override
                                            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties");
                                                Properties prop = new Properties();
                                                prop.load(is);
                                                String user = prop.getProperty("username");
                                                String pwd = prop.getProperty("password");
                                                resp.getWriter().print(user+":"+pwd);
                                            }
                                            @Override
                                            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                doGet(req, resp);
                                            }
                                        }
                                        

                                        访问测试即可ok;

                                        6.6、HttpServletResponse
                                        web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest
                                        对象,代表响应的一个HttpServletResponse;
                                        
                                        • 如果要获取客户端请求过来的参数:找HttpServletRequest
                                        • 如果要给客户端响应一些信息:找HttpServletResponse##### 6.6.1、简单分类

                                          负责向浏览器发送数据的方法

                                           servletOutputstream getOutputstream() throws IOException;
                                              Printwriter getwriter() throws IOException;
                                          

                                          负责向浏览器发送响应头的方法

                                          void setCharacterEncoding(String var1);
                                          void setContentLength(int var1);
                                          void setContentLengthLong(long var1);
                                          void setContentType(String var1);
                                          void setDateHeader(String varl,long var2)
                                          void addDateHeader(String var1,long var2)
                                          void setHeader(String var1,String var2);
                                          void addHeader(String var1,String var2);
                                          void setIntHeader(String var1,int var2);
                                          void addIntHeader(String varl,int var2);
                                          

                                          响应的状态码

                                          6.6.2、下载文件
                                          1. 向浏览器输出消息(一直在讲,就不说了)
                                          2. 下载文件
                                            1. 要获取下载文件的路径
                                            2. 下载的文件名是啥?
                                            3. 设置想办法让浏览器能够支持下载我们需要的东西
                                            4. 获取下载文件的输入流
                                            5. 创建缓冲区
                                            6. 获取OutputStream对象
                                            7. 将FileOutputStream流写入到bufer缓冲区
                                            8. 使用OutputStream将缓冲区中的数据输出到客户端!
                                          @Override
                                          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                              // 1. 要获取下载文件的路径
                                              String realPath = "F:\\班级管理\\西开【19525】\\2、代码\\JavaWeb\\javaweb-02-servlet\\response\\target\\classes\\秦疆.png";
                                              System.out.println("下载文件的路径:"+realPath);
                                              // 2. 下载的文件名是啥?
                                              String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
                                              // 3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件名URLEncoder.encode编码,否则有可能乱码
                                              resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
                                              // 4. 获取下载文件的输入流
                                              FileInputStream in = new FileInputStream(realPath);
                                              // 5. 创建缓冲区
                                              int len = 0;
                                              byte[] buffer = new byte[1024];
                                              // 6. 获取OutputStream对象
                                              ServletOutputStream out = resp.getOutputStream();
                                              // 7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
                                              while ((len=in.read(buffer))>0){
                                                  out.write(buffer,0,len);
                                              }
                                              in.close();
                                              out.close();
                                          }
                                          
                                          6.6.3、验证码功能

                                          验证怎么来的?

                                          • 前端实现
                                          • 后端实现,需要用到Java的图片类,生产一个图片
                                            package com.kuang.servlet;
                                            import javax.imageio.ImageIO;
                                            import javax.servlet.ServletException;
                                            import javax.servlet.http.HttpServlet;
                                            import javax.servlet.http.HttpServletRequest;
                                            import javax.servlet.http.HttpServletResponse;
                                            import java.awt.\*;
                                            import java.awt.image.BufferedImage;
                                            import java.io.IOException;
                                            import java.util.Random;
                                            public class ImageServlet extends HttpServlet {
                                                @Override
                                                protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                    //如何让浏览器3秒自动刷新一次;
                                                    resp.setHeader("refresh","3");
                                                    
                                                    //在内存中创建一个图片
                                                    BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE\_INT\_RGB);
                                                    //得到图片
                                                    Graphics2D g = (Graphics2D) image.getGraphics(); //笔
                                                    //设置图片的背景颜色
                                                    g.setColor(Color.white);
                                                    g.fillRect(0,0,80,20);
                                                    //给图片写数据
                                                    g.setColor(Color.BLUE);
                                                    g.setFont(new Font(null,Font.BOLD,20));
                                                    g.drawString(makeNum(),0,20);
                                                    //告诉浏览器,这个请求用图片的方式打开
                                                    resp.setContentType("image/jpeg");
                                                    //网站存在缓存,不让浏览器缓存
                                                    resp.setDateHeader("expires",-1);
                                                    resp.setHeader("Cache-Control","no-cache");
                                                    resp.setHeader("Pragma","no-cache");
                                                    //把图片写给浏览器
                                                    ImageIO.write(image,"jpg", resp.getOutputStream());
                                                }
                                                //生成随机数
                                                private String makeNum(){
                                                    Random random = new Random();
                                                    String num = random.nextInt(9999999) + "";
                                                    StringBuffer sb = new StringBuffer();
                                                    for (int i = 0; i < 7-num.length() ; i++) {
                                                        sb.append("0");
                                                    }
                                                    num = sb.toString() + num;
                                                    return num;
                                                }
                                                @Override
                                                protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                    doGet(req, resp);
                                                }
                                            }
                                            
                                            ImageServletcom.kuang.servlet.ImageServletImageservlet/img

                                            常见场景:

                                            • 用户登录
                                               void sendRedirect(String var1) throws IOException;
                                              

                                              测试:

                                              @override
                                              protected void doGet(HttpservletRequest req, HttpservletResponse resp) throws ServletException, IOException {
                                                  resp. sendRedirect("/r/img");//重定向
                                                  /\*
                                               resp. setHeader("Location","/r/img");
                                               resp. setstatus (302);
                                               \*
                                              }
                                              

                                              index.jsp

                                              Hel1o World!

                                              <%--这里超交的路径,需要寻找到项目的路径--%><%--${pageContext. request, contextPath}代表当前的项目--%>
                                              用户名:
                                              密码:

                                              RequestTest.java

                                              public class RequestTest extends HttpServlet {
                                                  @Override
                                                  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                  //处理方求
                                                  String username = req.getParameter( s: "username");
                                                  String password  rea.getParameter( s: "password");
                                                  System.out.println(username+":"+password);
                                                  resp.sendRedirect(s: "/r/success.jsp");
                                              }
                                              

                                              重定向页面success.jsp

                                              <%@ page contentType="text/html; charset=UTF-8" language="java" %>  Title   

                                              success

                                              web.xml配置

                                                requset com. kuang. servlet. RequestTest   requset /login 

                                              导入依赖的jar包

                                                  javax.servlet javax. servlet-api 4.0.1    javax.servlet.jsp javax. servlet.jsp-api 2.3.3   
                                              6.7、HttpServletRequest

                                              HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息;

                                              6.7.1、获取参数,请求转发

                                              自己创建类,且需要继承HttpServlet类

                                              @Override
                                              protected void doGet(HttpservletRequest req. HttpservletResponse resp) throws ServletException, IOException {
                                              	req. setcharacterEncoding("utf-8");
                                              	resp.setcharacterEncoding("utf-8");
                                              	String username = req.getParameter("username");
                                              	String password = req.getParameter("password");
                                              	String[] hobbys = req.getParameterValues("hobbys");
                                              	System.out.println("==========");
                                              	//后台接收中文乱码问题
                                              	System. out.println(username);
                                              	System. out.println(password);
                                              	System. out.println(Arrays.tostring(hobbys));
                                              	System. out.println("============");
                                              	system. out.println(req.getContextPath());
                                              	//通过请求转发
                                              	//这里的/代表当前的web应用
                                              	req.getRequestDispatcher("/success.jsp").forward(req,resp);
                                              }
                                              

                                              7、Cookie、Session

                                              7.1、会话

                                              会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话;

                                              有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话;

                                              你能怎么证明你是西开的学生?

                                              你,西开

                                              1. 发票, 西开给你发票
                                              2. 学校登记, 西开标记你来过了

                                              一个网站,怎么证明你来过?

                                              客户端, 服务端

                                              1. 服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了; cookie
                                              2. 服务器登记你来过了,下次你来的时候我来匹配你; seesion
                                              7.2、保存会话的两种技术

                                              cookie

                                              • 客户端技术 (响应,请求)

                                                session

                                                • 服务器技术,利用这个技术,可以保存用户的会话信息? 我们可以把信息或者数据放在Session中!

                                                  常见:网站登录之后,你下次不用再登录了,第二次访问直接就上去了!

                                                  7.3、Cookie
                                                  1. 从请求中拿到cookie信息
                                                  2. 服务器响应给客户端cookie
                                                  Cookie[] cookies = req.getCookies(); //获得Cookie
                                                  cookie.getName(); //获得cookie中的key
                                                  cookie.getValue(); //获得cookie中的vlaue
                                                  new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
                                                  cookie.setMaxAge(24\*60\*60); //设置cookie的有效期
                                                  resp.addCookie(cookie); //响应给客户端一个cookie
                                                  

                                                  cookie:一般会保存在本地的 用户目录下 appdata;

                                                  一个网站cookie是否存在上限!聊聊细节问题

                                                  • 一个Cookie只能保存一个信息;
                                                  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
                                                  • Cookie大小有限制4kb;
                                                  • 300个cookie浏览器上限

                                                    删除Cookie;

                                                    • 不设置有效期,关闭浏览器,自动失效;
                                                    • 设置有效期时间为 0 ;

                                                      编码解码:

                                                      URLEncoder.encode("秦疆","utf-8")
                                                      URLDecoder.decode(cookie.getValue(),"UTF-8")
                                                      
                                                      7.4、Session(重点)

                                                      什么是Session:

                                                      • 服务器会给每一个用户(浏览器)创建一个Seesion对象;
                                                      • 一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
                                                      • 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息……

                                                        Session和cookie的区别:

                                                        • Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
                                                        • Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
                                                        • Session对象由服务创建;

                                                          使用场景:

                                                          • 保存一个登录用户的信息;
                                                          • 购物车信息;
                                                          • 在整个网站中经常会使用的数据,我们将它保存在Session中;

                                                            使用Session:

                                                            package com.kuang.servlet;
                                                            import com.kuang.pojo.Person;
                                                            import javax.servlet.ServletException;
                                                            import javax.servlet.http.\*;
                                                            import java.io.IOException;
                                                            public class SessionDemo01 extends HttpServlet {
                                                                @Override
                                                                protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                                    
                                                                    //解决乱码问题
                                                                    req.setCharacterEncoding("UTF-8");
                                                                    resp.setCharacterEncoding("UTF-8");
                                                                    resp.setContentType("text/html;charset=utf-8");
                                                                    
                                                                    //得到Session
                                                                    HttpSession session = req.getSession();
                                                                    //给Session中存东西
                                                                    session.setAttribute("name",new Person("秦疆",1));
                                                                    //获取Session的ID
                                                                    String sessionId = session.getId();
                                                                    //判断Session是不是新创建
                                                                    if (session.isNew()){
                                                                        resp.getWriter().write("session创建成功,ID:"+sessionId);
                                                                    }else {
                                                                        resp.getWriter().write("session以及在服务器中存在了,ID:"+sessionId);
                                                                    }
                                                                    //Session创建的时候做了什么事情;
                                                            // Cookie cookie = new Cookie("JSESSIONID",sessionId);
                                                            // resp.addCookie(cookie);
                                                                }
                                                                @Override
                                                                protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                                                                    doGet(req, resp);
                                                                }
                                                            }
                                                            
                                                            //得到Session
                                                            HttpSession session = req.getSession();
                                                            Person person = (Person) session.getAttribute("name");
                                                            System.out.println(person.toString());
                                                            HttpSession session = req.getSession();
                                                            session.removeAttribute("name");
                                                            //手动注销Session
                                                            session.invalidate();
                                                            

                                                            会话自动过期:web.xml配置

                                                              15

                                                            8、JSP

                                                            8.1、什么是JSP

                                                            Java Server Pages : Java服务器端页面,也和Servlet一样,用于动态Web技术!

                                                            最大的特点:

                                                            • 写JSP就像在写HTML
                                                            • 区别:
                                                              • HTML只给用户提供静态的数据
                                                              • JSP页面中可以嵌入JAVA代码,为用户提供动态数据;
                                                                8.2、JSP原理

                                                                思路:JSP到底怎么执行的!

                                                                • 代码层面没有任何问题
                                                                • 服务器内部工作

                                                                  Tomcat中有一个work目录;

                                                                  IDEA中使用Tomcat的会在IDEA的Tomcat中生产一个work目录

                                                                  我电脑的地址:

                                                                  C:\Users\Administrator.IntelliJIdea2018.1\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\ROOT\org\apache\jsp

                                                                  发现页面转变成了Java程序!

                                                                  浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!

                                                                  JSP最终也会被转换成为一个Java类!

                                                                  JSP 本质上就是一个Servlet

                                                                  //初始化
                                                                    public void \_jspInit() {
                                                                        
                                                                    }
                                                                  //销毁
                                                                    public void \_jspDestroy() {
                                                                    }
                                                                  //JSPService
                                                                    public void \_jspService(.HttpServletRequest request,HttpServletResponse response)
                                                                  
                                                                  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;         //config
                                                                  javax.servlet.jsp.JspWriter out = null;           //out
                                                                  final java.lang.Object page = this;               //page:当前
                                                                  HttpServletRequest request                        //请求
                                                                  HttpServletResponse response                      //响应
                                                                  
                                                                  1. 输出页面前增加的代码
                                                                  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. 以上的这些个对象我们可以在JSP页面中直接使用!

                                                                  在JSP页面中;

                                                                  只要是 JAVA代码就会原封不动的输出;

                                                                  如果是HTML代码,就会被转换为:

                                                                  out.write("\r\n");
                                                                  

                                                                  这样的格式,输出到前端!

                                                                  8.3、JSP基础语法

                                                                  任何语言都有自己的语法,JAVA中有。 JSP 作为java技术的一种应用,它拥有一些自己扩充的语法(了解,知道即可!),Java所有语法都支持!

                                                                  8.3.1、JSP表达式
                                                                   <%--JSP表达式
                                                                    作用:用来将程序的输出,输出到客户端 <%= 变量或者表达式%> --%> <%= new java.util.Date()%>
                                                                  8.3.2、jsp脚本片段
                                                                   <%--jsp脚本片段--%> <%
                                                                      int sum = 0;
                                                                      for (int i = 1; i <=100 ; i++) {
                                                                        sum+=i;
                                                                      }
                                                                      out.println("

                                                                  Sum="+sum+"

                                                                  "); %>

                                                                  脚本片段的再实现

                                                                   <%
                                                                      int x = 10;
                                                                      out.println(x);
                                                                    %> 

                                                                  这是一个JSP文档

                                                                  <% int y = 2; out.println(y); %>
                                                                  <%--在代码嵌入HTML元素--%> <% for (int i = 0; i < 5; i++) { %>

                                                                  Hello,World <%=i%>

                                                                  <% } %>
                                                                  8.3.3、JSP声明
                                                                   <%!
                                                                      static {
                                                                        System.out.println("Loading Servlet!");
                                                                      }
                                                                      private int globalVar = 0;
                                                                      public void kuang(){
                                                                        System.out.println("进入了方法Kuang!");
                                                                      }
                                                                    %>

                                                                  JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到_jspService方法中!

                                                                  在JSP,嵌入Java代码即可!

                                                                  <%%><%=%><%!%><%--注释--%>

                                                                  JSP的注释,不会在客户端显示,HTML就会!

                                                                  8.4、JSP指令
                                                                  <%@page args.... %><%@include file=""%><%--@include会将两个页面合二为一--%><%@include file="common/header.jsp"%>

                                                                  网页主体

                                                                  <%@include file="common/footer.jsp"%>
                                                                  <%--jSP标签 jsp:include:拼接页面,本质还是三个 --%>

                                                                  网页主体

                                                                  8.5、9大内置对象
                                                                  • PageContext 存东西
                                                                  • Request 存东西
                                                                  • Response
                                                                  • Session 存东西
                                                                  • Application 【SerlvetContext】 存东西
                                                                  • config 【SerlvetConfig】
                                                                  • out
                                                                  • page ,不用了解
                                                                  • exception
                                                                    pageContext.setAttribute("name1","秦疆1号"); //保存的数据只在一个页面中有效
                                                                    ![img](https://img-blog.csdnimg.cn/img_convert/09db6bfaac550463bd30cba305906758.png)
                                                                    ![img](https://img-blog.csdnimg.cn/img_convert/9de380aae5c13d198c3b08df3eb17eed.png)
                                                                    ![img](https://img-blog.csdnimg.cn/img_convert/ee13d4a3796685c135831c789fd7b901.png)
                                                                    **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
                                                                    **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
                                                                    **[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
                                                                    **
                                                                    

                                                                    <%

                                                                    int x = 10;

                                                                    out.println(x);

                                                                    %>

                                                                    这是一个JSP文档

                                                                    <% int y = 2; out.println(y); %>

                                                                    <%–在代码嵌入HTML元素–%>

                                                                    <%

                                                                    for (int i = 0; i < 5; i++) {

                                                                    %>

                                                                    Hello,World <%=i%>

                                                                    <%

                                                                    }

                                                                    %>

                                                                    ##### 8.3.3、JSP声明
                                                                    

                                                                    <%!

                                                                    static {

                                                                    System.out.println(“Loading Servlet!”);

                                                                    }

                                                                    private int globalVar = 0;
                                                                    public void kuang(){
                                                                      System.out.println("进入了方法Kuang!");
                                                                    }
                                                                    

                                                                    %>

                                                                    JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到\_jspService方法中!
                                                                    在JSP,嵌入Java代码即可!
                                                                    

                                                                    <%%>

                                                                    <%=%>

                                                                    <%!%>

                                                                    <%–注释–%>

                                                                    JSP的注释,不会在客户端显示,HTML就会!
                                                                    #### 8.4、JSP指令
                                                                    

                                                                    <%@page args… %>

                                                                    <%@include file=“”%>

                                                                    <%–@include会将两个页面合二为一–%>

                                                                    <%@include file=“common/header.jsp”%>

                                                                    网页主体

                                                                    <%@include file=“common/footer.jsp”%>


                                                                    <%–jSP标签

                                                                    jsp:include:拼接页面,本质还是三个

                                                                    –%>

                                                                    网页主体

                                                                    #### 8.5、9大内置对象
                                                                    * PageContext 存东西
                                                                    * Request 存东西
                                                                    * Response
                                                                    * Session 存东西
                                                                    * Application 【SerlvetContext】 存东西
                                                                    * config 【SerlvetConfig】
                                                                    * out
                                                                    * page ,不用了解
                                                                    * exception
                                                                    

                                                                    pageContext.setAttribute(“name1”,“秦疆1号”); //保存的数据只在一个页面中有效

                                                                    [外链图片转存中…(img-iEXFT25n-1715032505766)]

                                                                    [外链图片转存中…(img-1Q8HEyWw-1715032505766)]

                                                                    [外链图片转存中…(img-diqdecA6-1715032505767)]

                                                                    既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

                                                                    由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

                                                                    需要这份系统化资料的朋友,可以戳这里获取