JavaWeb学习记录

JavaWeb学习记录

参考网课:哔哩哔哩_bilibili

JavaWeb基本介绍

什么是JavaWeb?

  • Web:全球广域网,也称为万维网(WWW),能够通过浏览器访问的网站

  • JavaWeb:是用Java技术来解决相关web互联网领域的技术栈

Maven

Maven全称Apache Maven,是一个项目管理和构建工具,它基于项目对象模型(Project Object Model)的概念,通过一小段描述信息来管理项目的构建、报告和文档。其主要功能包括:

  • 提供了一套标准化的项目结构
  • 提供了一套标准化的构建流程(编译、测试、打包、发布)
  • 提供了一套依赖管理机制

有了Maven,项目就可以和特定的IDE解藕,在哪都可以用!

Maven有三个仓库:本地仓库、中央仓库、远程仓库。

  • 本地仓库:自己计算机上的一个目录
  • 中央仓库:由Maven团队维护的全球唯一的仓库
  • 远程仓库(私服):由公司搭建的私有仓库,一般建立的时候会和中央仓库同步,比如阿里的私库。由于一些特殊原因,国内可能用远程仓库会比直接和中央仓库通信快得多。

前端部分(先跳过,之后再看)

HTML

主要总结一下常用标签。

Vue

  • Vue是一套前端框架,免除原生JavaScript中的DOM操作,简化书写。
  • 基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。(可以实现MVC架构下无法做到的模型到视图之间的双向绑定。)
  • 官网:https://cn.vuejs.org

快速入门

  1. 新建HTML页面,引入Vue.js文件(需要下好vue.js)
<script src="js/vue.js"></script>
  1. 在JS代码区域,创建Vue核心对象,进行数据绑定
new Vue({
el:"#app",
data(){
return {
username:""
}
}
})
  1. 编写视图
<div id="app">
<input name="username" v-model="username">
<!--插值表达式-->
{{username}}
</div>

常用指令

  • v-bind: 为HTML标签绑定属性值,如设置href, css样式等

    <a v-bind:href="url">百度一下</a>
    <!--也可以省略v-bind-->
    <a :href="url">百度一下</a>
  • v-model: 为表单元素上创建双向数据绑定

    <input name="username" v-model="username">
  • v-on: 为HTML标签绑定事件

    <input type="button" v-on:click="show()">
    <!--简化版-->
    <input type="button" @click="show()">

    show()方法应写在Vue的method部分中

  • v-if, v-else, v-else-if: 条件性的渲染某元素,判定为true时渲染,否则不渲染

    <div v-if="count == 3">
    div1
    </div>
    <div v-else-if="count == 2">
    div2
    </div>
    <div v-else="count == 1">
    div3
    </div>
  • v-show: 根据条件展示某元素,区别在于切换的是display属性的值。

    <div v-show="count == 3">
    div4
    </div>
  • v-for: 列表渲染,遍历容器的元素或者对象的属性

    <div v-for="addr in addrs">
    {{addr}}<br>
    </div>
    <!--加索引-->
    <div v-for="(add, i) in addrs">
    <!--i 表示索引,从0开始-->
    {{i + 1}} : {{addr}} <br>
    </div>

生命周期

未完待续。。。

后段部分

JavaWeb架构

  • B/S架构:Browser/Server,浏览器/服务器 架构模式。它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可。
    • 好处:易于维护升级;服务器端升级后,客户端无需任何部署就可以使用到新的版本。
  • 静态资源:HTML、CSS、JavaScript、图片等。负责页面展示。
  • 动态资源:Servlet、JSP等。负责逻辑处理。
  • 数据库:负责存储数据。
  • HTTP协议:定义通信规则。
  • Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据。(Apache Tomcat就是最常用的轻量级Web服务器)

image-20230811185207161

HTTP协议

概念:HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。

HTTP协议特点:

  • 基于TCP协议:面向连接,可靠传输
  • 基于请求-响应模型的:一次请求对应一次响应
  • HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
    • 缺点:多次请求不能共享数据。Java中会使用会话技术(Cookie、Session)来解决这个问题。
    • 优点:速度快

HTTP-请求数据格式

以下图为例子:

image-20230811190349162

  • 请求数据分为三部分:

    1. 请求行:请求数据的第一行。以上图为例,GET表示请求方式,/表示请求资源路径,HTTP/1.1表示协议版本。
    2. 请求头:第二行开始,格式为key: value形式。
    3. 请求体:(GET方法无,因为GET方法的数据放在url里)POST请求的最后一部分,存放请求参数。
  • 常见的HTTP请求头:

    • Host:表示请求的主机名
    • User-Agent:浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0、Chrome/79等,IE浏览器的标识类似Mozilla/5.0等。
    • Accept:表示浏览器能接收的资源类型,如text/,image/或者*/*表示所有。
    • Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页。
    • Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip,deflate等。
    • Cache-Control:请求和响应中缓存机制的指令。
    • Connection:控制当前事务完成后网络是否保持打开状态。
  • GET请求和POST请求的区别:

    • GET请求的请求参数在请求行中,没有请求体。(应该在资源路径那儿,之后可求证一下)。POST请求的请求参数在请求体中。
    • GET请求的请求参数大小有限制(因为url长度本身就是有限制的),POST则没有限制。

HTTP-响应数据格式

image-20230811192105685

  • 响应数据分为3部分:

    • 响应行:响应数据的第一行。以上图为例,其中HTTP/1.1表示协议版本,200表示响应状态码,OK表示状态码描述。
    • 响应头:第二行开始,格式为key: value形式。
    • 响应体:最后一部分,存放响应数据。
  • 常见的HTTP响应头:

    • Content-type:表示该响应内容的类型,例如text/html, image/jpeg;
    • Content-Length:表示该响应内容的长度(字节数);
    • Content-Encoding:表示该响应的压缩算法,例如gzip;
    • Cache-Control:指示客户端应如何缓存,例如max-age=300表示最多可以缓存300秒;

HTTP状态码总结

参考HTTP 状态码 | 菜鸟教程 (runoob.com)

Web服务器

Web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是“提供网上信息浏览服务”

有了Web服务器,就可以关注于业务的开发,不必自己去写HTTP请求的解析与响应的返回(避开Socket编程)!!(最常用的就是Tomcat!)

Tomcat

  • 概念:Tomcat是Apache软件基金会的一个核心项目,死一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。
  • JavaEE:Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范综合。包括13项技术规范:JDBC、JNDI、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JavaMail、JAF
  • Tomcat也被称为Web容器、Servlet容器。Servlet需要依赖于Tomcat才能运行。

image-20230812000027488

Tomcat的配置文件:conf文件夹下的server.xml。(可修改端口号为80,因为80为HTTP协议的默认端口号,所以修改后将来访问Tomcat时,可以不用输入端口号。)

IDEA中的Maven Web项目

  • 项目结构:(Maven web需要打包为war包,所以需要在pom.xml中加入war,否则默认为jar包)

image-20230812002814188

  • 记录一下不使用骨架的Maven web项目创建方式,之前学习MVC的时候纯粹瞎琢磨。。

image-20230812003741725

  • Tomcat启动方式:

    • 原生方式麻烦不介绍。

    • 集成在IDEA中。

      image-20230812004916109

    • 通过Tomcat的Maven插件:

      <!--注意!要先在IDEA中下载Maven Helper插件才可以使用这个功能-->
      <build>
      <plugins>
      <!--Tomcat插件-->
      <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.2</version>
      <!--还可以额外配置configuration-->
      <configuration>
      <port>80</port><!--访问端口号-->
      <path>/</path><!--项目访问路径-->
      </configuration>
      </plugin>
      </plugins>
      </build>

image-20230812004735499

Servlet

  • Servlet是Java提供的一门动态web资源开发技术。(比起静态资源,JavaWeb开发更聚焦于动态资源)
  • Servlet是JavaEE规范之一,其实就是一个借口,将来我们需要定义Servlet类实现Servlet接口,并由Web服务器运行Servlet。

快速入门

image-20230812123847449

执行流程

image-20230812115721651

生命周期

image-20230812121411983

方法介绍

Servlet作为一个接口有数个必须要重写的方法:

//Servlet的生命周期:从Servlet被创建到Servlet被销毁的过程
//一次创建,到处服务
//一个Servlet只会有一个对象,服务所有的请求
/*
* 1.实例化(使用构造方法创建对象)
* 2.初始化 执行init方法
* 3.服务 执行service方法
* 4.销毁 执行destroy方法
*/
public class ServletDemo1 implements Servlet {
//public ServletDemo1(){}
//生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
public void init(ServletConfig arg0) throws ServletException {
System.out.println("=======init=========");
}
//生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("hehe");
}
//生命周期方法:当Servlet被销毁时执行该方法
public void destroy() {
System.out.println("******destroy**********");
}
//当停止tomcat时也就销毁的servlet,相当于断开电源,不会调用destroy
//返回Servlet相关的Config
public ServletConfig getServletConfig() {
return null;
}
//返回Servlet相关的信息
public String getServletInfo() {
return null;
}
}

体系结构(HttpServlet)

Servlet作为一个接口,当我们去实现它的时候必须要重写它的方法,这非常的麻烦。但是通过去继承一些已经封装好的并且实现好Servlet接口的类,可以省去这些麻烦!

@WebServlet("/demo4")
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//业务逻辑可以写在这里
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//业务逻辑可以写在这里
}
}

HttpServlet继承自GenericServlet,GenericServlet实现了Servlet接口,其调用逻辑在HttpServlet中重写了Service方法,先去判断请求的方法是Get还是Post,然后再调用doGet方法或者doPost方法完成逻辑。因此,我们实际上只需要关注doGet和doPost方法中的业务逻辑即可!

Servlet urlPattern配置

Servlet的urlPattern配置方式有多种,下图总结了一下:

image-20230812154927343

注意:

任意匹配的"/"会覆盖tomcat中的DefaultServlet是http://localhost:8080/项目名称 会直接触发当前定义的servlet而不会走tomcat默认的了,如果我们有定义index.jsp,那么index.jsp就永远无法被访问了。

XML配置Servlet(注解开发)

Servlet从3.0版本后,可以直接在.xml配置文件中注册和关联servlet:

<!--便于统一管理,SpringMVC也是这样配置-->
<servlet>
<servlet-name>demo5</servlet-name>
<servlet-class>com.itheima.web.servlet.ServletDemo5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo5</servlet-name>
<url-pattern>/demo5</url-pattern>
</servlet-mapping>

Request & Response

Request
【继承体系】

image-20230812163418667

当请求从浏览器抵达web服务器的时候,Tomcat首先会解析请求,并封装起来(RequestFacade类,实现了HttpServletRequest接口),创建后request对象后传递到service方法中。

我们实际使用的时候只要看JavaEE API文档的HttpServletRequest接口就行。

【获取请求数据】
  • Request获取请求数据分为三部分:
    1. 请求行:GET /request-demo/req1?username=zhangsan&password=123 HTTP/1.1
      • String getMethod():获取请求方式:GET
      • String getContextPath():获取虚拟目录(项目访问路径):/request-demo
      • StringBuffer getRequestURL():获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
      • String getRequestURI:获取URI(统一资源标识符):/request-demo/req1
      • String getQueryString():获取请求参数(GET方式):username=zhangsan&password=123
    2. 请求头:
      • String getHeader(String name):根据请求头名称,获取值
    3. 请求体
      • ServletInputStream getInputStream():获取字节输入流
      • BufferedReader getReader():获取字符输入流
【获取请求参数的通用方法】

从上面的方法可以看出,GET和POST方法获取请求参数的方法不仅不同,且只能以String的方式返回。在实际开发中,我们可能更希望能返回成一个Map。Luckily,别人已经帮我们写好了,可以直接使用:

  1. Map<Stirng, String[]> getParameterMap():获取所有参数Map集合
  2. String[] getParameterValues(String name):根据名称获取参数值(数组)。注意,因为可能会出现一个name多个value的情况,所以这个方法是很有必要的。
  3. String getParameter(String name):根据名称获取参数值。如果有多次出现,则返回第一个。
【乱码问题】

当参数存在中文的时候会出现乱码问题,以下为解决方案:

  • POST
//POST方式出现乱码本质上是读取字符流的时候编码方式错了,所以只需要设置一下字符输入流的编码格式
//改成UTF-8就可以了
request.setCharacterEncoding("UTF-8");
  • GET

GET的乱码问题更为复杂,其流程如下:

image-20230812213342753

浏览器虽然对URL是用UTF-8进行编码的,但是在Tomcat8之前Tomcat默认使用ISO-8859-1进行解码,这才导致我们会看到乱码。由于Tomcat本身并不支持配置解码格式,因此我们必须通过一种间接手段来解决乱码问题:

  1. 由于传输的字节码是固定的,所以我们可以先把解码后的数据返回为字节流;
  2. 用UTF-8重新对字节流进行编码;
//1. 首先将收到的数据返回为字节流(这里的数据为username)
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//2. 字节流转化为字符串
username = new String(bytes, StandardCharsets.UTF_8);

不过我用的是Tomcat8,可高枕无忧矣!

【请求转发】

转发(forward)是一种在服务器内部的资源跳转方式。

其特点包括:

  • 浏览器地址路径不发生变化
  • 只能转发到当前服务器的内部资源
  • 一次请求,可以在转发的资源间使用request共享数据

image-20230812223613877

实现方式:

//请求转发
request.getRequestDispatcher("资源路径B").forward(request, response);

请求转发资源间共享数据:使用request对象下的方法:

  • void setAttribute(String name, Object o):存储数据到request域中
  • Object getAttribute(String name):根据name,获取值
  • void removeAttribute(String name):根据key,删除该键值对
Response
【继承体系】

image-20230812235853103

和Request差不多。

【设置响应数据】
  • Response设置数据分为三部分:
  1. 响应行:HTTP/1.1 200 OK
    • void setStatus(int sc):设置响应状态码
  2. 响应头:
    • void setHeader(String name, String value):设置响应头键值对
  3. 响应体
    • PrintWriter getWriter():获取字符输出流
    • ServletOutputStream getOutputStream():获取字节输出流
【重定向】

重定向(Redirect)是一种资源跳转方式。

其特点包括:

  • 浏览器地址栏路径发生变化
  • 可以重定向到任意位置的资源(服务器内部、外部均可
  • 两次请求,不能在多个资源使用使用request共享数据

image-20230813000644040

实现方式:

//可以直接使用Response的sendRedirect()函数进行重定向
response.sendRedirect("资源B的路径");
//其底层逻辑为包括两件事:
//1. 设置状态码
//response.setStatus(302);
//2. 设置响应头的location
//response.setHeader(“资源B的路径”)
【设置响应体字符&字节数据】
  • 设置字符数据
//为了让浏览器能够根据html标签进行渲染,需要设置content-type,同时设置编码格式防止乱码(浏览器是UTF-8,而Tomcat8以前默认ISO-8859-1)。
response.setContentType("text/html;charset=utf-8");
//1. 获取字符输出流
PrintWriter writer = response.getWriter();
//2. 输出数据
writer.write("你好");
writer.write("<h1>aaa</h1>");
  • 设置字节数据
//以.jpg文件举例
//1. 读取文件
FileInputStream fis = new FileInputStream("d://a.jpg");
//2. 获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
byte[] buff = new byte[1024];
int len = 0;
while((len = fis.read(buff)) != -1){
os.write(buff, 0, len);
}
fis.close();

JSP

  • Java Server Pages, Java服务端页面。
  • 一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容。
  • JSP = HTML + Java

JSP准备工作&原理

  1. Maven导入JSP坐标
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
  1. 创建JSP文件

​ 直接在Idea中右键选择JSP/JSPX

  1. 编写HTML标签和Java代码

JSP原理

JSP本质上就是一个Servlet,在Tomcat内部会被转换成一个类。其实就是通过Writer把对应结果写在响应体中然后返回给浏览器罢了。

重点在于JSP的存在简化了开发的步骤,让我们可以专注于业务逻辑而不用浪费时间在额外的重复操作上。

image-20230813112139156

JSP脚本

  • JSP脚本用于在JSP页面上定义Java代码。

  • JSP脚本分类:

    1. <%...%>:内容会直接放到_jspService()方法之中
    2. <%=...%>:内容会放到out.print()中,作为out.print()的参数
    3. <%!...%>:内容会放到_jspService()方法之外,被类直接包含

(JSP中java代码块可以截断,不过现在用的貌似不多且可读性极差,先不记录)

JSP缺点

。。书写麻烦、阅读麻烦、复杂、占内存和磁盘、调试困难、团队协作困难等等等等等。

全部白雪!

image-20230813123110421

EL技术

  • Expression Language 表达式语言,用于简化JSP页面内的Java代码。
  • 主要功能:获取数据
  • 语法:$
    • 比如${brands}用于获取域中存储的key为brands的数据。
  • JavaWeb中有四大域对象:
    1. page:当前页面有效
    2. request:当前请求有效
    3. session:当前会话有效
    4. application:当前应用有效

EL表达式获取数据的时候会依次从这四个域中寻找,直到找到为止。

JSTL标签

  • JSP标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码。

要使用JSTL需要做以下几件事:

  1. 导入Maven:
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.2</version>
</dependency>
  1. 在JSP页面上引入JSTL标签库
<%@ taglib prefix="c" url="http://java.sun.com/jsp/jstl/core" %>
常用标签

<c:if ></c:if >表示条件语句

<%-- test属性中的值为判断条件,可以是EL+java语句 --%>
<c:if test = "true">
<h1>true</h1>
</c:if>
<c:if test="false">
<h1>false</h1>
</c:if>
<%--注意EL表达式的书写方式--%>
<c:if test="${status == 1}">
<h1>启用</h1>
</c:if>

<c:forEach ></c:forEach >表示循环语句

<%-- items是集合对象;var代表集合中每个元素的变量名称; varStatus代表遍历状态对象(保证id连续用的),其有2个子属性,count和id,前者从1开始,后者从0开始--%>
<c:forEach items="${brands}" var="brand" varStatus="status">
<tr align="center">
<%-- 直接通过EL语句获取,web服务器解析的时候会解析到getId()方法 --%>
<td>${brand.id}</td>
</tr>
</c:forEach>
<%-- begin、end、step三个属性可以用来得到范围内一定步长的数据 --%>
<c:forEach begin="0" end="10" step="1" var="i">
${i}
</c:forEach>

MVC模式&三层架构

  • MVC是一种分层开发的模式,其中:

    • M:Model,业务模型,处理业务
    • V:View,视图,界面展示
    • C:Controller,控制器,处理请求,调用模型和视图
  • 三层架构则包括以下三部分:(之后的SSM框架便是基于此)

    • 数据访问层:对数据库的CRUD基本操作;
    • 业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能;
    • 表现层:接收请求,封装数据,调用业务逻辑层,响应数据;

image-20230814173617745

【MVC模式和三层架构的关系】

image-20230814173654638

如图,视图和控制器构成了三层架构的表现层,而模型(也就是JavaBean)则进一步根据功能划分为业务逻辑层与数据访问层。

会话跟踪技术

概述

  • 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
  • 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
  • HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话哪数据共享。
  • 实现方式:
    1. 客户端会话跟踪技术:Cookie
    2. 服务端会话跟踪技术:Session
基本使用
  • Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问

  • Cookie基本使用:

    • 发送Cookie:

      1. 创建Cookie对象,设置数据

        Cookie cookie = new Cookie("key", "value");
      2. 发送Cookie到客户端:使用response对象

        response.addCookie(cookie);
    • 获取Cookie:

      1. 获取客户端携带的所有Cookie,使用request对象

        Cookie[] cookies = request.getCookies();
      2. 遍历数组,获取每一个Cookie对象:for

      3. 使用Cookie对象方法获取数据

        cookie.getName();
        cookie.getValue();
Cookie原理

为了理解Cookie究竟在做什么,它在HTTP的请求和响应中是如何发挥作用的,这里简单介绍一下Cookie分别在HTTP请求/响应中的什么位置。

Cookie的作用在这样一个循环里:

  • 服务器端:

    当服务器接收到HTTP请求后,为了维护浏览器状态,服务器会把一些状态信息以Cookie的形式放进HTTP响应中,浏览器接收到响应时,浏览器会将收到的Cookie存储起来。

    Cookie一般存放在响应头的Set-Cookie字段中:

    HTTP/1.0 200 OK
    Content-type: text/html
    Set-Cookie: yummy_cookie=choco
    Set-Cookie: tasty_cookie=strawberry
    [页面内容]
  • 客户端(浏览器):

    客户端发送HTTP请求的时候,会查看准备请求的域名下是否存在Cookie,如果存在,则会一并发出去。

    Cookie一般存在于请求头的Cookie字段中:

    GET /sample_page.html HTTP/1.1
    Host: www.example.org
    Cookie: yummy_cookie=choco; tasty_cookie=strawberry
Cookie存活时间

默认情况下,Cookie存放在浏览器内存中,当浏览器关闭,内存释放,Cookie也会一并被销毁。

但我们通常并不希望Cookie如此轻易地被销毁,可以通过下面的函数设置Cookied的存活时间:

//设置Cookie存活时间
//输入分三种情况:
//1. seconds > 0:将Cookie写入浏览器所在电脑硬盘,持久化存储。到时间自动删除
//2. seconds < 0:默认值,Cookie在当前浏览器内存中,浏览器关闭则Cookie被销毁
//3. seconds == 0:删除对应Cookie
setMaxAge(int seconds)
Cookie存储中文

Cookie是不允许存储中文的!

但是我们可以通过URL编码的方式解决:

服务器端:

String value = "张三";
//URL转码
value = URLEncoder.encode(value, "utf-8");
//存储Cookie
Cookie cookie = new Cookie("username, "value);
response.addCookie(cookie);

客户端:

//只展示解码部分
String name = cookie.getName();
if("username".equals(name)){
String value = cookie.getValue();
//解码
value = URLDecoder.decode(value, "utf-8");
//会输出“张三”,传输中文成功!
System.out.println(value);
}

Session

基本使用
  • 服务端会话跟踪技术:将数据保存到服务端

  • JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能

  • 使用:

    1. 获取Session对象

      HttpSession session = request.getSession();
    2. Session对象功能:

      • void setAttribute(String name, Object o):存储数据到session域中
      • Object getAttribute(String name):根据key,获取值
      • void removeAttribute(String name):根据key,删除该键值对

【重点】

同一个浏览器不同的请求可以共享同一个session,这是因为Session底层采用了Cookie。

Session原理
  • Session是基于Cookie实现的。

当浏览器发送请求给web服务器,服务器会在响应头上加上session的id:

set-cookie: JSESSIONID=10

当浏览器收到响应后,会加入到Cookie中,以后发送请求的时候会把cookie一并发送,服务器就知道去找哪个session了:

cookie=JSESSIONID=10
Session使用细节
  • Session钝化、活化

    • 服务器重启后,Session中的数据还会存在!(正常重启,拔电源不行。)这源于Session的钝化和活化机制:
      • 钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
      • 活化:再次启动服务器后,从文件中加载数据到Session中
  • Session销毁

    • 默认情况下,无操作,30分钟自动销毁。

      • 可在tomcat/conf下的web.xml中进行配置:

        <session-config>
        <session-timeout>30</session-timeout>
        </session-config>
    • 调用Session对象的invalidate()方法主动销毁。

Cookie和Session的比较

  • Cookie和Session都是来完成一次会话的多次请求间数据共享的
  • 区别:
    • 存储位置:Cookie将数据存储在客户端,Session将数据存储在服务端
    • 安全性:Cookie不安全,Session安全
    • 数据大小:Cookie最大3KB,Session无大小限制
    • 存储时间:Cookie可长期储存,Session默认30分钟
    • 服务器性能:Cookie不占用服务器资源,Session占用服务器资源

Filter

概念

  • Filter表示过滤器,是JavaWeb三大组件(Servlet, Filter, Listener)之一。
  • 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
  • 过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感字符处理等等...

image-20230815025621182

快速入门

image-20230815114153260

执行流程

image-20230815114404560

  • 如上图所示,Filter中的逻辑可分为放行前逻辑与放行后逻辑。

  • 放行后访问对应资源,资源访问完成后,还会回到Filter。

  • 回到Filter中,会执行放行后逻辑。

  • 因此,整体逻辑流程应该为:

    • 执行放行前逻辑(一般对request数据进行处理) -> 放行 -> 访问资源 ->执行放行后逻辑(一般对response数据进行处理)

使用细节

拦截路径配置
  • Filter可以根据需求,配置不同的拦截资源路径。

    @WebFilter("/*")
    public class FilterDemo{
    //...
    }
    • 拦截具体的资源:/index.jsp:只有访问index.jsp才会拦截
    • 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
    • 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
    • 拦截所有:/*:访问所有资源,都会被拦截
过滤器链
  • 一个Web应用可以配置多个过滤器,这多个过滤器被称为过滤器链
  • 注解配置的Filter,优先级按照过滤器类名(字符串)的自然顺序

Listener

据说不是很常用了,不再赘述

image-20230815120853997

AJAX

  • AJAX (Asynchronous JavaScript And XML):异步的JavaScript和XML
  • AJAX作用:
    1. 与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据
      • 使用了AJAX和服务器进行通信,就可以使用HTML+AJAX来替换JSP页面了(JSP主要还是靠后端开发,不适合前后端分离)
    2. 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用校验,等等...

image-20230815121934374

同步和异步

image-20230815123016465

同步不连续,异步连续。

快速入门

这个主要是js,参考AJAX 教程 | 菜鸟教程 (runoob.com)

Axios异步框架image-20230815133900887

​ 这简洁的代码无敌了,比原生Ajax代码强多了!

​ 但是Axios还提供更简单的封装,即别名:

image-20230815141730317

JSON

  • JavaScript Object Notation。JavaScript对象表示法。
  • 由于其语法简单,层次结构鲜明,现多用于作为数据载体,在网络中进行数据传输。
//JavaScript对象
{
name:"zhangsan",
age:23,
city:"Beijing"
}
//JSON对象
{
"name": "zhangsan",
"age": 23,
"city": "Beijing"
}

可以看出JSON对象和JavaScript对象很像,就是JSON的key也要加引号。

基础语法

image-20230815142738620

JSON数据和Java对象转换

  • 请求数据:JSON字符串转为Java对象
  • 响应数据:Java对象转为JSON字符串

直接采用fastjson就行了,可以参考Spring MVC笔记。

posted @   Vege_dog  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示