hls协议分析

目录

  • 1、简介
    • 1.1、 综述
    • 1.2 、HLS 协议编码格式要求
    • 1.3 、HLS 协议优势
    • 1.4 、HLS 协议劣势
    • 1.5 、框架图
  • 2、m3u8
    • 2.1 、单码率适配流m3u8文件
    • 2.2 、多码率适配流m3u8文件
    • 2.3 、Playlist file
    • 2.4 、Tags
  • 3、ts
    • 3.1 、ts文件结构
    • 3.2、ts文件结构部分截图
    • 3.3、ts层(ts header)
    • 3.4、ts层(adaptation field)
      • 3.4.1、视频流和音频流加 adaptation field 情况部分截图
    • 3.5、ts层(PAT)
      • 3.5.1、PAT情况截图
    • 3.6、ts层(PMT)
      • 3.6.1、PMT情况截图

1、简介

1.1、 综述

作为 Apple 提出的一种基于 HTTP 的协议,HLS(HTTP Live Streaming)用于解决实时音视频流的传
输。尤其是在移动端,由于 iOS /H5 不支持 flash,使得 HLS 成了移动端实时视频流传输的首选。HLS
经常用在直播领域,一些国内的直播云通常用 HLS 拉流(将视频流从服务器拉到客户端)。 HLS 值得诟
病之处就是其延迟严重,延迟通常在 10-30s 之间。

HLS(HTTP Live Streaming) 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。
HLS 协议由三部分组成:HTTP、M3U8、TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS
是音视频的媒体信息。

1.2 、HLS 协议编码格式要求

视频的编码格式:H264
音频的编码格式:AAC、MP3、AC-3
视频的封装格式:ts
保存 ts 索引的 m3u8 文件

1.3 、HLS 协议优势

1、HLS 相对于 RTMP 来讲使用了标准的 HTTP 协议来传输数据,可以避免在一些特殊的网络环境下被屏蔽。

2、HLS 相对 RTMP 在服务器端做负载均衡要简单得多。因为 HLS 是基于无状态协议 HTTP 实现的,客户端只需要按照顺序使用下载存储在服务器的普通 ts 文件进行播放就可以。而 RTMP 是一种有状态协议,很难对视频服务器进行平滑扩展,因为需要为每一个播放视频流的客户端维护状态。

3、HLS 协议本身实现了码率自适应,在不同带宽情况下,设备可以自动切换到最适合自己码率的视频播放。

1.4 、HLS 协议劣势

1、HLS 协议在直播的视频延迟时间很难做到 10 s 以下延时,而 RTMP 协议的延时可以降到 1s 左右。

1.5 、框架图

hls协议分析_第1张图片
hls协议分析_第2张图片

2、m3u8

m3u8 文件是用文件方式对媒体文件进行描述,由一些列标签组成。

2.1 、单码率适配流m3u8文件

 #EXTM3U
 #EXT-X-VERSION:3
 #EXT-X-ALLOW-CACHE:YES
 #EXT-X-MEDIA-SEQUENCE:2
 #EXT-X-TARGETDURATION:16
 #EXTINF:14.357, no desc
 livestream-2.ts
 #EXTINF:15.617, no desc
 livestream-3.ts
 #EXTINF:14.358, no desc
 livestream-4.ts
 #EXTINF:15.618, no desc
 livestream-5.ts
 #EXTINF:11.130, no desc
 livestream-6.ts

2.2 、多码率适配流m3u8文件

 #EXTM3U
 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000
 http://example.com/low.m3u8
 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000
 http://example.com/mid.m3u8
 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000
 http://example.com/hi.m3u8
 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"
 http://example.com/audio-only.m3u8

包含多种比特率的 Master Playlist。该文件是一个实际使用中的顶级 m3u8 文件,该文件中又定义了
http://example.com/low.m3u8 、 http://example.com/mid.m3u8 等 几 个 二 级文件 。 顶 级m3u8 文件主要是做码率适配的,二级 m3u8 才是真正的切片文件,客户端会默认选择码率最高的请求,如果发现码率达不到,会请求降低码率的流。客户端拿到二级 m3u8 文件后,会继续请求里面的文件,这时就可以进行播放了。

2.3 、Playlist file

一个 m3u 的 Playlist 就是一个由多个独立行组成的文本文件,每行由回车/换行区分。每一行可以是一个
URI、空白行或是一个 以 “#” 号开头的字符串,并且空格只能存在于一行中不同元素间的分隔。
一个 URI 表示一个媒体段或是 “variant Playlist file”(最多支持一层嵌套,即一个 m3u8 文件中嵌套另
一个 m3u8),以 “EXT” 开头的表示一个 “tag”,否则表示注释,直接忽略。

2.4 、Tags

1、
#EXTM3U :
每个 m3u8 文件第一行必须是这个 tag,如上面的两个示例。

2、
#EXT-X-VERSION:
m3u8文件版本号,比如#EXT-X-VERSION:3。

3、
#EXTINF :
指定每个媒体段(ts)的持续时间,这个仅对其后面的 URI 有效,
每两个媒体段 URI 间被这个 tag 分隔开其格式为: #EXTINF: </span>
比如<span class="token comment">#EXTINF:14.357, no desc</span>
duration:表示持续的时间(秒),<span class="token string">"Durations MUST be integers if the protocol version of the Playlist file is less than 3"</span>,否则可以是浮点数。

4、
<span class="token comment">#EXT-X-BYTERANGE :</span>
表示媒体段是一个媒体 URI 资源中的一段,只对其后的 media URI 有效,
格式: <span class="token comment">#EXT-X-BYTERANGE:<n>[@o]</span>
n:表示这个区间的大小
o:表示在 URI 中的 offset
The EXT-X-BYTERANGE tag appeared <span class="token keyword">in</span> version 4 of the protocol

5、
<span class="token comment">#EXT-X-TARGETDURATION :</span>
指定当前视频流中的单个切片(即 ts)文件的最大时长(秒)。
所以
<span class="token comment">#EXTINF :</span>
中指定的时间长度必须小于或是等于这个最大值。这个 tag 在整个 Playlist 文件中只能出现1次(在嵌套的情况下,
一般有真正ts url 的 m3u8 才会出现该 tag)。格式: <span class="token comment">#EXT-XTARGETDURATION:<s></span>
s:表示最大的秒数。

6、
<span class="token comment">#EXT-X-MEDIA-SEQUENCE :</span>
每一个 media URI 在 Playlist 中只有唯一的序号,相邻之间序号 +1。
格式:<span class="token comment">#EXT-X-MEDIA-SEQUENCE:<number> </span>
一个 media URI 并不是必须要包含的,如果没有,默认为 0.
 
 7、
<span class="token comment">#EXT-X-KEY :</span>
表示怎么对 media segments 进行解码。其作用范围是下次该 tag 出现前的所有media URI。
格式为: <span class="token comment">#EXT-X-KEY:<attribute-list></span>
NONE 或者 AES-128。如果是 NONE,则 URI 以及 IV 属性必须不存在,如果是 AES-128<span class="token punctuation">(</span>Advanced Encryption Standard<span class="token punctuation">)</span>,
则 URI 必须存在,IV 可以不存在。对于 AES-128 的情况,keytag 和 URI 属性共同表示了一个 key 文件,通过 URI 可以获得这个key,
如果没有 IV(Initialization Vector),则使用序列号作为 IV 进行编解码,将序列号的高位赋到 16 个字节的 buffer 中,
左边补 0;如果有 IV,则将该值当成 16 个字节的 16 进制数。

8、
<span class="token comment">#EXT-X-PROGRAM-DATE-TIME :</span>
将一个绝对时间或是日期和一个媒体段中的第一个 sample 相关
联,只对下一个 media URI 有效,
格式: <span class="token comment">#EXT-X-PROGRAM-DATE-TIME:<YYYY-MMDDThh:mm:ssZ></span>
例如: <span class="token comment">#EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00</span>

9、
<span class="token comment">#EXT-X-ALLOW-CACHE :</span>
是否允许做 cache,这个可以在 Playlist 文件中任意地方出现,
并且最多只出现一次,作用效果是所有的媒体段。
格式: <span class="token comment">#EXT-X-ALLOW-CACHE:<YES|NO></span>

10、
<span class="token comment">#EXT-X-PLAYLIST-TYPE :</span>
提供关于 Playlist 的可变性的信息,这个对整个 Playlist 文件有效,是可选的,
格式: <span class="token comment">#EXT-X-PLAYLIST-TYPE:<EVENT|VOD></span>
VOD,即为点播视频,服务器不能改变 Playlist 文件,换句话说就是该视频全部的 ts 文件已经被生成好了。
EVENT,就是实时生成 m3u8 和 ts 文件。服务器不能改变或是删除 Playlist 文件中的任何部分,
但是可以向该文件中增加新的一行内容。它的索引文件一直处于动态变化中,
播放的时候需要不断下载二级index文件。

11、
<span class="token comment">#EXT-X-ENDLIST :</span>
表示 m3u8 文件的结束,live m3u8 没有该 tag。它可以在 Playlist 中任意位置出现,
但是只能出现一个,格式: <span class="token comment">#EXT-X-ENDLIST</span>

12、
<span class="token comment">#EXT-X-MEDIA :</span>
被用来在 Playlist 中表示相同内容的不同语种/译文的版本,
比如可以通过使用 3个这种 tag 表示 3 种不同语音的音频,
或者用 2 个这个 tag 表示不同⻆度的 video。在 Playlist中,
这个标签是独立存在的,
其格式: <span class="token comment">#EXT-X-MEDIA:<attribute-list></span>
该属性列表中包含:URI、TYPE、GROUP-ID、LANGUAGE、NAME、DEFAULT、
AUTOSELECT。

URI:如果没有,则表示这个 tag 描述的可选择版本在主 PlayList 的 EXT-X-STREAM-INF 中存在。

TYPE:AUDIO and VIDEO。

GROUP-ID:具有相同 ID 的 MEDIAtag,组成一组样式。

LANGUAGE:identifies the primary language used <span class="token keyword">in</span> the rendition。

NAME:The value is a quoted-string containing a human-readable description of the rendition.
 If the LANGUAGE attribute is present <span class="token keyword">then</span> this description SHOULD be <span class="token keyword">in</span> that language。

DEFAULT:YES 或是 NO,默认是 No,如果是 YES,则客户端会以这种选项来播放,除非用户自己进行选择。

AUTOSELECT:YES 或是 NO,默认是 No,如果是 YES,则客户端会根据当前播放环境来进行选择(用户没有根据自己偏好进行选择的前提下)。

The EXT-X-MEDIA tag appeared <span class="token keyword">in</span> version 4 of the protocol。

13、
<span class="token comment">#EXT-X-STREAM-INF :</span>
指定一个包含多媒体信息的 media URI 作为 Playlist,
一般做 m3u8 的嵌套使用,
它只对紧跟后面的 URI 有效,
格式: <span class="token comment">#EXT-X-STREAM-INF:<attribute-list></span>
常用的属性如下:

BANDWIDTH:带宽,必须有。

PROGRAM-ID:该值是一个十进制整数,唯一地标识一个在 Playlist 文件范围内的特定的描述。一个 Playlist 文件中可能包含多个有相同 ID 的此 tag。

CODECS:指定流的编码类型,不是必须的。

RESOLUTION:分辨率。

AUDIO:这个值必须和 AUDIO 类别的 <span class="token string">"EXT-X-MEDIA"</span> 标签中 <span class="token string">"GROUP-ID"</span> 属性值相匹配。

VIDEO:同上。

14、
<span class="token comment">#EXT-X-DISCONTINUITY :</span>
当遇到该 tag 的时候说明以下属性发生了变化:

<span class="token function">file</span> <span class="token function">format</span> :文件格式

number and <span class="token function">type</span> of tracks :轨道

encoding parameters :编码参数

encoding sequence :编码序号

timestamp sequence :时间戳序号

15、
<span class="token comment">#ZEN-TOTAL-DURATION :</span>
表示这个 m3u8 所含 ts 的总时间长度
</code></pre> 
  <h1>3、ts</h1> 
  <p>ts 文件为传输流文件,视频编码主要格式为 H264/MPEG4,音频为 AAC/MP3。<br> ts 文件分为三层:<br> ------ ts 层:Transport Stream,是在 pes 层的基础上加入数据流的识别和传输必须的信息。<br> ------ pes 层: Packet Elemental Stream,是在音视频数据上加了时间戳等对数据帧的说明信息。<br> ------ es 层:Elementary Stream,即音视频数据。<br> <a href="http://img.e-com-net.com/image/info8/b823fe3556644bfd96762b1564618f87.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b823fe3556644bfd96762b1564618f87.jpg" alt="hls协议分析_第3张图片" width="650" height="436" style="border:1px solid black;"></a></p> 
  <h2>3.1 、ts文件结构</h2> 
  <p><a href="http://img.e-com-net.com/image/info8/159723e9f11746d4a4a4f1a135bcb285.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/159723e9f11746d4a4a4f1a135bcb285.jpg" alt="hls协议分析_第4张图片" width="534" height="298" style="border:1px solid black;"></a><br> PAT(Program Association Table)节目关联表:主要的作用就是指明了 PMT 表的 PID 值。<br> PMT(Program Map Table)节目映射表:主要的作用就是指明了音视频流的 PID 值。</p> 
  <h2>3.2、ts文件结构部分截图</h2> 
  <p>刚开始的TS包是PAT(Program Association Table):节目关联表。<br> 再跟的TS包是PMT(Program Map Table):节目映射表。<br> 然后再跟视频、音频的TS包。<br> <a href="http://img.e-com-net.com/image/info8/0ff40bc9655c43e5a85323de4f1eccd2.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/0ff40bc9655c43e5a85323de4f1eccd2.jpg" alt="hls协议分析_第5张图片" width="650" height="429" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/24234e33b4b246628a54a1ec1bbbdb9b.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/24234e33b4b246628a54a1ec1bbbdb9b.jpg" alt="hls协议分析_第6张图片" width="650" height="403" style="border:1px solid black;"></a></p> 
  <h2>3.3、ts层(ts header)</h2> 
  <p>ts 包大小固定为 188 字节,ts 层分为三个部分:ts header、adaptation field、payload。<br> ts header :固定 4 个字节。<br> adaptation field : 可能存在也可能不存在,主要作用是给不足 188 字节的数据做填充。<br> payload : pes 数据。<br> <a href="http://img.e-com-net.com/image/info8/dd8ad427811f40b4ad24a1003c0f401d.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/dd8ad427811f40b4ad24a1003c0f401d.jpg" alt="hls协议分析_第7张图片" width="650" height="369" style="border:1px solid black;"></a><br> ts 层的内容是通过 PID 值来标识的,主要内容包括:PAT 表、PMT 表、音频流、视频流。<br> 解析 ts 流要先找到 PAT 表,只要找到 PAT 就可以找到 PMT,然后就可以找到音视频流了。<br> PAT 表的和 PMT 表需要定期插入 ts 流,因为用户随时可能加入 ts 流,这个间隔比较小,<br> 通常每隔几个视频帧就要加入 PAT和 PMT。<br> PAT 和 PMT 表是必须的,还可以加入其它表如 SDT(业务描述表)等,不过 hls 流只要有<br> PAT 和 PMT 就可以播放了。</p> 
  <h2>3.4、ts层(adaptation field)</h2> 
  <p>ts 包大小固定为 188 字节,ts 层分为三个部分:ts header、adaptation field、payload。<br> ts header :固定 4 个字节。<br> adaptation field : 可能存在也可能不存在,主要作用是给不足 188 字节的数据做填充。<br> payload : pes 数据。<br> <a href="http://img.e-com-net.com/image/info8/defaa14f3b09479a912f9b554d9690e2.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/defaa14f3b09479a912f9b554d9690e2.jpg" alt="hls协议分析_第8张图片" width="650" height="174" style="border:1px solid black;"></a><br> 自适应区的长度要包含传输错误指示符标识的一个字节。pcr 是节目时钟参考,pcr、dts、pts 都是对同<br> 一个系统时钟的采样值,pcr 是递增的,因此可以将其设置为 dts 值,音频数据不需要 pcr。如果没有字<br> 段,ipad 是可以播放的,但 vlc 无法播放。打包 ts 流时 PAT 和 PMT 表是没有 adaptation field 的,<br> 不够的长度直接补 0xff 即可。视频流和音频流都需要加 adaptation field,通常加在一个帧的第一个 ts<br> 包和最后一个 ts 包中,中间的 ts 包不加。</p> 
  <p><strong>adaptation field 详解:</strong><br> flag 标志位:0x10就表示有PCR,下面视频流截图也是这个情况,0x50是random_access_indicator标志位和PCR_flag标志位都有。<br> <a href="http://img.e-com-net.com/image/info8/a3269966ff7141dcac87ef4b6afd315f.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a3269966ff7141dcac87ef4b6afd315f.jpg" alt="hls协议分析_第9张图片" width="650" height="831" style="border:1px solid black;"></a></p> 
  <h3>3.4.1、视频流和音频流加 adaptation field 情况部分截图</h3> 
  <p><strong>1、视频帧:</strong><br> I帧:第一个TS包和最后一个TS包有adaptation field,根据ts header 最后一个字节判断。<br> (第一个TS包要存PCR)<br> <a href="http://img.e-com-net.com/image/info8/333243369bb3449fb4737ac478542aad.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/333243369bb3449fb4737ac478542aad.jpg" alt="hls协议分析_第10张图片" width="650" height="497" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/8400f108a1a34719bfe130248dcf6a35.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/8400f108a1a34719bfe130248dcf6a35.jpg" alt="hls协议分析_第11张图片" width="650" height="346" style="border:1px solid black;"></a><br> P帧:最后一个TS包有adaptation field,根据ts header 最后一个字节判断。<br> <a href="http://img.e-com-net.com/image/info8/0d9e3a5447344b49a3603fe72753702f.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/0d9e3a5447344b49a3603fe72753702f.jpg" alt="hls协议分析_第12张图片" width="650" height="227" style="border:1px solid black;"></a><br> <strong>2、音频帧:</strong><br> 最后一个TS包有adaptation field,根据ts header 最后一个字节判断。<br> <a href="http://img.e-com-net.com/image/info8/eed779a46d6745b8a105540989919d43.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/eed779a46d6745b8a105540989919d43.jpg" alt="hls协议分析_第13张图片" width="650" height="203" style="border:1px solid black;"></a></p> 
  <h2>3.5、ts层(PAT)</h2> 
  <p>PAT(Program Association Table)节目关联表:主要的作用就是指明了 PMT 表的 PID 值。<br> <a href="http://img.e-com-net.com/image/info8/4b237cbe3834410dbd65f7c3192f08fb.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/4b237cbe3834410dbd65f7c3192f08fb.jpg" alt="hls协议分析_第14张图片" width="650" height="600" style="border:1px solid black;"></a></p> 
  <h3>3.5.1、PAT情况截图</h3> 
  <p>1、下面0x01字节表示有PMT。<br> 2、下面0XF0 01的后13b就是PMT的PID(4097)。<br> (注意这个PID与ts header的pid的字节序是不同的)<br> <a href="http://img.e-com-net.com/image/info8/e9591696efa84133a9eb49e527bab19f.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e9591696efa84133a9eb49e527bab19f.jpg" alt="hls协议分析_第15张图片" width="650" height="529" style="border:1px solid black;"></a></p> 
  <h2>3.6、ts层(PMT)</h2> 
  <p>PMT(Program Map Table)节目映射表:主要的作用就是指明了音视频流的 PID 值。<br> <a href="http://img.e-com-net.com/image/info8/d12c4c25d00f4b4db3fab2fa25e0356d.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/d12c4c25d00f4b4db3fab2fa25e0356d.jpg" alt="hls协议分析_第16张图片" width="650" height="334" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/e71a00dba158440a84509b15155f2236.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e71a00dba158440a84509b15155f2236.jpg" alt="hls协议分析_第17张图片" width="650" height="429" style="border:1px solid black;"></a></p> 
  <h3>3.6.1、PMT情况截图</h3> 
  <p>1、下面0xE1 00字节后13b表示PCR的PID(256)。<br> 2、下面0X0F 字节就是stream type AAC。<br> 3、下面0xE1 01字节后13b就是elementary_PID (257)。<br> 4、下面0X1B 字节就是stream type H264。<br> 5、下面0xE1 00字节后13b就是elementary_PID (256)。<br> <a href="http://img.e-com-net.com/image/info8/50e9b25279094b7bbf66bfcd1e7b040b.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/50e9b25279094b7bbf66bfcd1e7b040b.jpg" alt="hls协议分析_第18张图片" width="650" height="589" style="border:1px solid black;"></a></p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1396498071013085184"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(hls,hls,m3u8,ts,流媒体)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1899358951691055104.htm"
                           title="Python字符串操作" target="_blank">Python字符串操作</a>
                        <span class="text-muted">weixin_30871905</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>转自http://blog.chinaunix.net/u/19742/showart_382176.html#Python字符串操作'''1.复制字符串'''#strcpy(sStr1,sStr2)sStr1='strcpy'sStr2=sStr1sStr1='strcpy2'printsStr2'''2.连接字符串'''#strcat(sStr1,sStr2)sStr1='strcat'sSt</div>
                    </li>
                    <li><a href="/article/1899352523634962432.htm"
                           title="HIBERNATE - 符合Java习惯的关系数据库持久化" target="_blank">HIBERNATE - 符合Java习惯的关系数据库持久化</a>
                        <span class="text-muted">popkiler</span>
<a class="tag" taget="_blank" href="/search/Atleap%E4%BB%A3%E7%A0%81%E8%AF%BB%E8%A7%A3/1.htm">Atleap代码读解</a><a class="tag" taget="_blank" href="/search/hibernate/1.htm">hibernate</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/session/1.htm">session</a><a class="tag" taget="_blank" href="/search/class/1.htm">class</a><a class="tag" taget="_blank" href="/search/payment/1.htm">payment</a>
                        <div>HIBERNATE-符合Java习惯的关系数据库持久化Hibernate2参考文档2.1.1TableofContents前言1.在Tomcat中快速上手1.1.开始Hibernate之旅1.2.第一个可持久化类1.3.映射cat1.4.与猫同乐1.5.结语2.体系结构2.1.总览2.2.持久化对象标识(PersistentObjectIdentity)2.3.JMX集成2.4.JCA支持3.Se</div>
                    </li>
                    <li><a href="/article/1899347352498532352.htm"
                           title="Python 字符串操作" target="_blank">Python 字符串操作</a>
                        <span class="text-muted">iteye_13776</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/C/1.htm">C</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a>
                        <div>Python截取字符串使用变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾。#例1:字符串截取str='12345678'printstr[0:1]>>1#输出str位置0开始到位置1以前的字符printstr[1:6]>>23456#输出str位置1开始到位置6以前的字符num=18str='0000'+str(num)#合并字</div>
                    </li>
                    <li><a href="/article/1899345715394572288.htm"
                           title="快速入门:利用fast-elasticsearch-vector-scoring提升ES向量搜索效率" target="_blank">快速入门:利用fast-elasticsearch-vector-scoring提升ES向量搜索效率</a>
                        <span class="text-muted">劳泉文Luna</span>

                        <div>快速入门:利用fast-elasticsearch-vector-scoring提升ES向量搜索效率fast-elasticsearch-vector-scoringScoredocumentsusingembedding-vectorsdot-productorcosine-similaritywithESLuceneengine项目地址:https://gitcode.com/gh_mirro</div>
                    </li>
                    <li><a href="/article/1899344959870398464.htm"
                           title="【PX4】Ubuntu20.04安装PX4教程" target="_blank">【PX4】Ubuntu20.04安装PX4教程</a>
                        <span class="text-muted">davidson1471</span>
<a class="tag" taget="_blank" href="/search/PX4/1.htm">PX4</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/%E6%97%A0%E4%BA%BA%E6%9C%BA/1.htm">无人机</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a>
                        <div>*建议早上安装*1.下载以往版本从github上clone源码gitclonehttps://github.com/PX4/PX4-Autopilot.git进入PX4-Autopilot文件夹cdPX4-Autopilot查看当前分支,位于origin/maingitstatus查看所有远程分支,带release的gitbranch-r|grep"release"切换到发行分支v1.12gitc</div>
                    </li>
                    <li><a href="/article/1899343699440103424.htm"
                           title="Qt 串口类QSerialPort 使用笔记" target="_blank">Qt 串口类QSerialPort 使用笔记</a>
                        <span class="text-muted">一对一答疑的编程作家朱文伟</span>
<a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>Qt串口类QSerialPort使用笔记虽然现在大多数的家用PC机上已经不提供RS232接口了。但是由于RS232串口操作简单、通讯可靠,在工业领域中仍然有大量的应用。Qt以前的版本中,没有提供官方的对RS232串口的支持,编写串口程序很不方便。现在好了,在Qt5.1中提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。本文就简单的讲讲QtSerialPort模块的使用。</div>
                    </li>
                    <li><a href="/article/1899339285023223808.htm"
                           title="Webpack打包构建流程" target="_blank">Webpack打包构建流程</a>
                        <span class="text-muted">码上跑步</span>
<a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a>
                        <div>webpack的打包构建流程为什么需要打包?在前端有非常多的资源,如css、js、vue、vue、图片、字体等。有些资源需要加工处理1.ts->jsts-loader2.css->css-loader+style-loader3.图片->file-loader+url-loader4.html->html-webpack-plugin需要对产物进行优化optimization(webpack优化配</div>
                    </li>
                    <li><a href="/article/1899335504252432384.htm"
                           title="github 仓库查看git第一次commit的记录" target="_blank">github 仓库查看git第一次commit的记录</a>
                        <span class="text-muted">HHHHy2019</span>
<a class="tag" taget="_blank" href="/search/GIT/1.htm">GIT</a><a class="tag" taget="_blank" href="/search/github/1.htm">github</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a>
                        <div>github仓库查看git第一次commit的记录步骤我们这里选仓库TuSimple/naive-ui,首页显示这个仓库最新的git的状态是8978fa923minutesagoGitstats4,460commits,说明现在有4460个commit。我们再点击4,460commits进入查看commit的页面,滑到最底部,点击Older,(网址)地址栏显示为https://github.com</div>
                    </li>
                    <li><a href="/article/1899334748313022464.htm"
                           title="vue打包编译【自动删除node_modules下的.cache缓存文件夹】" target="_blank">vue打包编译【自动删除node_modules下的.cache缓存文件夹】</a>
                        <span class="text-muted">Eternitysy</span>
<a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a>
                        <div>vue项目不断打包编译后,在node_modules目录下的.cache文件夹里的文件就越来越多,手动删除数量巨大,时间太长,下面是自动删除.cache这个文件夹的方法1.先安装依赖包rimraf:npminstallrimraf-g--save-dev2.在package.json文件的scripts部分添加一个脚本命令:"scripts":{"clean":"rimrafnode_module</div>
                    </li>
                    <li><a href="/article/1899331595228213248.htm"
                           title="git subtree 管理项目子模块" target="_blank">git subtree 管理项目子模块</a>
                        <span class="text-muted">芥末的无奈</span>
<a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/subtree/1.htm">subtree</a>
                        <div>使用场景当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们可以使用git的subtree功能常用命令gitsubtreeadd--prefix=--squash添加子仓库gitsubtreepull--prefix=--squash拉取更新子仓库gitsubtreepush--prefix=推送修改到子仓库如何使用1.创建带su</div>
                    </li>
                    <li><a href="/article/1899328948634972160.htm"
                           title="CSS入门指南:从零开始学习网页开发——(一)简介" target="_blank">CSS入门指南:从零开始学习网页开发——(一)简介</a>
                        <span class="text-muted">GIS小白吃</span>
<a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>一、什么是CSS?CSS(CascadingStyleSheets,层叠样式表)是一种用于描述网页的外观和布局的样式表语言。它通过定义网页元素的样式(如颜色、字体、边距等)来与HTML内容分离,提升了网页的可维护性和设计的灵活性。CSS的核心目的是增强网页的表现力。早期的网页仅使用HTML来进行内容的展示,但由于HTML只能描述内容的结构,页面设计和内容变得难以管理。于是,CSS作为一种辅助技术应</div>
                    </li>
                    <li><a href="/article/1899328570132590592.htm"
                           title="git submodule管理的仓库怎么删除子仓库" target="_blank">git submodule管理的仓库怎么删除子仓库</a>
                        <span class="text-muted">绛洞花主敏明</span>
<a class="tag" taget="_blank" href="/search/git/1.htm">git</a>
                        <div>删除Git子模块需要执行一系列步骤,以确保从项目中彻底移除子模块及其相关配置。以下是详细的步骤:1.取消初始化子模块运行以下命令以取消子模块的初始化,这会从.git/config文件中移除子模块的配置:gitsubmoduledeinit-f-f参数用于强制执行,避免因子模块目录中有未提交的更改而导致命令失败。2.删除子模块目录从工作目录中删除子模块的文件夹:rm-rf3.从.gitmodules</div>
                    </li>
                    <li><a href="/article/1899327433245519872.htm"
                           title="Dify 工作流组件完全开发指南" target="_blank">Dify 工作流组件完全开发指南</a>
                        <span class="text-muted">程序员查理</span>
<a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF/1.htm">web前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a>
                        <div>1.如何添加新的工作流节点组件1.1添加新节点的步骤要在Dify工作流中添加一个新的节点类型,需要完成以下步骤:1.1.1更新节点类型枚举首先,在app/components/workflow/types.ts文件中的BlockEnum中添加新节点类型:exportenumBlockEnum{//现有节点类型//...//添加新节点类型NewNodeType='new-node-type',}1.</div>
                    </li>
                    <li><a href="/article/1899325544734978048.htm"
                           title="Java学习笔记——并发编程(三)" target="_blank">Java学习笔记——并发编程(三)</a>
                        <span class="text-muted">__________习惯</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>一、wait和notifywait和notify原理Owner线程发现条件不满足,调用wait方法,即可进入WaitSet变为WAITING状态BLOCKED和WAITING的线程都处于阻塞状态,不占用CPU时间片BLOCKED线程会在Owner线程释放锁时唤醒WAITING线程会在Owner线程调用notify或notifyAll时唤醒,但唤醒后并不意味着立刻获得锁,仍需进入EntryList重</div>
                    </li>
                    <li><a href="/article/1899321376813150208.htm"
                           title="git subtree 高频使用方法" target="_blank">git subtree 高频使用方法</a>
                        <span class="text-muted">NickDeCodes</span>
<a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/github/1.htm">github</a>
                        <div>subtree高频使用方法官网添加新的子项目查看子项目的差异使用子项目克隆存储库引入超级项目更新改变分支引入子项目更新对子项目进行更改将更改推送到子项目存储库高效配置添加新的子项目subtreegitsubtreeadd--prefix=example-submodulehttps://github.com/githubtraining/example-submodulemaster--squas</div>
                    </li>
                    <li><a href="/article/1899320241188564992.htm"
                           title="C++ time(0)函数" target="_blank">C++ time(0)函数</a>
                        <span class="text-muted">宁玉AC</span>
<a class="tag" taget="_blank" href="/search/c%E5%AD%A6%E4%B9%A0/1.htm">c学习</a>
                        <div>time(0)函数返回当前格林尼治标准时间与格林尼治标准时间1970年0分0秒的时间间隔。头文件#include//问题:得到当前时间。#include#includeusingnamespacestd;intmain(){inttotalSeconds=time(0);intcurrentSeconds=totalSeconds%60;inttotalMinutes=totalSeconds/6</div>
                    </li>
                    <li><a href="/article/1899314949683998720.htm"
                           title="zookeeper与kafka集群配置" target="_blank">zookeeper与kafka集群配置</a>
                        <span class="text-muted">zhangpeng455547940</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">计算机</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>基本配置修改ipvi/etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTO=staticONBOOT=yesIPADDR=192.168.139.133NETMASK=255.255.255.0GATEWAY=192.168.139.2DNS1=192.168.1.1修改主机名hostnamectlset-hostnameSSH免密登录vi/etc/</div>
                    </li>
                    <li><a href="/article/1899314696805216256.htm"
                           title="XML文件解析" target="_blank">XML文件解析</a>
                        <span class="text-muted">跪在镜子前喊帅</span>
<a class="tag" taget="_blank" href="/search/%E5%85%B6%E4%BB%96/1.htm">其他</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>文章目录前言1、XML解析1.1、SAX1.2、DOM1.3、XPath前言xml文档里包含的是xml的元素,指的是从开始标签直到结束标签的部分,元素里可以包含其他元素,元素也可以拥有其他属性,比如:yang251212students,student,name,age,stuNo等这些都叫元素标签也可以叫元素节点和元素对象。id是某个元素的节点的属性,叫属性节点和属性对象。yang,25,121</div>
                    </li>
                    <li><a href="/article/1899308139824607232.htm"
                           title="向 state 字典中的 “messages“ 键添加一条新的用户消息,提示模型返回实际的输出。" target="_blank">向 state 字典中的 “messages“ 键添加一条新的用户消息,提示模型返回实际的输出。</a>
                        <span class="text-muted">背太阳的牧羊人</span>
<a class="tag" taget="_blank" href="/search/langgraph/1.htm">langgraph</a><a class="tag" taget="_blank" href="/search/langgraph/1.htm">langgraph</a><a class="tag" taget="_blank" href="/search/tools/1.htm">tools</a><a class="tag" taget="_blank" href="/search/Agent/1.htm">Agent</a>
                        <div>完整代码:fromdatetimeimportdatetimefromlangchain_core.runnablesimportRunnable,RunnableConfigfromlangchain_core.promptsimportChatPromptTemplateprimary_assistant_prompt=ChatPromptTemplate.from_messages([("s</div>
                    </li>
                    <li><a href="/article/1899307883149979648.htm"
                           title="ARM64环境部署EFK8.15.3收集K8S集群容器日志" target="_blank">ARM64环境部署EFK8.15.3收集K8S集群容器日志</a>
                        <span class="text-muted">llody_55</span>
<a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/es/1.htm">es</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/elasticsearch/1.htm">elasticsearch</a>
                        <div>环境规划主机IP系统部署方式ES版本CPU架构用户名密码192.168.1.225Ubuntu22.04.4LTSdockerelasticsearch:8.15.3ARM64elasticllodyi4TMmZDES集群部署创建持久化目录(所有节点)mkdir-p/data/es/{data,certs,logs,plugins}mkdir-p/data/es/certs/{ca,es01}服务</div>
                    </li>
                    <li><a href="/article/1899307630996811776.htm"
                           title="centos7升级curl到最新版包含离线安装方法" target="_blank">centos7升级curl到最新版包含离线安装方法</a>
                        <span class="text-muted">llody_55</span>
<a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a>
                        <div>当前版本[root@consul~]#curl-Vcurl7.29.0(x86_64-redhat-linux-gnu)libcurl/7.29.0NSS/3.53.1zlib/1.2.7libidn/1.28libssh2/1.8.0Protocols:dictfileftpftpsgopherhttphttpsimapimapsldapldapspop3pop3srtspscpsftpsmtp</div>
                    </li>
                    <li><a href="/article/1899302585756610560.htm"
                           title="React 生命周期方法详解" target="_blank">React 生命周期方法详解</a>
                        <span class="text-muted">七公子77</span>
<a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a>
                        <div>一、生命周期三个阶段挂载阶段(Mounting)更新阶段(Updating)卸载阶段(Unmounting)二、生命周期方法详解(简化版)1.挂载阶段方法触发时机用途注意事项constructor()组件初始化时初始化state,绑定事件处理函数避免直接调用setState,仅用于初始化。render()必须实现,返回JSX渲染UI不可调用setState,否则导致无限循环。componentDi</div>
                    </li>
                    <li><a href="/article/1899301970192166912.htm"
                           title="基于HarmonyNext的ArkTS高级实战:构建高性能跨平台应用" target="_blank">基于HarmonyNext的ArkTS高级实战:构建高性能跨平台应用</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/harmonyos-next/1.htm">harmonyos-next</a>
                        <div>基于HarmonyNext的ArkTS高级实战:构建高性能跨平台应用引言随着HarmonyOSNext的发布,ArkTS作为其核心开发语言,为开发者提供了更强大的工具和更高效的开发体验。ArkTS基于TypeScript,结合了HarmonyOS的分布式能力,使得开发者能够轻松构建高性能、跨平台的应用。本文将深入探讨如何使用ArkTS在HarmonyNext平台上进行高级开发,通过实战案例讲解如何</div>
                    </li>
                    <li><a href="/article/1899301971513372672.htm"
                           title="HarmonyNext实战案例:基于ArkTS的高性能分布式机器学习应用开发" target="_blank">HarmonyNext实战案例:基于ArkTS的高性能分布式机器学习应用开发</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/harmonyos-next/1.htm">harmonyos-next</a>
                        <div>HarmonyNext实战案例:基于ArkTS的高性能分布式机器学习应用开发引言在HarmonyNext生态系统中,分布式机器学习是其核心特性之一。通过分布式机器学习,开发者可以充分利用多设备的计算资源,实现复杂模型的训练与推理。本文将深入探讨如何使用ArkTS12+语法开发一个高性能的分布式机器学习应用,涵盖从基础概念到高级技巧的全面讲解。通过本案例,您将学习到如何利用HarmonyNext的分</div>
                    </li>
                    <li><a href="/article/1899301715853766656.htm"
                           title="HarmonyNext实战案例:基于ArkTS的实时多人协作白板应用开发" target="_blank">HarmonyNext实战案例:基于ArkTS的实时多人协作白板应用开发</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/harmonyos-next/1.htm">harmonyos-next</a>
                        <div>HarmonyNext实战案例:基于ArkTS的实时多人协作白板应用开发引言在HarmonyNext生态系统中,实时多人协作是其核心特性之一。通过实时多人协作,开发者可以构建高效、互动的应用场景,例如实时白板、协同编辑等。本文将深入探讨如何使用ArkTS12+语法开发一个实时多人协作白板应用,涵盖从基础概念到高级技巧的全面讲解。通过本案例,您将学习到如何利用HarmonyNext的实时通信特性,结</div>
                    </li>
                    <li><a href="/article/1899301588678275072.htm"
                           title="HarmonyNext实战:基于ArkTS的跨平台3D图形渲染应用开发" target="_blank">HarmonyNext实战:基于ArkTS的跨平台3D图形渲染应用开发</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/harmonyos-next/1.htm">harmonyos-next</a>
                        <div>HarmonyNext实战:基于ArkTS的跨平台3D图形渲染应用开发引言在HarmonyNext生态系统中,3D图形渲染是一个技术含量高且应用广泛的领域。本文将深入探讨如何使用ArkTS构建一个高性能的跨平台3D图形渲染应用,涵盖从场景构建、模型加载、光照处理到渲染优化的完整开发流程。我们将通过一个实际的案例——实现一个3D场景编辑器,来展示ArkTS在HarmonyNext平台上的强大能力。环</div>
                    </li>
                    <li><a href="/article/1899301461511172096.htm"
                           title="HarmonyNext实战:基于ArkTS的跨平台音视频流媒体应用开发" target="_blank">HarmonyNext实战:基于ArkTS的跨平台音视频流媒体应用开发</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/harmonyos-next/1.htm">harmonyos-next</a>
                        <div>HarmonyNext实战:基于ArkTS的跨平台音视频流媒体应用开发引言在HarmonyNext生态系统中,音视频流媒体应用是一个复杂且技术含量较高的领域。本文将深入探讨如何使用ArkTS构建一个高性能的跨平台音视频流媒体应用,涵盖从音视频采集、编码、传输到播放的完整开发流程。我们将通过一个实际的案例——实现一个实时音视频直播应用,来展示ArkTS在HarmonyNext平台上的强大能力。环境准</div>
                    </li>
                    <li><a href="/article/1899301334323097600.htm"
                           title="HarmonyNext实战:基于ArkTS的分布式数据同步应用开发" target="_blank">HarmonyNext实战:基于ArkTS的分布式数据同步应用开发</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/harmonyos-next/1.htm">harmonyos-next</a>
                        <div>HarmonyNext实战:基于ArkTS的分布式数据同步应用开发引言在HarmonyNext生态系统中,分布式数据同步是一个核心功能,它允许设备之间无缝共享和同步数据。本文将深入探讨如何使用ArkTS构建一个高性能的分布式数据同步应用,涵盖从数据模型设计到分布式同步策略的完整开发流程。我们将通过一个实际的案例——实现一个跨设备的任务管理应用,来展示ArkTS在HarmonyNext平台上的强大能</div>
                    </li>
                    <li><a href="/article/1899301207139217408.htm"
                           title="HarmonyNext实战:基于ArkTS的分布式数据同步应用开发" target="_blank">HarmonyNext实战:基于ArkTS的分布式数据同步应用开发</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/harmonyos-next/1.htm">harmonyos-next</a>
                        <div>HarmonyNext实战:基于ArkTS的分布式数据同步应用开发引言在HarmonyNext生态系统中,分布式数据同步是一个核心特性,它允许设备之间无缝共享和同步数据。本文将深入探讨如何利用ArkTS语言开发一个高性能的分布式数据同步应用,涵盖从基础数据存储到跨设备同步的完整流程。我们将通过一个实战案例,详细讲解如何实现一个支持多设备数据同步的任务管理应用,并确保其性能优化。1.环境准备与项目初</div>
                    </li>
                    <li><a href="/article/1899301205872537600.htm"
                           title="HarmonyNext实战:基于ArkTS的高性能图像处理应用开发" target="_blank">HarmonyNext实战:基于ArkTS的高性能图像处理应用开发</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/harmonyos-next/1.htm">harmonyos-next</a>
                        <div>HarmonyNext实战:基于ArkTS的高性能图像处理应用开发引言在HarmonyNext生态系统中,图像处理是一个重要且具有挑战性的领域。本文将深入探讨如何使用ArkTS构建一个高性能的图像处理应用,涵盖从基础图像操作到高级滤镜应用的完整开发流程。我们将通过一个实际的案例——实现一个实时图像滤镜应用,来展示ArkTS在HarmonyNext平台上的强大能力。环境准备在开始之前,确保你的开发环</div>
                    </li>
                                <li><a href="/article/31.htm"
                                       title="312个免费高速HTTP代理IP(能隐藏自己真实IP地址)" target="_blank">312个免费高速HTTP代理IP(能隐藏自己真实IP地址)</a>
                                    <span class="text-muted">yangshangchuan</span>
<a class="tag" taget="_blank" href="/search/%E9%AB%98%E9%80%9F/1.htm">高速</a><a class="tag" taget="_blank" href="/search/%E5%85%8D%E8%B4%B9/1.htm">免费</a><a class="tag" taget="_blank" href="/search/superword/1.htm">superword</a><a class="tag" taget="_blank" href="/search/HTTP%E4%BB%A3%E7%90%86/1.htm">HTTP代理</a>
                                    <div>  
  
124.88.67.20:843
190.36.223.93:8080
117.147.221.38:8123
122.228.92.103:3128
183.247.211.159:8123
124.88.67.35:81
112.18.51.167:8123
218.28.96.39:3128
49.94.160.198:3128
183.20</div>
                                </li>
                                <li><a href="/article/158.htm"
                                       title="pull解析和json编码" target="_blank">pull解析和json编码</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/pull%E8%A7%A3%E6%9E%90/1.htm">pull解析</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a>
                                    <div>n.json文件: 
[{name:java,lan:c++,age:17},{name:android,lan:java,age:8}] 
  
pull.xml文件 
<?xml version="1.0" encoding="utf-8"?> 
<stu> 
    <name>java</div>
                                </li>
                                <li><a href="/article/285.htm"
                                       title="[能源与矿产]石油与地球生态系统" target="_blank">[能源与矿产]石油与地球生态系统</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E8%83%BD%E6%BA%90/1.htm">能源</a>
                                    <div> 
      按照苏联的科学界的说法,石油并非是远古的生物残骸的演变产物,而是一种可以由某些特殊地质结构和物理条件生产出来的东西,也就是说,石油是可以自增长的.... 
 
      那么我们做一个猜想: 石油好像是地球的体液,我们地球具有自动产生石油的某种机制,只要我们不过量开采石油,并保护好</div>
                                </li>
                                <li><a href="/article/412.htm"
                                       title="类与对象浅谈" target="_blank">类与对象浅谈</a>
                                    <span class="text-muted">沐刃青蛟</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80/1.htm">基础</a>
                                    <div> 
       类,字面理解,便是同一种事物的总称,比如人类,是对世界上所有人的一个总称。而对象,便是类的具体化,实例化,是一个具体事物,比如张飞这个人,就是人类的一个对象。但要注意的是:张飞这个人是对象,而不是张飞,张飞只是他这个人的名字,是他的属性而已。而一个类中包含了属性和方法这两兄弟,他们分别用来描述对象的行为和性质(感觉应该是</div>
                                </li>
                                <li><a href="/article/539.htm"
                                       title="新站开始被收录后,我们应该做什么?" target="_blank">新站开始被收录后,我们应该做什么?</a>
                                    <span class="text-muted">IT独行者</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/seo/1.htm">seo</a>
                                    <div>新站开始被收录后,我们应该做什么? 
  
      百度终于开始收录自己的网站了,作为站长,你是不是觉得那一刻很有成就感呢,同时,你是不是又很茫然,不知道下一步该做什么了?至少我当初就是这样,在这里和大家一份分享一下新站收录后,我们要做哪些工作。 
      至于如何让百度快速收录自己的网站,可以参考我之前的帖子《新站让百</div>
                                </li>
                                <li><a href="/article/666.htm"
                                       title="oracle 连接碰到的问题" target="_blank">oracle 连接碰到的问题</a>
                                    <span class="text-muted">文强chu</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                                    <div>Unable to find a java Virtual Machine--安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案 
作者:草根IT网 来源:未知 人气:813标签: 
导读:安装64位版Oracle11gR2后发现启动SQLDeveloper时弹出配置java.exe的路径,找到Oracle自带java.exe后产生的路径“C:\app\用户名\prod</div>
                                </li>
                                <li><a href="/article/793.htm"
                                       title="Swing中按ctrl键同时移动鼠标拖动组件(类中多借口共享同一数据)" target="_blank">Swing中按ctrl键同时移动鼠标拖动组件(类中多借口共享同一数据)</a>
                                    <span class="text-muted">小桔子</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BB%A7%E6%89%BF/1.htm">继承</a><a class="tag" taget="_blank" href="/search/swing/1.htm">swing</a><a class="tag" taget="_blank" href="/search/%E6%8E%A5%E5%8F%A3/1.htm">接口</a><a class="tag" taget="_blank" href="/search/%E7%9B%91%E5%90%AC/1.htm">监听</a>
                                    <div>        都知道java中类只能单继承,但可以实现多个接口,但我发现实现多个接口之后,多个接口却不能共享同一个数据,应用开发中想实现:当用户按着ctrl键时,可以用鼠标点击拖动组件,比如说文本框。 
编写一个监听实现KeyListener,NouseListener,MouseMotionListener三个接口,重写方法。定义一个全局变量boolea</div>
                                </li>
                                <li><a href="/article/920.htm"
                                       title="linux常用的命令" target="_blank">linux常用的命令</a>
                                    <span class="text-muted">aichenglong</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/1.htm">常用命令</a>
                                    <div>1 startx切换到图形化界面 
2 man命令:查看帮助信息 
 man 需要查看的命令,man命令提供了大量的帮助信息,一般可以分成4个部分 
 name:对命令的简单说明 
 synopsis:命令的使用格式说明 
 description:命令的详细说明信息 
 options:命令的各项说明 
3 date:显示时间 
 语法:date [OPTION]... [+FORMAT] 
 </div>
                                </li>
                                <li><a href="/article/1047.htm"
                                       title="eclipse内存优化" target="_blank">eclipse内存优化</a>
                                    <span class="text-muted">AILIKES</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a>
                                    <div>一 基本说明      在JVM中,总体上分2块内存区,默认空余堆内存小于 40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。     1)堆内存(Heap memory):堆是运行时数据区域,所有类实例和数组的内存均从此处分配,是Java代码可及的内存,是留给开发人</div>
                                </li>
                                <li><a href="/article/1174.htm"
                                       title="关键字的使用探讨" target="_blank">关键字的使用探讨</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/%E5%85%B3%E9%94%AE%E5%AD%97/1.htm">关键字</a>
                                    <div>//关键字的使用探讨/*访问关键词private 只能在本类中访问public 只能在本工程中访问protected 只能在包中和子类中访问默认的 只能在包中访问*//*final   类 方法 变量 final 类 不能被继承  final 方法 不能被子类覆盖,但可以继承 final 变量 只能有一次赋值,赋值后不能改变 final 不能用来修饰构造方法*///this()</div>
                                </li>
                                <li><a href="/article/1301.htm"
                                       title="JS中定义对象的几种方式" target="_blank">JS中定义对象的几种方式</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/js/1.htm">js</a>
                                    <div>    1. 基于已有对象扩充其对象和方法(只适合于临时的生成一个对象): 
<html>
<head>
    <title>基于已有对象扩充其对象和方法(只适合于临时的生成一个对象)</title>
</head>
<script>
    var obj = new Object();
 </div>
                                </li>
                                <li><a href="/article/1428.htm"
                                       title="表驱动法实例" target="_blank">表驱动法实例</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%A1%A8%E9%A9%B1%E5%8A%A8%E6%B3%95/1.htm">表驱动法</a><a class="tag" taget="_blank" href="/search/TDD/1.htm">TDD</a>
                                    <div>获得月的天数是典型的直接访问驱动表方式的实例,下面我们来展示一下: 
MonthDaysTest.java 
package com.study.test;

import org.junit.Assert;
import org.junit.Test;

import com.study.MonthDays;

public class MonthDaysTest {

	@T</div>
                                </li>
                                <li><a href="/article/1555.htm"
                                       title="LInux启停重启常用服务器的脚本" target="_blank">LInux启停重启常用服务器的脚本</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                    <div>启动,停止和重启常用服务器的Bash脚本,对于每个服务器,需要根据实际的安装路径做相应的修改 
  
#! /bin/bash

Servers=(Apache2, Nginx, Resin, Tomcat, Couchbase, SVN, ActiveMQ, Mongo);
Ops=(Start, Stop, Restart);
currentDir=$(pwd);
echo</div>
                                </li>
                                <li><a href="/article/1682.htm"
                                       title="【HBase六】REST操作HBase" target="_blank">【HBase六】REST操作HBase</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/hbase/1.htm">hbase</a>
                                    <div>HBase提供了REST风格的服务方便查看HBase集群的信息,以及执行增删改查操作 
  1. 启动和停止HBase REST 服务 1.1 启动REST服务 
前台启动(默认端口号8080) 
[hadoop@hadoop bin]$ ./hbase rest start 
  
后台启动 
hbase-daemon.sh start rest 
  
启动时指定</div>
                                </li>
                                <li><a href="/article/1809.htm"
                                       title="大话zabbix 3.0设计假设" target="_blank">大话zabbix 3.0设计假设</a>
                                    <span class="text-muted">ronin47</span>

                                    <div>What’s new in Zabbix 2.0? 
去年开始使用Zabbix的时候,是1.8.X的版本,今年Zabbix已经跨入了2.0的时代。看了2.0的release notes,和performance相关的有下面几个: 
 
          :: Performance improvements::Trigger related da</div>
                                </li>
                                <li><a href="/article/1936.htm"
                                       title="http错误码大全" target="_blank">http错误码大全</a>
                                    <span class="text-muted">byalias</span>
<a class="tag" taget="_blank" href="/search/http%E5%8D%8F%E8%AE%AE/1.htm">http协议</a><a class="tag" taget="_blank" href="/search/javaweb/1.htm">javaweb</a>
                                    <div>响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。 
响应码分五种类型,由它们的第一位数字表示: 
1)1xx:信息,请求收到,继续处理 
2)2xx:成功,行为被成功地接受、理解和采纳 
3)3xx:重定向,为了完成请求,必须进一步执行的动作 
4)4xx:客户端错误,请求包含语法错误或者请求无法实现 
5)5xx:服务器错误,服务器不能实现一种明显无效的请求 
 
 
</div>
                                </li>
                                <li><a href="/article/2063.htm"
                                       title="J2EE设计模式-Intercepting Filter" target="_blank">J2EE设计模式-Intercepting Filter</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a>
                                    <div>Intercepting Filter类似于职责链模式 
有两种实现 
其中一种是Filter之间没有联系,全部Filter都存放在FilterChain中,由FilterChain来有序或无序地把把所有Filter调用一遍。没有用到链表这种数据结构。示例如下: 
 
 

package com.ljn.filter.custom;

import java.util.ArrayList;</div>
                                </li>
                                <li><a href="/article/2190.htm"
                                       title="修改jboss端口" target="_blank">修改jboss端口</a>
                                    <span class="text-muted">chicony</span>
<a class="tag" taget="_blank" href="/search/jboss/1.htm">jboss</a>
                                    <div>修改jboss端口 
  
%JBOSS_HOME%\server\{服务实例名}\conf\bindingservice.beans\META-INF\bindings-jboss-beans.xml 
  
中找到 
  
   <!-- The ports-default bindings are obtained by taking the base bindin</div>
                                </li>
                                <li><a href="/article/2317.htm"
                                       title="c++ 用类模版实现数组类" target="_blank">c++ 用类模版实现数组类</a>
                                    <span class="text-muted">CrazyMizzz</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a>
                                    <div>最近c++学到数组类,写了代码将他实现,基本具有vector类的功能 
 
 

#include<iostream>
#include<string>
#include<cassert>
using namespace std;
template<class T>
class Array
{
public:
	//构造函数 
	</div>
                                </li>
                                <li><a href="/article/2444.htm"
                                       title="hadoop dfs.datanode.du.reserved 预留空间配置方法" target="_blank">hadoop dfs.datanode.du.reserved 预留空间配置方法</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/%E9%A2%84%E7%95%99%E7%A9%BA%E9%97%B4/1.htm">预留空间</a>
                                    <div>对于datanode配置预留空间的方法 为:在hdfs-site.xml添加如下配置 
 <property> 
    <name>dfs.datanode.du.reserved</name> 
    <value>10737418240</value> 
  
 </div>
                                </li>
                                <li><a href="/article/2571.htm"
                                       title="mysql远程访问的设置" target="_blank">mysql远程访问的设置</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E9%98%B2%E7%81%AB%E5%A2%99/1.htm">防火墙</a>
                                    <div>第一步: 激活网络设置 你需要编辑mysql配置文件my.cnf. 通常状况,my.cnf放置于在以下目录: /etc/mysql/my.cnf (Debian linux) /etc/my.cnf (Red Hat Linux/Fedora Linux) /var/db/mysql/my.cnf (FreeBSD) 然后用vi编辑my.cnf,修改内容从以下行: [mysqld] 你所需要: 1</div>
                                </li>
                                <li><a href="/article/2698.htm"
                                       title="ios 使用特定的popToViewController返回到相应的Controller" target="_blank">ios 使用特定的popToViewController返回到相应的Controller</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/controller/1.htm">controller</a>
                                    <div>1、取navigationCtroller中的Controllers
NSArray * ctrlArray = self.navigationController.viewControllers;
2、取出后,执行,
[self.navigationController popToViewController:[ctrlArray objectAtIndex:0] animated:YES</div>
                                </li>
                                <li><a href="/article/2825.htm"
                                       title="Linux正则表达式和通配符的区别" target="_blank">Linux正则表达式和通配符的区别</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a><a class="tag" taget="_blank" href="/search/%E9%80%9A%E9%85%8D%E7%AC%A6%E5%92%8C%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E5%8C%BA%E5%88%AB/1.htm">通配符和正则表达式的区别</a><a class="tag" taget="_blank" href="/search/%E9%80%9A%E9%85%8D%E7%AC%A6/1.htm">通配符</a>
                                    <div>转载请出自出处:http://eksliang.iteye.com/blog/1976579 
 
首先得明白二者是截然不同的 
通配符只能用在shell命令中,用来处理字符串的的匹配。 
判断一个命令是否为bash shell(linux 默认的shell)的内置命令 
 type -t commad  
返回结果含义 
 file  表示为外部命令 
 alias  表示该</div>
                                </li>
                                <li><a href="/article/2952.htm"
                                       title="Ubuntu Mysql Install and CONF" target="_blank">Ubuntu Mysql Install and CONF</a>
                                    <span class="text-muted">gengzg</span>
<a class="tag" taget="_blank" href="/search/Install/1.htm">Install</a>
                                    <div>http://www.navicat.com.cn/download/navicat-for-mysql
    Step1: 下载Navicat ,网址:http://www.navicat.com/en/download/download.html  
      
    Step2:进入下载目录,解压压缩包:tar -zxvf  navicat11_mysql_en.tar.gz  </div>
                                </li>
                                <li><a href="/article/3079.htm"
                                       title="批处理,删除文件bat" target="_blank">批处理,删除文件bat</a>
                                    <span class="text-muted">huqiji</span>
<a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/dos/1.htm">dos</a>
                                    <div>@echo off
::演示:删除指定路径下指定天数之前(以文件名中包含的日期字符串为准)的文件。
::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
::本例假设文件名中包含的日期字符串(比如:bak-2009-12-25.log)
rem 指定待删除文件的存放路径
set SrcDir=C:/Test/BatHome
rem 指定天数
set DaysAgo=1</div>
                                </li>
                                <li><a href="/article/3206.htm"
                                       title="跨浏览器兼容的HTML5视频音频播放器" target="_blank">跨浏览器兼容的HTML5视频音频播放器</a>
                                    <span class="text-muted">天梯梦</span>
<a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a>
                                    <div>HTML5的video和audio标签是用来在网页中加入视频和音频的标签,在支持html5的浏览器中不需要预先加载Adobe Flash浏览器插件就能轻松快速的播放视频和音频文件。而html5media.js可以在不支持html5的浏览器上使video和audio标签生效。    How to enable <video> and <audio> tags in </div>
                                </li>
                                <li><a href="/article/3333.htm"
                                       title="Bundle自定义数据传递" target="_blank">Bundle自定义数据传递</a>
                                    <span class="text-muted">hm4123660</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/Serializable/1.htm">Serializable</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E4%BC%A0%E9%80%92/1.htm">自定义数据传递</a><a class="tag" taget="_blank" href="/search/Bundle/1.htm">Bundle</a><a class="tag" taget="_blank" href="/search/Parcelable/1.htm">Parcelable</a>
                                    <div>      我们都知道Bundle可能过put****()方法添加各种基本类型的数据,Intent也可以通过putExtras(Bundle)将数据添加进去,然后通过startActivity()跳到下一下Activity的时候就把数据也传到下一个Activity了。如传递一个字符串到下一个Activity 
  
把数据放到Intent</div>
                                </li>
                                <li><a href="/article/3460.htm"
                                       title="C#:异步编程和线程的使用(.NET 4.5 )" target="_blank">C#:异步编程和线程的使用(.NET 4.5 )</a>
                                    <span class="text-muted">powertoolsteam</span>
<a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B/1.htm">线程</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B/1.htm">异步编程</a>
                                    <div>异步编程和线程处理是并发或并行编程非常重要的功能特征。为了实现异步编程,可使用线程也可以不用。将异步与线程同时讲,将有助于我们更好的理解它们的特征。 
本文中涉及关键知识点 
1. 异步编程 
2. 线程的使用 
3. 基于任务的异步模式 
4. 并行编程 
5. 总结 
 
  异步编程  
 
什么是异步操作?异步操作是指某些操作能够独立运行,不依赖主流程或主其他处理流程。通常情况下,C#程序</div>
                                </li>
                                <li><a href="/article/3587.htm"
                                       title="spark 查看 job history 日志" target="_blank">spark 查看 job history 日志</a>
                                    <span class="text-muted">Stark_Summer</span>
<a class="tag" taget="_blank" href="/search/%E6%97%A5%E5%BF%97/1.htm">日志</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/history/1.htm">history</a><a class="tag" taget="_blank" href="/search/job/1.htm">job</a>
                                    <div>SPARK_HOME/conf 下:  
spark-defaults.conf 增加如下内容 
spark.eventLog.enabled true spark.eventLog.dir hdfs://master:8020/var/log/spark spark.eventLog.compress true  
spark-env.sh 增加如下内容 
export SP</div>
                                </li>
                                <li><a href="/article/3714.htm"
                                       title="SSH框架搭建" target="_blank">SSH框架搭建</a>
                                    <span class="text-muted">wangxiukai2015eye</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a>
                                    <div>MyEclipse搭建SSH框架 Struts Spring Hibernate 
1、new一个web project。 
2、右键项目,为项目添加Struts支持。 
   选择Struts2 Core Libraries -<MyEclipes-Library> 
     点击Finish。src目录下多了struts</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>