JavaWeb/Maven/JSP/

JavaWeb

1、基本概念

基本概念

web开发:

  • web,网页的意思
  • 静态web
    • html,css
    • 提供给所有人看的数据始终不会发生变化!
  • 动态web
    • 淘宝,几乎所有的网站都是动态
    • 提供给所有人看的数据始终会发生变化,每个人在不同时间看到的不相同!
    • 技术栈:Servlet/JSP,ASP,PHP

在java中,动态web资源开发的技术统称为javaweb

web应用程序

web应用程序:可以提供浏览器你访问的程序

image-20201014003224425

2、web服务器

2.1、技术讲解

ASP:

  • 微软:国内最早流行的就是ASP;
  • 在HTML中嵌入了VB的脚本,ASP + COM;
  • 在ASP 开发中,基本一个页面都有几千行的业务代码,页面极其混乱
  • 维护成本高!
  • C#
  • IIS
<h1>
    <%
    System.out.println("hello")
	%>    
    
<h1>

php:

  • php开发速度很快,功能很强大,跨平台,代码很简单
  • 无法承载大访问量的情况

JSP/Servlet:

  • sun公司主推的 B/S 架构
  • 基于Java语言的
  • 可以承载三高问题带来的影响,高并发,高可用,高性能
  • 语法想ASP

......

2.2、web服务器

静态服务:主要提供静态资源,不同用户访问到的资源相同
动态服务:提供动态服务,不同用户访问到的资源不同
服务器的几个叫法:
web服务器:广义上来说,就是响应用户的需求,提供服务,当下所有的服务器软件都可以称之为web服务器软件
HTTP服务器(静态服务):使用HTTP协议传输资源,提供服务
应用服务器(动态服务):一个特定应用的承载容器
常见的轻量级服务器软件:
1、Nginx:典型的静态服务器,可做反向代理、负载均衡,一般放在最前面直面用户,和后端Tomcat打配合;纯C写的,性能贼高、内存消耗极少、稳定性也相当好,互联网公司重度使用
2、Tengine:阿里出品,基于Nginx服务器做的改造(加强和封装),对大流量场景做了很多高级功能,性能、稳定性优秀
3、Apache http server:也是静态服务器,但是不如Nginx
3、IIS:微软开发,只能用在Windows下,具有应用服务器能力的http服务器
4、Tomcat:Apache出品,典型的应用服务器软件,符合Servlet标准的应用容器,也可以提供http服务,但一般不会作为http服务器;是Spring Boot框架默认的内置服务器
5、Jetty:跟Tomcat是一个性质的东西,比Tomcat更加轻量一些,符合Servlet标准的应用容器,也是Spring Boot框架支持的服务器,但不是默认的
6、Undertow:红帽子出品,跟Tomcat、Jetty一样也是Spring Boot框架支持的服务器,但不是默认的;高并发时性能优于Tomcat、Jetty
几款商用重量级的服务器软件:
1、JBoss(从8版开始更名为 WildFly):不仅是Servlet应用容器,更是EJB的应用容器,整套JavaEE框架部署的解决方案(EJB时代。)
2、WebLogic:Oracle公司出品,用于部署企业级JavaEE应用,全能型,几乎支持JavaEE所有的应用规范
3、WebSphere:IBM公司出品,支持更多JavaEE的应用规范的综合应用服务器

服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息;

Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0.37

... ...

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

下载tamcat:

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

3、Tomcat服务器

3.1、安装Tomcat

image-20201014005752512

3.2、tomcat启动、配置

image-20201014201429524

启动:startup.bat

停止:shutdown.bat

配置

HTTP协议:面试

Maven:构建工具

  • Maven安装包

Servlet入门

  • HelloWorld
  • Servlet配置
  • 原理

3-1、JBoss服务器

安装JBoss

启动、配置

4、Http

4.1、什么是HTTP

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

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

Https:安全的

  • 443端口

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
Status Code: 200 OK
Remote Address: 36.152.44.95:443
Referrer Policy: unsafe-url

1、请求行

  • 请求行中的请求方式:GET
  • 请求方式:Get,Post,HEAD,DELETE,PUT,TRACT。。。。
    • get:请求参数比较少,大小有限制,显式显示,不安全,高效
    • post:参数没有限制,大小无显式,不会显示数据内容,安全,但不高效

2、消息头

  • Request Headers
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Cookie: 
Host: www.baidu.com
Referer: https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=02003390_25_hao_pg&wd=tomcat%20startup%20%E4%B9%B1%E7%A0%81&oq=cmd%2520%25E4%25B8%258D%25E6%2598%25BE%25E7%25A4%25BA%25E4%25B8%25AD%25E6%2596%2587&rsv_pq=da753c370000a01e&rsv_t=6835bLC9zbaSP%2BcVCGxnVa57qua6qwwc1g8cuGpq2YJDd9Wd%2FO1hwrn%2B8hR4Qlg6%2B%2BtzES5vNmjv&rqlang=cn&rsv_enter=1&rsv_dl=ts_9&rsv_sug3=16&rsv_sug1=15&rsv_sug7=100&rsv_sug2=1&rsv_btype=t&prefixsug=tomcat%2520startup%2520&rsp=9&inputT=8763&rsv_sug4=8764
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36

4.4、http响应

  • 服务器 -> 响应(request) -> 客户端
  • Response Headers
Bdpagetype: 2
Bdqid: 0xc2c3c159000033c1
Cache-Control: private           //缓存控制
Connection: keep-alive           //连接
Content-Encoding: gzip           //编码
Content-Type: text/html;charset=utf-8   //类型
Date: Wed, 14 Oct 2020 12:51:11 GMT
Expires: Wed, 14 Oct 2020 12:51:10 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=134; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=32617_1433_32844_7566_31253_32723_32230_7516_7605_32116; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1602679871073634970614034273451812860865
Transfer-Encoding: chunked
X-Ua-Compatible: IE=Edge,chrome=1

1、响应体

Accept:
Accept-Encoding:
Accept-Language:
Cache-Control:
Connection:
HOST:
Refresh:			//多久就刷新一次
Location:

2、响应状态码

200:成功

3xx:请求重定向

4xx:找不到资源

  • 404:找不到资源

5xx:服务器代码错误

  • 500:
  • 502:网关错误

5、Maven

为什么学习这个?

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

5.1、Maven项目架构管理工具

5.2、下载安装Maven

去官网

5.3、配置环境变量

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

启动测试

mvn -version

5.4、阿里云镜像

  • 镜像:mirrors
    • 作用:加速我们的下载
  • 国内建议使用阿里云的镜像

配置

<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

哪个能用用哪里吧

<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>Nexus aliyun</name>
  <url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

image-20201014231205456

5.5、本地仓库

配置

<localRepository>E:Environmentapache-maven-3.6.3maven-repo</localRepository>

5.6、在IDEA中配置Maven

  1. 启动idea
  2. 创建一个maven项目

image-20201014221843792

image-20201014221952152

image-20201014222037022

image-20201014222745909

4.观察 maven 仓库中多了什么东西

image-20201014223112156

image-20201014223554882

6.到这里,maven在idea中的配置和使用就OK了

5.7、创建一个普通的maven项目

不勾选 maven 模板

image-20201014224118445

这是一个干净的项目

image-20201014224031174

这是只有在 maven web 模板下的项目

image-20201014224319025

5.8、 标记文件夹功能

方法一:

image-20201014224823043

方法二:

image-20201014225224131

5.9、idea配置tomcat

image-20201014225456938

image-20201015204704765

太难了,自己摸索。。。

tomcat乱码

image-20201018040711610

添加:

-Dfile.encoding=UTF-8

sout乱码

VM options 设置为 -Dfile.encoding=UTF-8 ,重启tomcat

image-20201018041749931

5.10 、pom文件

pom.xml是 Maven的核心文件

https://blog.csdn.net/qq_33363618/article/details/79438044

5.11、IDEA操作问题

5.12、解决遇到的问题

项目导出资源有问题是,配置 pom.xml 中寻找配置方案

pom.xml

//建立项目的一些配置
<build>
    // plugins 的配置
    <plugins>
        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
            <version>6.1.7</version>
            <configuration>
                <connectors>
                    <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                        <port>8888</port>
                        <maxIdleTime>30000</maxIdleTime>
                    </connector>
                </connectors>
                <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}
                </webAppSourceDirectory>
                <contextPath>/</contextPath>
            </configuration>
        </plugin>
    </plugins>
	// resources 的配置
    <resources>
        <resource>
            // 项目启动时会 导出 properties 和 xml 后缀相关的配置
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build>

6、Servlet

6.1、Servlet简介

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

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

6.2、HelloServlet

Servlet接口sun公司有两个默认的实现类:HttpServlet,

  1. 构建一个普通的Maven项目,删掉里面的src目录,以后我们学习就在这个项目里建立Moudel;这个空的工程就是Maven主工程;

  2. 关于Maven父子工程的理解:

    父项目中会有

        <name>javaweb-01-maven</name>
        <modules>
            <module>servlet-01</module>
        </modules>
    
    

    子项目中会有

        <parent>
            <artifactId>javaweb-01-maven</artifactId>
            <groupId>com.kutsu</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
    

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

    son extends father
    
  3. Maven 环境优化

    1. 修改 web.xml 为最新的
    2. 将maven的结构搭建完整
  4. 编写一个Servlet程序

    1. 编写一个普通类

    2. 实现Servlet接口,这里我们直接继承 HttpServlet

      public class HelloServlet extends HttpServlet {
      
          //由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              System.out.println("进入doGet方法ssss");
              resp.setCharacterEncoding("UTF-8");
              PrintWriter writer = resp.getWriter();
              writer.write("hellowrold");
              writer.write("<div >你好<div>");
          }
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              super.doPost(req, resp);
          }
      }
      
  5. 编写Servlet的映射

    为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需给他一个浏览器访问的路径

        <servlet>
            <servlet-name>hello1</servlet-name>
            <servlet-class>com.qq.servlet.HelloServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>hello1</servlet-name>
            <url-pattern>/he1</url-pattern>
        </servlet-mapping>
    
  6. 配置tomcat

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

  7. 启动测试

6.3、Servlet原理

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

image-20201016011906318

6.4、Mapping问题

  1. 一个Servlet可以指定一个映射路径

  2. 一个Servlet可以指定多个映射路径

  3. 一个Servlet可以指定通用映射路径

  4. 一个Servlet可以指定一个映射路径

  5. 指定一些后缀或者前缀等等....

  6. 优先级问题

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

6.5、ServletContext

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

以后会使用一下功能替代 context

  • 共享数据:Sesion、request的一些方法 替代 context

  • 获取web.xml 中的数据:几乎不用

  • 请求转发:request

  • 读取资源文件:类加载、反射

1、共享数据

image-20201016020827215

2、初始化参数web.xml中获取

public class mybatis extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入doGet方法ssss");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html");

        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        resp.getWriter().print(url);

    }
}
    <servlet>
        <servlet-name>hello2</servlet-name>
        <servlet-class>com.qq.servlet.mybatis</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello2</servlet-name>
        <url-pattern>/gp</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param>

3、请求转发

请求转发一般不用getServletContext做

用request做

public class HelloServlet extends HttpServlet {

//由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext context = this.getServletContext();
    System.out.println("进入servlet");
    context.getRequestDispatcher("/gp").forward(req,resp);
    }
}

4、读取资源文件

使用了 Properties 类

Properties

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

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

思路:需要一个文件流

image-20201017172447549

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties prop = new Properties();
        prop.load(is);
        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");
        resp.getWriter().print(user + ":" + pwd);

    }

测试即可 ok。

6.6、HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的httpServletRequest对象,代表响应的一个 HttpServletResponse;

  • 如果要获取客户端请求过来的参数:找 httpServletRequest
  • 如果要给客户端响应一些信息:找 HttpServletResponse

HttpServletResponse 源码结构展示:

image-20201017174040915

1、简单分类

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

ServletOutputStream getOutputStream() throws IOException;
    
PrintWriter getWriter() throws IOExeption;

2、常见应用

  1. 向浏览器输出消息(一直在讲,就不说了)
  2. 下载文件
    • 1、要获取下载文件的路径
    • 2、下载的文件名是啥?
    • 3、设置 想办法让浏览器能够下载我们需要的东西
    • 4、获取下载文件的输入流
    • 5、创建缓冲区
    • 6、获取 OutputStream 对象
    • 7、将FileOutputStream流写入到 buffer 缓冲区
    • 8、使用 OutputStream 将缓冲区中的数据输出到客户端
package com.qq.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

public class downfile extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        String filepath = "E:\code\Javaweb\javaweb-01-maven\servlet-01\src\main\resources\logo十一子.png";
        String filename = filepath.substring(filepath.lastIndexOf("\") + 1);

        resp.setHeader("Content-Disposition","attachment; filename="+ URLEncoder.encode(filename,"UTF-8"));

        FileInputStream in = new FileInputStream(filepath);

        int len=0;
        byte[] buffer = new byte[1024];

        ServletOutputStream out = resp.getOutputStream();

        while ((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        in.close();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

网页中请求这个类就可以下载了。

3、验证码功能

生成随机数图片

package com.qq.servlet;

import com.sun.prism.PresentableState;

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, 80, BufferedImage.TYPE_INT_BGR);
        //得到图片
        Graphics g  = image.getGraphics();//笔
        //设置图片的背景颜色
        g.setColor(Color.CYAN);
        g.fillRect(0,0,80,50);

        //给图片写数据
        g.setColor(Color.RED);
        g.setFont(new Font(null, Font.BOLD,20));
        g.drawString(makeNum(),1,20);                                                
        
        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/png");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("exires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");

        //把图片写给浏览器
        ImageIO.write(image,"png",resp.getOutputStream());

    }
    //生成随机数
    String makeNum(){
        Random random = new Random();
        String  num = random.nextInt(99999) + "";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 7-num.length(); i++) {
            sb.append("0");
        }
        num = sb.toString() + num;
        return num;
    }
}

4、实现重定向(重点)

image-20201017185435296

B一个web资源受到客户端A请求后,B他会通知A客户端去访问C获取资源

web注册请求路径,login

image-20201017193059032

测试前端画面,要引入 jsp 包,点击submit之后,请求 login 页面路径

image-20201017192852915

login 请求页面,进行 重定向 资源 success.jsp 页面

resp.sendRedirect("/r/success.jsp");

image-20201017192809843

success.jsp 资源

image-20201017193340345

测试:访问 ss11 项目 根 网站,就ok。

http://localhost:8080/ss11/

6.7、HttpServletRequest

HttpServletRequest 代表客户端的请求,用户通过Http

image-20201017200551938

req.getRequestDispatcher("").forward(req,resp);

面试题:请你聊聊重定向和转发的区别?

相同点

  • 页面都会实现跳转

不同点

  • 请求转发的时候,utl不会产生变化 307
  • 重定向时候,url地址栏会发生变化 302

7、Cookie、Session

cookie:饼干

session:会话

7.1、会话

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

有状态会话

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

  1. 服务器给客户端 cookie
  2. 服务器记录客户端记录 session

下面写错了:ApplicationContext

image-20201018005550851

7.2、保存会话的两种技术

cookie

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

session

  • 服务器技术

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

7.3、Cookie(重点)

例子:实现记录客户最后一次登录 时间

package com.kutsu;

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 servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器,告诉你,你来的时间,把这个时间封装称为一个信件。
        //你来过来,我就知道是你了

        //解决中文乱码
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("application/javascript; charset=utf-8");

        PrintWriter out = resp.getWriter();

        //cookie,服务器从弄个客户端获取呀;
        Cookie[] cookies = req.getCookies();

        //判断cookie是否存在
        if (cookies != null) {
            //如果存在,怎么搞
            out.write("上次访问的时间是");

            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字
                if (cookie.getName().equals("lastLoginTime") ) {
                    //获取cookie中的值
                    long lasttime = Long.parseLong(cookie.getValue());
                    Date dade =new Date(lasttime);
                    out.write(dade.toLocaleString());
                }
            }
        }else {
            out.write("这是第一次访问");
        }

        //服务给 客户端 响应一个 cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis() + "");

        //设置有效期 24分钟
        cookie.setMaxAge(24*60);
        resp.addCookie(cookie);
    }
}


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

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

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

删除cookie:

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

编码解码

URLEncoder.encode("打点滴","utf-8")
URLDecoder.decode(cookie.getValue(),"utf-8")

7.4、Session(重点)

什么是Session:

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

Session 和 Cookie 的区别

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

使用场景:

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

设置session

public class CookieDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器,告诉你,你来的时间,把这个时间封装称为一个信件。
        //你来过来,我就知道是你了

        //解决中文乱码
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("application/javascript; charset=utf-8");

        HttpSession session = req.getSession();
        session.setAttribute("name","this is string session");
        String id = session.getId();

        resp.getWriter().write("session id="+id);
    }
}

注销session

HttpSession session = req.getSession();
session.invalidate();

web.xml 设置 session 过期时间

<session>
    <!--15分钟后 session 自动失效,以分钟为单位-->
    <session-timeout>15</session-timeout>
</session>

8、JSP

8.1、什么是JSP

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

最大的特点:

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

8.2、JSP原理

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

  • 代码层面没有任何问题

  • 服务器内部工作

    1、tomcat中有一个 work目录

    E:Environmentapache-tomcat-9.0.39workCatalinalocalhostROOTorgapachejsp

    image-20201018010628771

    image-20201018011326591

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

    win10可能在这个目录下

    image-20201018011157451

    image-20201018011343239

    win7 可能在这个目录下

    image-20201018012510253

    C:UsersAdministrator.SmartTomcatjavaweb-01-mavenjava-session-cookieworkCatalinalocalhostROOTorgapachejsp
    

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

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

JSP本质上就是一个Servlet

image-20201018012837107

1.判断请求

2.内置一些对象

final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;

image-20201018013002302

类比

image-20201018013107708

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;

image-20201018013143425

4.以上的这些个对象我们可以在JSP页面中直接使用!

image-20201018013733403

在JSP页面中

只要是Java代码就会原封不动输出

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

image-20201018015313361

这样的格式,输出到前端

8.3、JSP基础语法

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

jsp表达式:<%=变量或表达式>

方法一:
<%= new java.util.Date() %>

简写:
${=new java.util.Date()}

jsp脚本片段:

<%
  int sum=0;
  for (int i = 0; i < sum; i++) {
    sum+=i;
  }
  out.print(sum);
%>

JSP声明:

!

<%!
    static {
    System.out.println("loading");
}

private int mmm=0;
public void mmmss(){
    System.out.println("jinru  rr");
}
%>

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

在JSP,嵌入java代码即可!

8.4、JSP指令

<%@ page %>

<%@ page />

<%@ include %>

<%@ include file="/common/header.jsp"/>
<h1>网页主体</h1>
<%@ include file="/common/header.jsp"/>

会将 @ 的页面本页面 ,两个页面合二为一。

8.5、JSP标签

<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/header.jsp"/>

会将 include 的页面本页面 ,两个页面拼接。

8.6、9大内置对象

  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application【ServletContexe】 存东西
  • config【ServletConfig】
  • out
  • page
  • exception
<%
//保存数据只在一个页面中有效
pageContext.setAttribute("name1","测试1");

//保存数据只在一次请求中有效,请求转发会携带这个数据
request.setAttribute("name2","测试2");

//保存数据只在一个会话中有效,从打开浏览器到关闭浏览器
session.setAttribute("name3","测试3");

//保存数据只在服务器中有效,从打开服务器到关闭服务器
application.setAttribute("name4","测试4");
%>

//使用 EL 表达式输出 ${}
<h1>取出值为</h1>
    <h2>${name1}</h2>

8.7、JSP标签、JSTL标签、EL表达式

导入包:

<!-- JSTL 表达式 依赖 -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
</dependency>
<!-- standard 标签库 -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

注意:Tomcat服务器也需要导入 这两个包

JSP标签

  • jsp:forward
  • jsp:param

image-20201018173015660

JSTL表达式

JSTL标签库的使用就是为了弥补 HTML 标签的不足;它自定义许多标签,可以供我们使用,标签的功能和java代码一样!

核心标签(掌握部分)

引用核心标签库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

image-20201018174429077

例子:c-if

image-20201018175339177

例子:c:set

image-20201018175704138

例子:c:forEach

image-20201018175856185

格式化标签

引用格式化标签库

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

SQL标签

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

XML 标签

<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

JSTL函数

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

9、JavaBean

实体类

JavaBean有特定的写法:

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的get、set方法

一般用来和数据库的字段做映射 ORM;

ORM:对象关系映射

  • 表 --> 类
  • 字段 --> 属性
  • 行记录 --> 对象

image-20201018181348693

10、MVC三层架构

什么是MVC?:

Model:模型

View:视图

  • 展示数据模型
  • 提供可以供我们操作的请求

Controller:控制器

  • 接收用户的请求
  • 响应给客户端内容(交给业务层去做)
  • 重定向、转发

10.1、早些年2层结构

image-20201018053946947

用户直接访问控制层,控制层就可以直接操作数据库;

servlet --> CRUD --> 数据库

弊端:程序十分臃肿,不利于维护

servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码

架构:没有什么是加一层解决不了的!

10.2、mvc三层架构

image-20201018054747233

Model:

  • 业务处理:业务逻辑(service)
  • 数据持久层:CRUD(Dao)

View:视图

  • 展示数据
  • 提供链接发起Servlt请求(a,form,img。。。)

Controller:控制器(Servlet)

  • 接收用户的请求:(req:请求参数,Session信息。。。)

  • 交给业务层处理对应的代码

  • 控制视图的跳转

    登录 -->>  接收用户的登录请求 -->>  处理用户的请求(获取用户登录的参数,username,password) -->>  交给业务层处理登录业务(判断用户名密码是否正确:事务) -->>  Dao层查询用户名和密码是否正确 -->>  数据库
    

11、Filter

Filter:过滤器,,用来过滤网站的数据

  • 处理中文乱码
  • 登录验证

image-20201018055839466

Filter

web.xml配置

<filter>
    <filter-name>filter1</filter-name>
    <filter-class>com.kutsu.filter.CharachterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>/ser/*</url-pattern>
</filter-mapping>

image-20201018185423884

过滤器实现

image-20201018185508766

12、监听器

原文地址:https://www.cnblogs.com/kutsu/p/13848530.html