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
快速入门
- 新建HTML页面,引入Vue.js文件(需要下好vue.js)
<script src="js/vue.js"></script>
- 在JS代码区域,创建Vue核心对象,进行数据绑定
new Vue({ el:"#app", data(){ return { username:"" } } })
- 编写视图
<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服务器)
HTTP协议
概念:HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
HTTP协议特点:
- 基于TCP协议:面向连接,可靠传输
- 基于请求-响应模型的:一次请求对应一次响应
- HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
- 缺点:多次请求不能共享数据。Java中会使用会话技术(Cookie、Session)来解决这个问题。
- 优点:速度快
HTTP-请求数据格式
以下图为例子:
-
请求数据分为三部分:
- 请求行:请求数据的第一行。以上图为例,GET表示请求方式,/表示请求资源路径,HTTP/1.1表示协议版本。
- 请求头:第二行开始,格式为key: value形式。
- 请求体:(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-响应数据格式
-
响应数据分为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才能运行。
Tomcat的配置文件:conf文件夹下的server.xml。(可修改端口号为80,因为80为HTTP协议的默认端口号,所以修改后将来访问Tomcat时,可以不用输入端口号。)
IDEA中的Maven Web项目
- 项目结构:(Maven web需要打包为war包,所以需要在pom.xml中加入
war,否则默认为jar包)
- 记录一下不使用骨架的Maven web项目创建方式,之前学习MVC的时候纯粹瞎琢磨。。
-
Tomcat启动方式:
-
原生方式麻烦不介绍。
-
集成在IDEA中。
-
通过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>
-
Servlet
- Servlet是Java提供的一门动态web资源开发技术。(比起静态资源,JavaWeb开发更聚焦于动态资源)
- Servlet是JavaEE规范之一,其实就是一个借口,将来我们需要定义Servlet类实现Servlet接口,并由Web服务器运行Servlet。
快速入门
执行流程
生命周期
方法介绍
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配置方式有多种,下图总结了一下:
注意:
任意匹配的"/"会覆盖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
【继承体系】
当请求从浏览器抵达web服务器的时候,Tomcat首先会解析请求,并封装起来(RequestFacade类,实现了HttpServletRequest接口),创建后request对象后传递到service方法中。
我们实际使用的时候只要看JavaEE API文档的HttpServletRequest接口就行。
【获取请求数据】
- Request获取请求数据分为三部分:
- 请求行: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
- 请求头:
- String getHeader(String name):根据请求头名称,获取值
- 请求体
- ServletInputStream getInputStream():获取字节输入流
- BufferedReader getReader():获取字符输入流
- 请求行:GET /request-demo/req1?username=zhangsan&password=123 HTTP/1.1
【获取请求参数的通用方法】
从上面的方法可以看出,GET和POST方法获取请求参数的方法不仅不同,且只能以String的方式返回。在实际开发中,我们可能更希望能返回成一个Map。Luckily,别人已经帮我们写好了,可以直接使用:
- Map<Stirng, String[]> getParameterMap():获取所有参数Map集合
- String[] getParameterValues(String name):根据名称获取参数值(数组)。注意,因为可能会出现一个name多个value的情况,所以这个方法是很有必要的。
- String getParameter(String name):根据名称获取参数值。如果有多次出现,则返回第一个。
【乱码问题】
当参数存在中文的时候会出现乱码问题,以下为解决方案:
- POST
//POST方式出现乱码本质上是读取字符流的时候编码方式错了,所以只需要设置一下字符输入流的编码格式 //改成UTF-8就可以了 request.setCharacterEncoding("UTF-8");
- GET
GET的乱码问题更为复杂,其流程如下:
浏览器虽然对URL是用UTF-8进行编码的,但是在Tomcat8之前Tomcat默认使用ISO-8859-1进行解码,这才导致我们会看到乱码。由于Tomcat本身并不支持配置解码格式,因此我们必须通过一种间接手段来解决乱码问题:
- 由于传输的字节码是固定的,所以我们可以先把解码后的数据返回为字节流;
- 用UTF-8重新对字节流进行编码;
//1. 首先将收到的数据返回为字节流(这里的数据为username) byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1); //2. 字节流转化为字符串 username = new String(bytes, StandardCharsets.UTF_8);
不过我用的是Tomcat8,可高枕无忧矣!
【请求转发】
转发(forward)是一种在服务器内部的资源跳转方式。
其特点包括:
- 浏览器地址路径不发生变化
- 只能转发到当前服务器的内部资源
- 一次请求,可以在转发的资源间使用request共享数据
实现方式:
//请求转发 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
【继承体系】
和Request差不多。
【设置响应数据】
- Response设置数据分为三部分:
- 响应行:HTTP/1.1 200 OK
- void setStatus(int sc):设置响应状态码
- 响应头:
- void setHeader(String name, String value):设置响应头键值对
- 响应体
- PrintWriter getWriter():获取字符输出流
- ServletOutputStream getOutputStream():获取字节输出流
【重定向】
重定向(Redirect)是一种资源跳转方式。
其特点包括:
- 浏览器地址栏路径发生变化
- 可以重定向到任意位置的资源(服务器内部、外部均可)
- 两次请求,不能在多个资源使用使用request共享数据
实现方式:
//可以直接使用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准备工作&原理
- Maven导入JSP坐标
<dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency>
- 创建JSP文件
直接在Idea中右键选择JSP/JSPX
- 编写HTML标签和Java代码
【JSP原理】
JSP本质上就是一个Servlet,在Tomcat内部会被转换成一个类。其实就是通过Writer把对应结果写在响应体中然后返回给浏览器罢了。
重点在于JSP的存在简化了开发的步骤,让我们可以专注于业务逻辑而不用浪费时间在额外的重复操作上。
JSP脚本
-
JSP脚本用于在JSP页面上定义Java代码。
-
JSP脚本分类:
- <%...%>:内容会直接放到_jspService()方法之中
- <%=...%>:内容会放到out.print()中,作为out.print()的参数
- <%!...%>:内容会放到_jspService()方法之外,被类直接包含
(JSP中java代码块可以截断,不过现在用的貌似不多且可读性极差,先不记录)
JSP缺点
。。书写麻烦、阅读麻烦、复杂、占内存和磁盘、调试困难、团队协作困难等等等等等。
全部白雪!
EL技术
- Expression Language 表达式语言,用于简化JSP页面内的Java代码。
- 主要功能:获取数据
- 语法:$
- 比如${brands}用于获取域中存储的key为brands的数据。
- JavaWeb中有四大域对象:
- page:当前页面有效
- request:当前请求有效
- session:当前会话有效
- application:当前应用有效
EL表达式获取数据的时候会依次从这四个域中寻找,直到找到为止。
JSTL标签
- JSP标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码。
要使用JSTL需要做以下几件事:
- 导入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>
- 在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基本操作;
- 业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能;
- 表现层:接收请求,封装数据,调用业务逻辑层,响应数据;
【MVC模式和三层架构的关系】
如图,视图和控制器构成了三层架构的表现层,而模型(也就是JavaBean)则进一步根据功能划分为业务逻辑层与数据访问层。
会话跟踪技术
概述
- 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
- 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
- HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话哪数据共享。
- 实现方式:
- 客户端会话跟踪技术:Cookie
- 服务端会话跟踪技术:Session
Cookie
基本使用
-
Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问
-
Cookie基本使用:
-
发送Cookie:
-
创建Cookie对象,设置数据
Cookie cookie = new Cookie("key", "value"); -
发送Cookie到客户端:使用response对象
response.addCookie(cookie);
-
-
获取Cookie:
-
获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies(); -
遍历数组,获取每一个Cookie对象:for
-
使用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接口,来实现一次会话的多次请求间数据共享功能
-
使用:
-
获取Session对象
HttpSession session = request.getSession(); -
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中的数据还会存在!(正常重启,拔电源不行。)这源于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)之一。
- 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
- 过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感字符处理等等...
快速入门
执行流程
-
如上图所示,Filter中的逻辑可分为放行前逻辑与放行后逻辑。
-
放行后访问对应资源,资源访问完成后,还会回到Filter。
-
回到Filter中,会执行放行后逻辑。
-
因此,整体逻辑流程应该为:
- 执行放行前逻辑(一般对request数据进行处理) -> 放行 -> 访问资源 ->执行放行后逻辑(一般对response数据进行处理)
使用细节
拦截路径配置
-
Filter可以根据需求,配置不同的拦截资源路径。
@WebFilter("/*") public class FilterDemo{ //... } - 拦截具体的资源:/index.jsp:只有访问index.jsp才会拦截
- 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
- 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
- 拦截所有:/*:访问所有资源,都会被拦截
过滤器链
- 一个Web应用可以配置多个过滤器,这多个过滤器被称为过滤器链
- 注解配置的Filter,优先级按照过滤器类名(字符串)的自然顺序。
Listener
据说不是很常用了,不再赘述
AJAX
- AJAX (Asynchronous JavaScript And XML):异步的JavaScript和XML
- AJAX作用:
- 与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据
- 使用了AJAX和服务器进行通信,就可以使用HTML+AJAX来替换JSP页面了(JSP主要还是靠后端开发,不适合前后端分离)
- 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用校验,等等...
- 与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据
同步和异步
同步不连续,异步连续。
快速入门
这个主要是js,参考AJAX 教程 | 菜鸟教程 (runoob.com)。
Axios异步框架
这简洁的代码无敌了,比原生Ajax代码强多了!
但是Axios还提供更简单的封装,即别名:
JSON
- JavaScript Object Notation。JavaScript对象表示法。
- 由于其语法简单,层次结构鲜明,现多用于作为数据载体,在网络中进行数据传输。
//JavaScript对象 { name:"zhangsan", age:23, city:"Beijing" }
//JSON对象 { "name": "zhangsan", "age": 23, "city": "Beijing" }
可以看出JSON对象和JavaScript对象很像,就是JSON的key也要加引号。
基础语法
JSON数据和Java对象转换
- 请求数据:JSON字符串转为Java对象
- 响应数据:Java对象转为JSON字符串
直接采用fastjson就行了,可以参考Spring MVC笔记。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具