javaWeb+前端

HTML

html:超文本标记语言

  • 标签:也叫标记,就是页面中识别的命令

 格式:
  双标签 <标签名> </标签名>
  单标签 <标签名/>
 <body>
  标签内部
 </body>
  • 属性:不能独立存在;必须定义在标签里

 <标签名 属性名="值"></标签名>
 <标签名 属性名="值" />
  • 结构标签

 <!DOCTYPE html>
 <html>
  <!--网页头部标签-->
  <head>
      <!--设置编码-->
      <meta charset="UTF-8">
      <!--页面标题-->
      <title>Title</title>
  </head>
  <!--网页正文:-->
  <body>
      hello world
      你好,世界
  </body>
 </html>
  • 文本标签

 1.文字标签:<font size = "字体大小" color="颜色" face="样式"></font>
 RGB三原色:
  Red
  Blue
  Green 绿
  #00ced1---用0~255之间的十进制表示颜色,转为00-FF之间的十六进制表示颜色
 2.实体字符
  空格: &nbsp;
  <:   &lt;
     >:   &gt;
 3.换行:<br>
 4..标题标签:加粗、换行
  <h1></h1>
  <h2></h2>
  <h3></h3>
  <h4></h4>
  <h5></h5>
  <h6></h6>
 5.列表标签:
        无序:
             <ul type="square(正方形) circle(圆) desc(实心圆)">
                 <li></li>
             </ul>
        有序:
             <ol type="1数字a小写字母A大写字母 i小写古罗马 I大写罗马">
                 <li></li>
             </ol>
        自定义列表:
             <dl>
                  <dt></dt>列表标题
                  <dd></dd>列表内容
                  <dd></dd>列表内容
                  ....
             </dl>
 
  • 表格标签:

 <table border="边框" width="表格宽" align="表格水平对齐:center(居中)" >
     <tr heght="行高">
          <td width="列宽"></td>
          <td></td>
          <td></td>
     </tr>
     <tr>
  <td colspan="3">任何内容</td>  <!--列合并-->
  </tr>
     <tr>
  <td></td>
  <td></td>
  <td rowspan="2"></td>  <!--行合并-->
  </tr>
 </table>
 注:每行的列数必须相等
  table必须包含tr,tr必须包含td,td里面可以定义任何内容
  • 图标标签:

 <img src="图片地址" width="宽度" height="高度"/>
 地址:
  相对路径:从当前位置所在位置出发的一个路径
  当前位置/上一级目录../下一级目录
  绝对路径:文件存储的真实路径
  • 表单标签

 <form action="表单提交地址" method="提交方式get/post" enctype="表单类型:普通表单/上传表单"></form>
  get提交:提交的数据大小不超过2kb,在地址栏没有显示提交内容,建议查询/删除
  post提交:提交的数据理论上没有限制,在地址栏没有显示提交内容,建议新增/1修改
  普通表单:application/x-www-form-urlencoded
  上传表单:multipart/forem-data
 
 <input type="">
  文本框:text
  密码框:password
  单选框:radio 同一组单选按钮的name属性值必须相同
  复选框:checkbox
  日期:date
  隐藏域:hidden
  上传组件:file
  电子邮箱:email
  数值:number
  表单提交:submit
  内容重置:reset
  普通按钮:button
  图片提交按钮:image
 <select></select>下拉框
  <select>
  <option>1<option>
  <option>2<option>
  <option>3<option>
  </select>
 <textarea></textarea>多行文本框
 注:所有表单元素必须定义在form标签里才有效
  • 连接标签:

 <a href="跳转的地址" target="打开方式_blank新窗口_self原窗口中打开"></a>
 <body link="链接本身的颜色" alink="访问时的颜色" vlink="已访问的颜色"></body>

css

层叠样式表,美化页面

  • 选择器

 标签选择器:标签名做选择器
 类选择器:class属性值做选择器
 id选择器:id属性值做选择器
 
 选择器的组合:
  选择器1,选择器2{...},表示:有相同的属性,但没有包含关系
  选择器1 选择器2{...},表示:选择器1包含了选择器2
  • 语法:

 选择器{属性名:值;}
 例:img{width:100px;} 给所有图片宽度为100像素;
  .a1{height:200px;width:100px;} 给class名为a1的对象高度为200像表、宽度为100像素;
  #ip{width:300px;} 给id值为ip的唯一对象设置宽度为300像素;
 
 方式一:<img style="width:300px; height: 100px;" />
 方式二:
  <head>
  <style type="text/css">
  属性
  </style>
  </head>
 方式三:推荐***
  <head>
  <link type="text/css" rel="stylesheet" href="css独立文件" />
  </head>
 方式四:有的浏览器不支持
  <head>
  @import url("引入外部CSS独立文件"); //外部导入文件
  </head>
  • 常用属性:

性名属性值含义
background-color 颜色--英文|RGB三原色 背景色
width 数值,例:200px 宽度
height 数值,例:200px 高度
border 样式;颜色;粗细 上下左右四个边框架的样式、颜色、粗细
border-top 样式;颜色;粗细 上边框架的样式、颜色、粗细
border-bottom 样式;颜色;粗细 下边框架的样式、颜色、粗细
border-left 样式;颜色;粗细 左边框架的样式、颜色、粗细
border-right 样式;颜色;粗细 右边框架的样式、颜色、粗细
color 颜色--英文|RGB三原色 字体颜色
float left;right; 使用块级div同行向左或向右对齐;
  • 定位postion:

absolute绝对定位

不参与页面布局;脱离页成的文档流;默认从页面左上定点开始定位;一般结合:top/left使用

relative相对定位

fiexd固定定位

javascript

 

弱类型语言是一种浏览器解释的脚本语言

分为三部分:

1.基本语法

2.文档对象模型DOM

3.浏览器对象模型BOM

  • JS使用方式

 第一种:在HTML页面中添加
  <script type="text/javascript">
  //JS语法
  </script>
 第二种:引入独立外部JS文件
  <script type="text/javascript src="外部JS文件路径"></scripte>
  • 基本语法

 声明变量:
  var声明局部变量
  不用var声明全局变量
 数据类型:
  基本类型:数值number 字符string 布尔boolean
  异常--undefined未定义;null空值;NaN非数值;
  引用类型:(后续json数据格式中的重点):{属性名:值,属性名:值}
  数组类型:[元素,元素,...] 类型不需要统一 长度不固定
 输出方式:
  弹框:
  提示框:alter();
  询问框:confirm();
  询问并提示回答:prompt();
  前端浏览器控制台打印:console.log(...);
  直接输出在页面(了解):document.write(内容);
 
 运算符/条件判断语句/循环语句
 for(var s in 数组名){
  数组名[s];//s是下标
 }
 事件:用户在前端页面中触发一个行为
  <标签名 onXXX="函数名(实参列表)"></标签名>
  onmouseenter:鼠标进入事件--只触发当前标签进入事件
  onmouseover:鼠标经过事件--触发当前标签进入事件,如果内部有子标签,也会触发函数
  onclick:单击
  ondblclick:双击
  onmouseout:与onmouseover对应
  onmouseleave:与onmouseenter对应
  onmouseup:鼠标抬起
  onmousedown:鼠标按下
  onkeyup:键盘抬起
  onkeydown:键盘按下
  onfocus:获得焦点
  onblur:失去焦点
  onsubmit:表单提交
  onchange:内容改变
  oninput:内容输入
 函数:及方法
  定义:
  function 函数名(形参列表){
  //执行的JS部分
  }
 
  调用:
  通过事件调用; 当事件触发时执行函数
  通过定时器调用;
 
 正则表达式:用于验证字符的内容格式
  元字符:特殊的字符
        \w: 任一个数字、字母、下划线
        \d: 任一个数字
        \s: 任一个空白字符
        \b: 单词的边界;单词指的是连接的字符
        \W: 与\w相反
        \D: 与\d相反
        \S: 与\s相反
        \B: 与\b相反
  量词:表示元字符的重复次数:元字符在左边,量词在右边
  +: 至少重复一次
  *: 不限制次数
  ?: 重复0次或1次
  {m}: 重复m次
  {m,}: 至少重复m次
  {m,n}: 重复m-n次
  [范围]:范围中任意一个字符,例:[a-z0-9A-Z] [aA9]
  (): 表示整体括号中为一体
  /内容/: 正则的定义边界
  ^: 开始的边界
  $: 结束的边界
  验证方法:
  exec:查找满足条件的字符设置
  test:返回true或flase的验证结果
  使用:
  //被验证的字符串
  var val="abc";
  //正则规则
  var reg=/^\w+$/;
  //用正则规则验证字符串格式的正确性
  reg.test(val);-----返回true
  reg.exec(val);-----返回下标
  • 文档对象模型DOM

将文档对象树的结构展示:
获得元素:
通过class属性获得:
document.getElementsByClassName("class属性值");
注:得到一个数组
通过id属性获得:
document.getElementById("id属性值");
注:得到一个唯一对象
更改元素属性:
html属性:定义在标签里,<img src=""/>,src是html属性
对象名.属性名
css属性:style里的,<div style="width:100px"></div>,width是css属性
对象名.style.属性名
  • 浏览器对象模型BOM

定时器:
定时每个固定时间执行一次:setInterval("函数名",毫秒时间)
关闭定时器:clearInterval(定时器名)
在固定时间之后只执行一次:setTimeout("函数名",毫秒时间)
关闭定时器:clearTimeout(定时器名)

jsp

运行服务器的页面

jsp页面内容:html标签/css样式/js脚本/java代码

在jsp中添加java代码:

<% 
java代码
%>
<%= 表达式%>
  • javaweb项目

  1. 目录结构

src
web
WEB-INF:对外是隐藏目录
web.xml
jsp/html页面
环境:tomcat服务器

2.服务器

tomcat8,创建工程并且关联服务器;

将项目工程部署到服务器;启动服务器,此时工程就可以通过发布部署路径进行访问;

协议:IP地址:端口号/资源名称

http://localhost:8080/资源名index

3.servlet

运行在服务器端的应用程序;

功能:可以应答客户端的请求的一个特殊的java类;实现Servlet接口的类;有映射地址,通过映射地址访问类;用于控制层

  • 创建servlet:由服务器创建实例,单实例多线程,由客户端发起请求时再由服务器提供两个参数(HttpServletRequest请求/HttpServlerResponse响应)

实现servlet接口:
重写五个方法:
init初始化方法---当前servlert被实例化后执行的方法
init()--初始化加载配置
init(ServletConfig config)--在加载配置信息,同时还需要读取初始化参数
destroy销毁方法
service应答所有请求方法
getServletConfig读取配置参数方法
getServletInfo获得servlet信息

继承HttpSrevlet类:
class 类名 extends HttpServlet{
//当页面中有请求时,doGet/doPost会自动应答
//重写doGet方法--biaodanget提交
//重写doPost方法--表单post提交
}
  • 注册servlet:

配置方式:
web/WEB-INF/web.xml中添加配置
<servlet>
<servlet-name>相同的名称</servlet-name>
<servlet-class>全类名</servlet-class> 实际调用的是这个类中的doGet/doPost方法
<init-param>
<param-name>rowsperpage</param-name>
<param-value>10</param-value>
</init-param>
</servlet>

<servlet>
<servlet-name>相同的名称<servlet-name>
<url-pattern>路径</url-patten> 客户端浏览器访问这个路径
</servlet>
注解方式
在类的声明处添加@webservlet("映射路径")

4.MVC三层架构

M 模型层--dao/pojo
数据访问层dao
封装jdbc常用增删改查方法
业务层service
调用dao的方法
V 视图层--html页面的前端渲染数据
将控制层的数据渲染到页面中;
C 控制层--Servlet/SpringMVC应答客户端的请求,并且将模型层的数据渲染导数据层
接收前端请求参数:参数.getParameter("参数名")
调用业务层
返回数据到页面

JSTL标签:

java server page tag language标签库

替代jsp页面中的java代码
1.导入环境依赖:
jstl.jar
standard0jar
2.在使用标签的jsp页面加入:
<@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3.使用:
3.1循环标签:
<c:forEach item="通过EL取出数据" var="变量">---变量对应的是EL取出的集合数据中
${变量.属性} ---变量的属性,需要get方法的支持
</c:forEach>
<c:forEach var="变量" begin="开始" end="结束" step="每次增加几">
${变量}
</c:forEach>
3.2单条件判断
<c:if test="条件表达式"> == if(条件表达式){}
执行的语句
</c:if>
3.3多重判断
<:choose>
<c:when test="条件表达式">
<c:when>
<c:when test="条件表达式">
<c:when>
<c:when test="条件表达式">
<c:when>
...
<otherwise>
</otherwise>
</c:choose>

 

EL表达式

expression language表达式语言,用于简化jsp页面;

替换getAttribute("名称")

  • 语法:

${对象.名称}
${名称}---默认从小到大范围查找(pageScore当前页、requestScore请求域、sessionScope会话域、applicationScope服务器范围)

通过EL定义的隐式对象获得名称对应值;

pageScope			page 作用域
requestScope request 作用域
sessionScope session 作用域
applicationScope application 作用域
param Request 对象的参数,字符串
parmValues Request 对象的参数,字符串集合
header HTTP 信息头,字符串集合
init Param上下文初始化参数
cookie Cookie值
pageContext 当前页面的pageContext
empty判断取出的对象是否为空:${empty(名称)},空-true;非空-false

controller控制层

每个controller对应一个模块,例UserController实现用户模块;--- 类内高类聚,类间弱耦合

  • 问题一:每个controller中只有doget/dopost方法,对应get/post请求;如果某个模块有两个以上的业务,无法在当前控制层内类聚?

    • 解决方案:重写service,它可以应答所有请求.

  • 问题二:所有请求都由service方法应答,怎么在类内区分不同的业务?

    • 解决方案:在请求时携带一个参数method,再根据method的不同值调用不同的方法,所以需要在类内定义不同业务的方法,

      例:login方法,register方法,logout方法;并且这些方法的参数与service方法相同,因为这些都是由服务器创建.

      实现:前端是表单提交,通过隐藏域实现参数的提交,他们的name="method",value="不同",后端根据method所携带不同的值判断调用哪个方法;在后端通过反射实现调用.

  • 问题三:所有控制层controller里都需要进行反射实现统一调用,代码重复性高?

    • 解决方案:创建一个controller的父类,把反射实现统一调用在父类中,由子类各自继承,由此实现代码的复用;只需要在子类中定义核心业务

  • controller层的返回处理:

原因:所有控制层都有处理结果的跳转;

结果:在父类中接收反射调用方法的返回值;再将值统一的跳转

request.getRequestDispatcher(返回值).forward(request,response);

重定向和请求转发

区别:请求转发对客户端而言,只发起一次请求,作用于服务器端;

重定向对客户端而言,发起多次请求,作用于客户端;

  • 请求转发:客户端发起一次请求,服务器端将最终的结果直接返回客户端,在其中可能需要服务器端的其他资源,服务器请求其他资源,并返回给客户端;

  • 重定向:客户端发起一次请求,服务器端将请求的结果地址返回给客户端,由客户端再次发起请求并获得结果;

cookie和session

  • cookie:在客户端存储技术,安全性低

实现:在客户端记录密码功能
客户端向服务器首次请求时创建cookie,并且由服务器响应回给客户端,客户端后续再次请求时,由服务器查询cookie的值

首次请求:
在服务器端的处理:
创建cookie并记录信息
Cookie cookie = new Cookie();
设置时间:
cookie.setMaxAge(秒)
通过response响应给客户端:
response.addCookie(cookie);
后续请求:向服务器发请求,服务器端查找cookie值,根据查到的结果再进一步处理;(后续异步处理实现)
  • session:在服务器端存储技术,也叫会话,后续实现购物车,安全性高

实现:记录用户登录状态、购物车信息、验证码...

由服务器自动创建,并保存在客户端的cookie中,有一个唯一的sessionid;如果在sessionid不变的情况下,那么就判断为同一个会话期间,可以在这个会话期间存取数据;
获得session:
HttpSession session = request.getSession();
存数据:
session.serAttribute(String名,Object值)
取数据:
session.getAttribute(String名)

结合EL表达式:
内置对象:sessionScope
${requestScope.名} 同理 ${sessionScope.名}

session时间:
默认30分钟
在web.xml中修改:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
指的是连续的动作中间的空闲时间:
注:到时间,session会话失效,需要重新登陆;

注销功能:
session.invalidata()方法:强制session失效;

异步请求ajax

局部刷新技术;由事件触发函数,在函数中向服务器发起请求;

  • 步骤:

1.创建异步对象: 
var xxhr = new XMLHttpRequest();
异步请求基于这个对象;大部分浏览器都支持;
如果不支持,增加判断:
window.XMLHttpRequest返回值;
创建新对象:new ActiveXObject(Microsoft.XMMHTTP)
2.发送请求地址和请求方式:
xxhr.open("请求方式","请求地址")
get:路径中携带参数
xxhr.open("get","请求地址?参数名=值&参数名=值")
post:可以再send中携带参数,必须在send前边添加:
xxhr.open("请求方式","请求地址")
xxhr.setRequrstHearder("Content-type","application/x-www-form-urlencoded")

3.发送:
get:xxhr.send();
post:xxhr.send("请求地址?参数名=值&参数名=值")

....服务器处理过程

4.判断向服务器发送请求状态:
请求的五种状态码:
0:请求初始化 1:服务器已连接 2:请求已接收 3:请求处理中 4:请求已完成
xxhr.onreadystatechange=function(){
5.服务器的请求状态完成
再次判断,确定请求已被接受、服务器的连接已经建立、请求处理已完成;
if(xxhr.readyState==4){
6.判断客户端的响应状态
在请求完成后,判断响应码:4xx 5xx 3xx... 200表示响应成功
if(xxhr.status==200){
7.接收服务器端的返回数据
处理服务器返回的数据:字符串类型、json、xml
//--字符、json通过typof判断返回结果类型
//如果是json串,通过json.parse(json串)转为引用对象
xxhr.responseText
}
}
}

json

数据交互格式;JavaScript Object Notation,(js对象标记)

  • 语法

{} 表示对象
[] 表示数组
: 表示属性与值之间的间隔
, 表示属性之间的分隔
例:{"name":"hello","age":20,"gender":true,"hobby":["1","2","3"]}
  • json解析:java类与字符串之间的转换

解析技术:FastJson、Gson、JackSon
例:FasteJson.jar
转为字符串:JSON.toJsonString(java类)
转为Java类:JSON.parseObject(json类,类对象)
  • 浏览器处理JSON串

json转为JS的引用对象:JSON.parse(json串); 返回js引用对象
JS引用对象转为json串:JSON.stringify(引用对象); 返回json串

中文乱码问题

服务器端与客户端编码不一致导致的

  • 处理响应的编码方式:

HttpServletResponse类型 respone----响应对象
respone.setCharacterEncoding("utf-8");
  • 接收前端表单提交的中文乱码:

方案:使用String对象重新构造
new String(属性.getBytes("原编码"),"新编码")
例:String gender=new String(gender.getBytes("iso-8859-1"),"utf-8");

项目目标

javaweb项目: 前端页面:jsp页面、bootstrap前端框架、jquery(JS函数库)、ajax异步刷新技术(jquery封装ajax)、css(样式布局)、html(定义标签)、vue前端框架 后端:servlet控制器、MVC架构、jstl+el数据展示、maven工程(自动化构建工程)

电商项目:用户模块、商品模块、类别模块、地址模块、购物车模块、订单模块、后台管理模块 前台:给用户展示数据,提供浏览--查---jsp页面、bootstrap搭建页面 后台:管理员对数据的管理,体现对数据的增、删、改(DML)---html页面、vue展示数据

maven

自动化构建工具: 管理jar包; 自动编译、打包、测试、部署等

下载

配置环境变量: MAVEN_HOME:maven的安装根目录 path:bin目录

  • 配置环境变量:

本仓库:目录,用于存放下载好的jar文件
conf/settings.xml配置文件:
本地仓库路径:<localRepository>E:/maven/repository</localRepository>
设置jdk版本号:
<profiles>
<!-- 在已有的profiles标签中添加profile标签 -->
<profile>
<id>myjdk</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<!-- 让增加的 profile生效 -->
<activeProfiles>
<activeProfile>myjdk</activeProfile>
</activeProfiles>
  • 仓库:

    用于存放jar的目录

    本地仓库:

    settings.xml中设置 localRepository标签 中央仓库: 地址:http://repo.maven.apache.org/maven2/ 搜索依赖坐标的地址:https://mvnrepository.com/ 公共仓库:在settings.xml中配置 miror标签

    			<mirror>
    <id>aliyun</id>
    <!-- 中心仓库的 mirror(镜像) -->
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <!-- aliyun仓库地址 以后所有要指向中心仓库的请求,都会指向aliyun仓库-->
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>

 

bootstrap前端框架

  • 布局容器:

<div class="container"></div>
  • 栅格:

每行用row定义
<div class="row"></div>
每行分为多个列,最多12行
<div class="col-md-列数"></div>
注:sm-小屏幕;lg-大屏幕;md-中等屏幕;
注:设置列宽;行列高度自适应;需要设置内容高度;
  • 样式/组件/插件

直接将bootstrap官网的内容直接CV并且相应的修改

 

jQuery

是js的函数库;

  • 基本语法:从文档加载开始,当加载完成获得dom对象,并且绑定事件,以及事件触发时所执行的函数

//替换window.onload=function(){}
$(function(){
//加载文档

//替换domcument.getElementById()
$("#id名").事件名(function(){
//由事件引起的函数
})
})
  • 选择器:获得一个dom对象

$("选择器名称") ---获得jquery对象
注:document.getElementById();获得的是一个dom对象;
jquery对象不能与dom对象直接相等;
  • 函数:

需要由事件来调用
function(){
//执行的代码
}
  • jquery-ajax


get请求:
$.get(url,params,fn,type)
poat请求:
$.post(url,params,fn,type)
*$.getJSON(url,params,fn):直接返回json数据

url:请求的路径
params:参数,key:value
fn:请求成功后的回调函数,请求成功后执行的函数
type:返回数据格式,默认text文本 可转成json格式

 

过滤器

过滤器有拦截功能,可以解决service中冗余代码、登录验证功能;

编写:实现filter接口

重写方法 init/destroy/doFilter

Class 类名 implements Filter{
@Override
public void init(FilterConfig filterConfig) throw ServletException{
//初始化方法
}

public void doFilter(ServletRequest servletRequest,ServletResponse servletRespones) throw IOExeption,ServletExceotion{
//过滤链:处理业务逻辑判断
//再根据结果跳转不同地址
//放行
filterChain.doFilter(servletRequest ,servletResponse)
//拦截 跳转其他路径
}

@Override
public void destroy() {
//销毁方法
}

}

注册:web.xml中配置

<filter>
<filter-name></filter-name>
<filter-class></filter-class>
</filter>
<filter-mapping>
<filter-name></filter-name>
<filter-class></filter-class>
</filter-mapping>

注解:

@WebFilter("映射路径")

过滤器中路径映射方式:

	精确匹配:/user
后缀匹配:***.后缀**,例:user.do goods.action
通配符:/*,匹配任意路径

监听器

xxxListener,用于监听请求域、会话域、服务器域的创建、销毁、添加对象、更改对象、移除对象

创建监听接口:实现接口,重写抽象方法

	ServletRequestListener 监听请求创建、销毁
ServletRequestAttributeListener 监听请求添加对象、更改对象、移除对象
HttpSessionListener 监听会话创建、销毁
HttpSessionAttributeListener 监听会话添加对象、更改对象、移除对象
ServletContextListener 监听服务器创建、销毁
ServletContextAttributeListener 监听服务器添加对象、更改对象、移除对象

注册监听:

配置:
web.xml:
<listener>
<listener-class>全类名称</listener-class>
</listener>
注解:@WebListener

 

验证码

依赖于servlet类型,实现BufferedImage的绘制,最终以输出流形式向页面展示;

BufferedImage图形绘制

new BufferedImage(宽,高,颜色类别Rgb)

Graphics图形上下文对象

设置相关的图形、颜色、字体、背景、字符....
获得对象:
Graphics g = getGraphics();

ImageIO图象输入/出流对象

write(bufferedImage对象,文件类型,输出流);

 

posted @   永远的幼稚  阅读(600)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示