javaweb学习(day09-Web开发会话技术)

一、会话

1 基本介绍

1.1 什么是会话?

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个 web 资源,然 后关闭浏览器,整个过程称之为一个会话。

1.2 会话过程中要解决的一些问题? 

1) 每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会 产生一些数据 ,服
务器要想办法为 每个用户 保存这些数据
2) 例如:多个用户点击超链接通过一个 servlet 各自购买了一个商品,服务器应该想办法
把每一个用户购买的商品保存在各自的地方,以便于这些用户点结帐 servlet 时,结帐
servlet 可以得到用户各自购买的商品为用户结帐

2 会话的两种技术

Session 和 Cookie

二、Cookie

1.Cookie 有什么用

思考问题 1-抛砖引玉

大家在访问某个网站的时候,是否能看到提示你上次登录网站的时间 , 而且要注意的是不同 用户上次登录的时间肯定是不一样的,这是怎么实现的 ?

 思考问题 2-抛砖引玉

大家在访问某个购物网站的时候,是否能看到提示你曾经浏览过的商品,不同用户浏览过
的商品肯定不一样,这是怎么实现的

解决之道—cookie 技术 

Cookie( 小甜饼 ) 是客户端技术,服务器把每个用户的数据以 cookie 的形式写给用户各自的浏 览器。当用户使用浏览器再去访问服务器中的 web 资源时,就会带着各自的数据去。这样 web 资源处理的就是用户各自的数据了。【简单示意图】

 2 cookie 介绍

2.1 二说 cookie

  • Cookie 是服务器在客户端保存用户的信息,比如登录名,浏览历史等, 就可以,以 cookie方式保存
  • Cookie 信息就像是小甜饼(cookie 中文)一样,数据量并不大,服务器端在需要的时候可以从客户端/浏览器读取(http 协议),可以通过图来理解

  • cookie 数据是保存在浏览器的 

 2.2 cookie 可以用来做啥

  • 保存上次登录时间等信息
  • 保存用户名,密码, 在一定时间不用重新登录

  • 网站的个性化,比如定制网站的服务,内容 

cookie 基本使用 

3.1 cookie 常用方法 

  • Cookie 有点象一张表(K-V),分两列,一个是名字,一个是值,数据类型都是 String ,

  • 如何创建一个 Cookie(在服务端创建的) 

  • 如何将一个 Cookie 添加到客户端 

  •  如何读取 cookie(在服务器端读取到 cookie 信息)

 4 cookie 底层实现机制-创建和读取 Cookie

4.1 创建

package com.hspedu.cookie;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class CreateCookie extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request,response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("CreateCookie被调用.....");//1.创建一个cookie对象//username 该cookie的名字是唯一的//linran 是该cookie的值 可以创建多个cookie//这是cookie在服务器端Cookie cookie = new Cookie("username", "linran");//2 将cookie发送到浏览器response.addCookie(cookie);response.setContentType("text/html;charset=utf-8");PrintWriter writer =response.getWriter();writer.println("<h1>创建cookie成功</h1>");writer.flush();writer.close();}
}

 记得导入jar包、配置xml、配置tomcat哦

4.2 读取

package com.hspedu.cookie;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;/*** 读取浏览器的cookie信息*/
public class ReadCookie extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("ReadCookie被调用.....");//1 通过request读取cookie对象Cookie[] cookies = request.getCookies();if(cookies!=null&&cookies.length!=0){for (Cookie cookie : cookies) {System.out.println("cookie name = "+cookie.getName()+" value = "+cookie.getValue());}}response.setContentType("text/html;charset=utf-8");//3 给浏览器返回信息PrintWriter writer = response.getWriter();writer.println("<h1>读取信息成功</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}
不同会话, jsessionid 不同;

cookie 应用实例 

5.1 读取指定 Cookie 

创建工具类

package com.hspedu.cookie;import javax.servlet.http.Cookie;public class CookieUtils {//编写一个方法返回指定名字的cookie的值public static Cookie readCookieByName(String name,Cookie [] cookies){//判断传入的参数是否正确if(name==null || "".equals(name) ||cookies==null||cookies.length==0){return null;}else {//遍历cookie数组for (Cookie cookie : cookies) {if(name.equals(cookie.getName())){return cookie;}}}return null;}
}
package com.hspedu.cookie;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class ReadCookieByNameServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("ReadCookieByNameServlet被调用.....");//得到指定cookie的value//先获得浏览器携带的所有cookieCookie[] cookies = request.getCookies();//使用工具类获取指定的cookieCookie email =CookieUtils.readCookieByName("email",cookies);if(email!=null){System.out.println("cookie name = "+email.getName()+" value = "+email.getValue());}else {System.out.println("没有这个cookie");}//返回这个信息给浏览器response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>完成读取cookie的信息");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

5.2 修改 Cookie

package com.hspedu.cookie;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class UpdateCookieServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("UpdateCookieServlet被调用........");//根据名字查找cookieString cookName="email";Cookie[] cookies = request.getCookies();Cookie cookie=CookieUtils.readCookieByName(cookName,cookies);if(cookie==null){System.out.println("当前访问服务端的浏览器没有该cookie");}else {cookie.setValue("newlinran@baidu.com");response.addCookie(cookie);}//遍历cookieSystem.out.println("修改后的cookie");for (Cookie cookie1 : cookies) {System.out.println("cookie name = "+cookie1.getName()+" value = "+cookie1.getValue());}response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>更新任务完成</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

 6 cookie 生命周期

6.1 介绍 

  • Cookie 的生命周期指的是如何管理 Cookie 什么时候被销毁(删除) 
  • setMaxAge() 

 6.2 应用实例

package com.hspedu.cookie;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class CookieLiveServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("CookieLiveServlet被调用");//演示创建一个cookie 生命周期为60秒Cookie cookie =new Cookie("job","java");//1 从创建该Cookie计时 60秒后无效//2 浏览器来根据创建的时间,计时到60秒,就认为该cookie无效//3 如果该cookie无效,那么浏览器在发http请求时,就不再携带该cookiecookie.setMaxAge(60);//4 将cookie保存到浏览器response.addCookie(cookie);response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>设置cookie生命周期成功</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

cookie 有效路径

  • Cookie 有效路径 Path 的设置
  • Cookie path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。 path属性是通过请求的地址来进行有效的过滤
  • 规则如下

作业 

  • 需求: 完成自动填写登录账户应用案例 , 如果用户登录成功,则下次登录自动填写登录账户(如图
  •  如果用户名是 linran, 密码是 123456, 则认为该用户合法, 登录成功,否则登录失败
  • 要求实现如果登录成功,则该用户,在 3 天内登录,可以自动填写其登录名
  • 登录页面需要使用 servlet 返回,而不能使用 html

 

package com.hspedu.cookie;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class UserUiServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("UserUiServlet被调用.......");//读取cookieCookie[] cookies = request.getCookies();Cookie username_cookie = CookieUtils.readCookieByName("username", cookies);Cookie password_cookie =CookieUtils.readCookieByName("password",cookies);String username="";String password="";if(username_cookie!=null){//如果有username=username_cookie.getValue();}if(password_cookie!=null){password=password_cookie.getValue();System.out.println(password);}response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<!DOCTYPE html>\n" +"<html lang=\"en\">\n" +"<head>\n" +"    <meta charset=\"UTF-8\">\n" +"    <title>登录页面</title>\n" +"</head>\n" +"<body>\n" +"<h1>用户登录界面</h1>\n" +"<form action=\"/cs/loginServlet\">\n" +"    u:<input type=\"text\" name=\"username\" value=\""+username+"\"><br>\n" +"    p:<input type=\"password\" name=\"password\" value=\""+password+"\"><br>\n" +"    <input type=\"submit\" value=\"登录\">\n" +"</form>\n" +"</body>\n" +"</html>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}
package com.hspedu.cookie;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("LoginServlet被调用");//接收表单提交的用户名和密码String username = request.getParameter("username");String password = request.getParameter("password");response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();//判断是否合法if("linran".equals(username)&& "123456".equals(password)){//将登录成功的用户名和密码以cookie的形式进行保存Cookie username1 = new Cookie("username", username);//设置生命周期username1.setMaxAge(3600*24*3);Cookie password1 = new Cookie("password", password);password1.setMaxAge(3600*24*3);response.addCookie(username1);response.addCookie(password1);//合法writer.println("<h1>登录成功</h1>");}else {writer.println("<h1>登录失败</h1>");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

Cookie 注意事项和细节

  • 一个 Cookie 只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
  • 一个 WEB 站点可以给一个浏览器发送多个 Cookie,一个浏览器也可以存储多个 WEB 点提供的 Cookie
  • cookie 的总数量没有限制,但是每个域名的 COOKIE 数量和每个 COOKIE 的大小是有限 制的 (不同的浏览器限制不同, 知道即可) , Cookie 不适合存放数据量大的信息。
  • 注意,删除 cookie 时,path 必须一致,否则不会删除
  •  Java servlet cookie 中文乱码解决[设置编码+解码】
  • 如果存放中文的 cookie, 默认报错, 可以通过 URL 编码和解码来解决, 不建议存 放中文的 cookie 信息

三、session 

1. session 有什么用 

  • 不同的用户登录网站后,不管该用户浏览该网站的哪个页面,都可显示登录人的名字,还可以随时去查看自己的购物车中的商品, 是如何实现的?
  • 也就是说,一个用户在浏览网站不同页面时,服务器是如何知道是张三在浏览这个页面,还是李四在浏览这个页面?

 解决之道—session 技术, 简单说

  • Session 是服务器端技术,服务器在运行时为每一个用户的浏览器创建一个其独享的session 对象/集合
  • 由于 session 为各个用户浏览器独享,所以用户在访问服务器的不同页面时,可以从各自session 中读取/添加数据, 从而完成相应任务

 2 session 基本原理

2.1 Sesson 原理示意图 

 

  • 当用户打开浏览器,访问某个网站, 操作 session 时,服务器就会在内存(在服务端)为该浏览器分配一个 session 对象,该 session 对象被这个浏览器独占, 如图
  • 这个 session 对象也可看做是一个容器/集合,session 对象默认存在时间为 30min(这是在tomcat/conf/web.xml),也可修改 

 2.2 Session 可以做什么

  • 网上商城中的购物车
  • 保存登录用户的信息
  • 将数据放入到 Session 中,供用户在访问不同页面时,实现跨页面访问数据
  • 防止用户非法登录到某个页面 
  • ......

2.3 如何理解 Session 

  • session 存储结构示意图 

  • 你可以把 session 看作是一容器类似 HashMap,有两列(K-V),每一行就是 session 的一个属性。
  • 每个属性包含有两个部分,一个是该属性的名字(String),另外一个是它的值(Object) 

3 session 常用方法 

Session 的基本使用
  • 创建和获取 SessionAPI 一样

  •  session 添加属性

 

  • session 得到某个属性 

 

  • session 删除调某个属性: 

  •  isNew(); 判断是不是刚创建出来的 Session
  • 每个 Session 都有 1 个唯一标识 Id 值。通过 getId() 得到 Session 的会话 id

4 session 底层实现机制 

4.1 原理分析图 

 

 4.2 代码演示

演示 Session 底层实现机制-创建和读取 Session 

创建

package com.hspedu.session;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;public class CreatSession extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("CreatSession被调用......");//获取session 同时也可能创建SessionHttpSession session = request.getSession();//给session获取idSystem.out.println("当前sessionId= "+session.getId());//给session存放数据session.setAttribute("email","zs@qq.com");//给浏览器一个回复response.setContentType("text/html;charset=utf-8");PrintWriter writer =response.getWriter();writer.println("<h1>创建session成功</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

 读取

package com.hspedu.session;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;public class ReadSessionServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("ReadSessionServlet被调用......");//演示读取Session//如果没有也会被创建HttpSession session = request.getSession();Object email = session.getAttribute("email");if(email!=null){System.out.println("session属性 email= "+(String) email);}else {System.out.println("session没有email属性");}//给浏览器一个回复response.setContentType("text/html;charset=utf-8");PrintWriter writer =response.getWriter();writer.println("<h1>读取session成功</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

5 session 生命周期

5.1 Session 生命周期-说明 

  • public void setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位),
  • 超过指定的时长,Session 就会被销毁。
  • 值为正数的时候,设定 Session 的超时时长。
  • 负数表示永不超时
  • public int getMaxInactiveInterval()获取 Session 的超时时间
  • public void invalidate() 让当前 Session 会话立即无效
  • 如果没有调用 setMaxInactiveInterval() 来指定 Session 的生命时长,Tomcat 会以Session默认时长为准,Session 默认的超时为 30 分钟, 可以在 tomcat web.xml 设置

 

  • Session 的生命周期指的是 :客户端/浏览器两次请求最大间隔时长,而不是累积时长即当客户端访问了自己的 sessionsession 的生命周期将从 0 开始重新计算。(解读: 的是同一个会话两次请求之间的间隔时间)
  • 底层: Tomcat 用一个线程来轮询会话状态,如果某个会话的空闲时间超过设定的最大值,则将该会话销毁

5.2 Session 生命周期-应用实例 

创建

package com.hspedu.session;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;public class CreateSession2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("CreateSession2被调用.....");//创建sessionHttpSession session = request.getSession();System.out.println("CreateSession2 sid= "+session.getId());//设置生命周期session.setMaxInactiveInterval(60);//添加属性session.setAttribute("u","jack");//给浏览器一个回复response.setContentType("text/html;charset=utf-8");PrintWriter writer =response.getWriter();writer.println("<h1>创建session2成功,设置生命周期60s</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

 读取

package com.hspedu.session;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;public class ReadSession2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("ReadSession2被调用.....");//获取sessionHttpSession session = request.getSession();System.out.println("ReadSession2 sid= "+session.getId());String res="";//读取session的属性Object u = session.getAttribute("u");if(u!=null){System.out.println("读取到session属性 u= "+(String) u);res="读取到session属性 u= "+(String) u;}else {System.out.println("读取不到session属性 u 说明原来session被销毁");res="读取不到session属性 u 说明原来session被销毁";}//给浏览器一个回复response.setContentType("text/html;charset=utf-8");PrintWriter writer =response.getWriter();writer.println("<h1>"+res+"</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

删除

package com.hspedu.session;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;public class DeleteSession extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("DeleteSession被调用.....");HttpSession session = request.getSession();session.invalidate();//给浏览器一个回复response.setContentType("text/html;charset=utf-8");PrintWriter writer =response.getWriter();writer.println("<h1>删除session成功</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/276578.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

solana 入门 1

solana-co-learn Solana 开发学习笔记(一)——从 Hello World 出发 安装开发环境 windows下环境配置 wsl First start with installing WSL on your system. wsl --install wsl安装Ubuntu 列出可用的分发版 wsl.exe --list --online显示&#xff1a; 以下是可安装的有效…

【C语言】五种方法实现C语言中大小写字母的转化

文章目录 &#x1f4dd;tolower/toupper函数&#x1f309;tolower&#x1f320; toupper &#x1f320; ASCII码关系&#x1f309;位操作&#x1f309;宏定义 &#x1f320;小巧第五位&#x1f6a9;总结 &#x1f4dd;tolower/toupper函数 &#x1f309;tolower tolower函数是…

Windows中在C#中使用Dapper和Mysql.Data库连接MySQL数据库

Windows中在C#中使用Dapper和Mysql.Data库连接MySQL数据库 在Windows中使用C#连接Mysql数据库比较简单&#xff0c;可以直接使用MySql.Data库&#xff0c;目前最新版本为&#xff1a;8.3.0。 当然也可以结合MySql.Data和Dapper库一起使用&#xff0c;目前Dapper的最新版本为&a…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Progress)

进度条组件&#xff0c;用于显示内容加载或操作处理等进度。 说明&#xff1a; 该组件从API version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Progress(options: ProgressOptions<Type>) 创建进度组件&a…

Python Web应用程序构建的最佳实践:代码实例与深度解析【第122篇—装饰器详解】

Python Web应用程序构建的最佳实践&#xff1a;代码实例与深度解析 在当今数字时代&#xff0c;构建高效、可扩展的Web应用程序是开发者们的一项重要任务。Python&#xff0c;作为一种简洁、强大的编程语言&#xff0c;为Web开发提供了丰富的工具和框架。在本篇文章中&#xff…

用户案例|向量引擎在携程酒店搜索中的应用场景和探索

Zilliz AI 初创计划是面向 AI 初创企业推出的一项扶持计划&#xff0c;预计提供总计 1000 万元的 Zilliz Cloud 抵扣金&#xff0c;致力于帮助 AI 开发者构建高效的非结构化数据管理系统&#xff0c;助力打造高质量 AI 服务与运用&#xff0c;加速产业落地。访问https://zilliz…

【机器学习300问】38、什么是K-means算法?

在实际工作中&#xff0c;我们经常会遇到这样一类问题&#xff1a;给机器输入大量的特征数据&#xff0c;并期望机器通过学习找出数据存在的某种共性特征、结构或关联。这类问题被称为“非监督学习”问题。这篇文章我就来聚焦非监督学习中的其中一个任务——聚类 例如在数字营销…

OpenHarmony教程指南—ArkTS时钟

简单时钟 介绍 本示例通过使用ohos.display 接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间&#xff0c;使用Canvas绘制时钟&#xff0c;指针旋转角度通过计算得出。 例如&#xff1a;"2 * Math.PI /…

leetcode 3.11

leetcode hot 100 二分查找1.寻找旋转排序数组中的最小值 矩阵1.搜索二维矩阵 II知识点&#xff1a;upper_bound, lower_bound知识点&#xff1a;二分查找 2.搜索二维矩阵 链表1.合并两个有序链表2.两数相加3. 删除链表的倒数第 N 个结点 二分查找 1.寻找旋转排序数组中的最小…

【C#】.net core 6.0 使用第三方日志插件Log4net,日志输出到控制台或者文本文档

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

鸿蒙Next学习-Flex布局

Entry Component struct FlexCase {build() {//需要在构造参数上传Flex({ direction: FlexDirection.Row,justifyContent:FlexAlign.Center }) {//flex布局Row().width(100).height(100).backgroundColor(Color.Red)Row().width(100).height(100).backgroundColor(Color.Yellow…

c++11语法特性

c11 1.c11发展简介 ​ 第一个比较正式的c标准是1998提出的c98标准。之后定了5年计划&#xff0c;每5年来一次大更新。在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C…

工作中Git如何切换远程仓库地址

工作中Git如何切换远程仓库地址 部门之前的仓库不用了&#xff0c;重新建了一个仓库&#xff0c;但是上传代码还是上传到了之前的仓库里面了&#xff0c;所以得进行修改&#xff0c;下面将修改地址的方法进行操作。 方法一、直接修改远程仓库地址 查看当前远程仓库地址 git …

使用 ChatGPT 写高考作文

写作文&#xff0c;很简单&#xff0c;但写一篇好的作文&#xff0c;是非常有难度的。 想要写一篇高分作文&#xff0c;需要对作文题目有正确的理解&#xff0c;需要展现独到的观点和深入的思考&#xff0c;需要具备清晰的逻辑结构&#xff0c;需要准确而得体的语言表达。 正…

【Linux进阶之路】HTTPS = HTTP + S

文章目录 一、概念铺垫1.Session ID2.明文与密文3.公钥与私钥4.HTTPS结构 二、加密方式1. 对称加密2.非对称加密3.CA证书 总结尾序 一、概念铺垫 1.Session ID Session ID&#xff0c;即会话ID&#xff0c;用于标识客户端与服务端的唯一特定会话的标识符。会话&#xff0c;即客…

LeetCode 热题 100 | 回溯(二)

目录 1 39. 组合总和 2 22. 括号生成 3 79. 单词搜索 菜鸟做题&#xff0c;语言是 C&#xff0c;感冒快好版 关于对回溯算法的理解请参照我的上一篇博客&#xff1b; 在之后的博客中&#xff0c;我将只分析回溯算法中的 for 循环。 1 39. 组合总和 题眼&#xff1a;c…

15届蓝桥杯第二期模拟赛题单详细解析

文章目录 &#x1f9e1;&#x1f9e1;t1_求余&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t2_灌水&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t3_字符显示&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t4_区间最大和…

网络计算机

TCP/IP四层模型 应用层&#xff1a;位于传输层之上&#xff0c;主要提供两个设备上的应用程序之间信息交换的服务&#xff0c;它定义了信息交换的格式&#xff0c;消息会交给下一层传输层来传递。我们把应用层交互的数据单元称为报文。应用层工作在操作系统的用户态&#xff0…

YOLOv8_pose-Openvino和ONNXRuntime推理【CPU】

纯检测系列&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv7-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 跟踪系列&#xff1a; YOLOv5/6/7-O…

Android 音频系统

导入 早期Linux版本采用的是OSS框架&#xff0c;它也是Unix及类Unix系统中广泛使用的一种音频体系。 ALSA是Linux社区为了取代OSS而提出的一种框架&#xff0c;是一个源代码完全开放的系统(遵循GNU GPL和GNU LGPL)。ALSA在Kernel 2.5版本中被正式引入后&#xff0c;OSS就逐步…