XML解析神器:Apache Commons Digester

XML解析神器:Apache Commons Digester_第1张图片

第1章:引言

大家好,我是小黑。今天咱们聊聊一个在现代编程中经常遇到的话题:XML解析。你可能知道,XML(可扩展标记语言)因其灵活性和可读性,在配置文件、数据交换等方面广泛使用。但是,XML解析有时候会让人头疼,尤其是当文件结构复杂或者数据量巨大时。这时候,一个好用的工具就显得尤为重要了。

在Java世界里,有很多工具可以用来解析XML,比如JAXP, JAXB, DOM4J等。但今天咱们要讨论的是Apache Commons Digester。为什么选择它呢?因为它既简单又强大,非常适合那些想要快速而又不失灵活性处理XML的场景。Commons Digester通过定义一系列的规则来解析XML,让整个过程变得直观且容易控制。这样一来,咱们就可以专注于业务逻辑,而不是被繁琐的XML解析细节困扰。

第2章:什么是Commons Digester?

先来简单介绍一下Apache Commons Digester。这是一个开源的Java库,属于Apache Commons项目的一部分。Commons Digester的设计初衷是简化XML到Java对象的映射过程。简单地说,它可以将XML文档转换成Java对象,而且这个过程完全基于你定义的规则。

那这个过程是怎样的呢?其实,Commons Digester工作原理非常直观。它读取XML文档,根据你提前定义的一组规则,触发相应的操作。这些操作通常包括创建对象、调用方法、设置属性等。通过这种方式,XML文档中的数据就被有效地映射到了Java对象上。

这听起来可能有点抽象,别急,咱们来看一个简单的例子。假设有这样一个XML文件:

<Person>
    <Name>张三Name>
    <Age>30Age>
Person>

咱们想要将这个XML映射到一个Java的Person类上。这个类大概长这样:

public class Person {
    private String name;
    private int age;

    // 省略构造函数、getter和setter方法
}

要实现这个映射,你只需要定义相应的规则即可。Commons Digester让这个过程变得异常简单。在后续的章节里,小黑会带大家一步步学习如何定义这些规则,并且掌握Commons Digester的使用技巧。

第3章:依赖配置

要使用Commons Digester,你的项目需要能够访问到它的库文件。如果你的项目是基于Maven的,那就简单多了。只需要在项目的pom.xml文件中添加相应的依赖即可。这里是一个标准的依赖配置示例:

<dependencies>
    
    <dependency>
        <groupId>org.apache.commonsgroupId>
        <artifactId>commons-digester3artifactId>
        <version>3.2version> 
    dependency>
dependencies>

添加完依赖后,Maven会自动下载并添加Commons Digester到你的项目中。这样一来,咱们就可以在代码里自由地使用它了。

第4章:理解XML解析的基础

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它类似于HTML,但更加灵活,因为你可以自定义标签。XML被广泛用于配置文件、网络数据交换等场景。了解如何解析XML,对于一个Java开发者来说非常重要。

那么,XML解析到底是什么呢?简单来说,就是将XML文档转换成程序可以理解和操作的格式,比如Java对象。这个过程中,最核心的就是理解XML文档的结构。

来,咱们看一个XML的示例:

<Book>
    <Title>Java编程思想Title>
    <Author>张三Author>
    <Price>99Price>
Book>

这是一个描述书籍信息的XML。它有一个根元素,里面包含了三个子元素:</code>, <code><Author></code>, 和<code><Price></code>。</p> <p>在Java中,要解析这样的XML,你可能会想到创建一个对应的<code>Book</code>类:</p> <pre><code class="prism language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Book</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">String</span> title<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token class-name">String</span> author<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">int</span> price<span class="token punctuation">;</span> <span class="token comment">// getter和setter方法省略</span> <span class="token punctuation">}</span> </code></pre> <p>现在,咱们的任务就是将XML中的数据读取出来,填充到这个<code>Book</code>类的实例中。听起来是不是有点像魔法?但其实原理并不复杂。</p> <p>XML解析通常有两种方式:DOM解析和SAX解析。DOM解析会将整个XML文档加载到内存中,形成一个树状结构。这样做的好处是可以随机访问文档的任何部分,但缺点是消耗内存较大。SAX解析则是顺序读取XML文档,边读边解析,内存消耗小,但不能随机访问。</p> <p>Commons Digester提供了一种更加灵活的解析方式。它允许你定义一系列的规则,然后在解析XML文档时,根据这些规则来创建和填充Java对象。这种方式既节省内存,又相对直观。</p> <h4>第5章:Commons Digester的核心组件</h4> <p>Commons Digester的核心是<code>Digester</code>类。这个类是整个库的灵魂,负责读取XML文档,并根据定义的规则来操作XML数据。听起来很神奇对吧?别急,咱们来看看具体是怎么回事。</p> <h5>创建Digester实例</h5> <p>在开始解析XML之前,咱们首先需要创建一个<code>Digester</code>实例。这个过程非常简单:</p> <pre><code class="prism language-java"><span class="token class-name">Digester</span> digester <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Digester</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>有了这个实例,咱们就可以开始定义一些规则,告诉<code>Digester</code>如何从XML中提取数据,并将这些数据映射到Java对象中。</p> <h5>定义解析规则</h5> <p>这里是Commons Digester真正强大的地方。你可以定义各种各样的规则来指导解析过程。比如,咱们有这样一个XML:</p> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Person</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Name</span><span class="token punctuation">></span></span>李四<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Age</span><span class="token punctuation">></span></span>25<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Age</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Person</span><span class="token punctuation">></span></span> </code></pre> <p>咱们想将这个XML解析到一个<code>Person</code>类的实例中。这个类可能长这样:</p> <pre><code class="prism language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">String</span> name<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">int</span> age<span class="token punctuation">;</span> <span class="token comment">// getter和setter方法省略</span> <span class="token punctuation">}</span> </code></pre> <p>为了完成这个映射,咱们需要定义一些规则:</p> <pre><code class="prism language-java"><span class="token comment">// 创建Digester实例</span> <span class="token class-name">Digester</span> digester <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Digester</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 当遇到<Person>标签时,创建一个Person类的实例</span> digester<span class="token punctuation">.</span><span class="token function">addObjectCreate</span><span class="token punctuation">(</span><span class="token string">"Person"</span><span class="token punctuation">,</span> <span class="token class-name">Person</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 当遇到<Person>标签内的<Name>标签时,将其内容设置到Person实例的name属性上</span> digester<span class="token punctuation">.</span><span class="token function">addBeanPropertySetter</span><span class="token punctuation">(</span><span class="token string">"Person/Name"</span><span class="token punctuation">,</span> <span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 同理,处理<Age>标签</span> digester<span class="token punctuation">.</span><span class="token function">addBeanPropertySetter</span><span class="token punctuation">(</span><span class="token string">"Person/Age"</span><span class="token punctuation">,</span> <span class="token string">"age"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>这样,当<code>Digester</code>解析到<code><Person></code>标签时,它就会创建一个<code>Person</code>实例。然后,遇到<code><Name></code>和<code><Age></code>标签时,它会将这些标签的内容分别设置到<code>Person</code>实例的<code>name</code>和<code>age</code>属性上。</p> <h5>解析XML</h5> <p>定义好规则后,剩下的就是让<code>Digester</code>解析XML了。这个过程也很直接:</p> <pre><code class="prism language-java"><span class="token class-name">Person</span> person <span class="token operator">=</span> digester<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">StringReader</span><span class="token punctuation">(</span>xmlString<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>这里,<code>xmlString</code>就是包含XML内容的字符串。<code>parse</code>方法会根据前面定义的规则,解析这个字符串,并返回一个填充好数据的<code>Person</code>实例。</p> <p>通过这些步骤,咱们就可以轻松地将XML数据映射到Java对象中了。看起来是不是很酷?但别忘了,这只是Commons Digester的冰山一角。它还有很多强大的功能等着咱们去探索。</p> <h4>第6章:实战演练:解析XML示例</h4> <p>假设咱们有这样一个XML文件,它描述了一本书的信息:</p> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>Java编程指南<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Author</span><span class="token punctuation">></span></span>王五<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Price</span><span class="token punctuation">></span></span>88<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Price</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> </code></pre> <p>咱们的任务是把这个XML文件中的数据解析到一个Java对象中。首先,咱们需要定义一个对应的Java类:</p> <pre><code class="prism language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Book</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token class-name">String</span> title<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token class-name">String</span> author<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">int</span> price<span class="token punctuation">;</span> <span class="token comment">// getter和setter方法省略</span> <span class="token punctuation">}</span> </code></pre> <p>接下来,就是使用Commons Digester来解析XML并填充这个<code>Book</code>类的实例了。</p> <h5>步骤1:创建Digester实例</h5> <pre><code class="prism language-java"><span class="token class-name">Digester</span> digester <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Digester</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <h5>步骤2:定义解析规则</h5> <p>咱们需要告诉<code>Digester</code>,当遇到哪些XML元素时,应该执行什么操作:</p> <pre><code class="prism language-java"><span class="token comment">// 当遇到<Book>标签时,创建一个Book类的实例</span> digester<span class="token punctuation">.</span><span class="token function">addObjectCreate</span><span class="token punctuation">(</span><span class="token string">"Book"</span><span class="token punctuation">,</span> <span class="token class-name">Book</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 当遇到<Book>下的<Title>标签时,将其内容设置到Book实例的title属性上</span> digester<span class="token punctuation">.</span><span class="token function">addBeanPropertySetter</span><span class="token punctuation">(</span><span class="token string">"Book/Title"</span><span class="token punctuation">,</span> <span class="token string">"title"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 对<Author>和<Price>标签做同样的操作</span> digester<span class="token punctuation">.</span><span class="token function">addBeanPropertySetter</span><span class="token punctuation">(</span><span class="token string">"Book/Author"</span><span class="token punctuation">,</span> <span class="token string">"author"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> digester<span class="token punctuation">.</span><span class="token function">addBeanPropertySetter</span><span class="token punctuation">(</span><span class="token string">"Book/Price"</span><span class="token punctuation">,</span> <span class="token string">"price"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>这样,<code>Digester</code>就知道了如何根据XML元素来创建和填充<code>Book</code>对象。</p> <h5>步骤3:解析XML</h5> <p>最后,咱们来解析XML文件:</p> <pre><code class="prism language-java"><span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token class-name">Book</span> book <span class="token operator">=</span> digester<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">StringReader</span><span class="token punctuation">(</span>xmlString<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 这里的xmlString是包含上面XML内容的字符串</span> <span class="token comment">// 输出解析结果,检查是否正确</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"书名: "</span> <span class="token operator">+</span> book<span class="token punctuation">.</span><span class="token function">getTitle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"作者: "</span> <span class="token operator">+</span> book<span class="token punctuation">.</span><span class="token function">getAuthor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"价格: "</span> <span class="token operator">+</span> book<span class="token punctuation">.</span><span class="token function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"元"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> <span class="token operator">|</span> <span class="token class-name">SAXException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>这个过程中,如果一切顺利,你会看到控制台输出了解析后的书籍信息。</p> <p>通过这个实例,咱们可以看到,Commons Digester的确是一个非常强大且灵活的工具。它能够轻松地将XML文档中的数据映射到Java对象中,大大简化了XML处理的复杂性。</p> <h4>第7章:高级功能和技巧</h4> <h5>条件解析</h5> <p>在一些复杂的场景中,咱们可能只想在满足特定条件时才解析某些部分的XML。Commons Digester提供了条件解析的功能,让这成为可能。</p> <p>比如,假设咱们有一个包含多本书籍信息的XML,但只想解析价格超过100元的书:</p> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Library</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>Java编程指南<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Author</span><span class="token punctuation">></span></span>王五<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Price</span><span class="token punctuation">></span></span>88<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Price</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>高级Java技术<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Author</span><span class="token punctuation">></span></span>赵六<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Price</span><span class="token punctuation">></span></span>120<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Price</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> <span class="token comment"><!-- 更多书籍... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Library</span><span class="token punctuation">></span></span> </code></pre> <p>咱们可以使用<code>Rule</code>类和它的子类来定义更复杂的解析规则。例如:</p> <pre><code class="prism language-java">digester<span class="token punctuation">.</span><span class="token function">addRule</span><span class="token punctuation">(</span><span class="token string">"Library/Book"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Rule</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">begin</span><span class="token punctuation">(</span><span class="token class-name">String</span> namespace<span class="token punctuation">,</span> <span class="token class-name">String</span> name<span class="token punctuation">,</span> <span class="token class-name">Attributes</span> attributes<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span> <span class="token comment">// 只有当书的价格大于100时,才创建Book对象</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token class-name">Integer</span><span class="token punctuation">.</span><span class="token function">parseInt</span><span class="token punctuation">(</span>attributes<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token string">"Price"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">Book</span> book <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Book</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> digester<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>book<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 其他规则定义...</span> </code></pre> <p><a href="http://img.e-com-net.com/image/info8/4807c4a58bc94f50b6eef40579fc36ca.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/4807c4a58bc94f50b6eef40579fc36ca.jpg" alt="XML解析神器:Apache Commons Digester_第2张图片" width="650" height="498" style="border:1px solid black;"></a></p> <p>这样,只有价格超过100元的书才会被解析和创建。</p> <h5>使用XPath</h5> <p>有时候,XML结构可能非常复杂,使用传统的路径可能不够灵活。这时,XPath就能大放异彩了。Commons Digester支持XPath表达式,让你能够更精确地定位XML中的元素。</p> <p>假设咱们的XML结构如下:</p> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Library</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Section</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>编程<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>Java编程指南<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token comment"><!-- 省略其他信息 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> <span class="token comment"><!-- 更多书籍... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Section</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Section</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>设计<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token comment"><!-- 设计相关的书籍... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Section</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Library</span><span class="token punctuation">></span></span> </code></pre> <p>如果咱们只想解析“编程”部分的书籍,可以这样使用XPath:</p> <pre><code class="prism language-java">digester<span class="token punctuation">.</span><span class="token function">addObjectCreate</span><span class="token punctuation">(</span><span class="token string">"/Library/Section[@name='编程']/Book"</span><span class="token punctuation">,</span> <span class="token class-name">Book</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 其他规则定义...</span> </code></pre> <p>这样,只有位于“编程”部分的书籍才会被解析。</p> <h5>实用技巧和最佳实践</h5> <ol> <li> <p><strong>日志记录</strong>:在解析XML时,使用日志记录可以帮助你更好地调试和跟踪解析过程。确保你的项目中有配置日志系统。</p> </li> <li> <p><strong>异常处理</strong>:当解析XML时,可能会遇到各种异常。确保你的代码能够妥善处理这些异常,避免程序崩溃。</p> </li> <li> <p><strong>性能考虑</strong>:如果你正在处理非常大的XML文件,注意监控内存和性能。在可能的情况下,考虑使用流式解析。</p> </li> <li> <p><strong>规则复用</strong>:如果你在多个地方使用了类似的解析规则,考虑创建通用的规则类,以提高代码的复用性和清晰度。</p> </li> </ol> <h4>第8章:XPath表达式</h4> <p>XPath是一种在XML文档中查找信息的语言,它可以用来定位和处理XML文档中的数据。当你的XML结构变得复杂,或者需要更精确的查询时,XPath就显得尤为重要了。</p> <h5>XPath表达式简介</h5> <p>XPath的全称是XML Path Language,即XML路径语言。它使用路径表达式来选取XML文档中的节点或节点集。这些路径表达式看起来有点像文件系统的路径,但用于定位XML文档中的元素。</p> <h5>基本的XPath语法</h5> <ul> <li> <p><strong>选取节点</strong>:XPath使用路径表达式来选取XML文档中的节点或节点集。比如,<code>/Bookstore/Book</code>会选取根元素为<code>Bookstore</code>下所有的<code>Book</code>节点。</p> </li> <li> <p><strong>谓词</strong>:谓词用于查找特定的节点或包含特定值的节点。例如,<code>/Bookstore/Book[1]</code>选取<code>Bookstore</code>下的第一个<code>Book</code>节点。</p> </li> <li> <p><strong>属性选择</strong>:可以使用<code>@</code>符号选取属性。例如,<code>/Bookstore/Book[@category='fiction']</code>选取所有<code>category</code>属性为<code>fiction</code>的<code>Book</code>节点。</p> </li> <li> <p><strong>通配符</strong>:星号<code>*</code>是一个通配符,匹配任何元素节点。例如,<code>/Bookstore/*</code>选取<code>Bookstore</code>下的所有子节点。</p> </li> </ul> <h5>XPath与Java</h5> <p>在Java中使用XPath,你需要借助一些工具,比如Java的XPath API。让我们通过一个例子来看看如何在Java中使用XPath。</p> <p>假设有这样一个XML:</p> <pre><code class="prism language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Bookstore</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span> <span class="token attr-name">category</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>fiction<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>哈利波特<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Author</span><span class="token punctuation">></span></span>JK.罗琳<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Price</span><span class="token punctuation">></span></span>68<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Price</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Book</span> <span class="token attr-name">category</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>education<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Title</span><span class="token punctuation">></span></span>Java编程思想<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Author</span><span class="token punctuation">></span></span>Bruce Eckel<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Author</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Price</span><span class="token punctuation">></span></span>88<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Price</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Book</span><span class="token punctuation">></span></span> <span class="token comment"><!-- 更多书籍... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Bookstore</span><span class="token punctuation">></span></span> </code></pre> <p>如果我们想要选取所有类别为<code>fiction</code>的书籍标题,可以这样做:</p> <pre><code class="prism language-java"><span class="token class-name">XPathFactory</span> xpathFactory <span class="token operator">=</span> <span class="token class-name">XPathFactory</span><span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">XPath</span> xpath <span class="token operator">=</span> xpathFactory<span class="token punctuation">.</span><span class="token function">newXPath</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">String</span> expression <span class="token operator">=</span> <span class="token string">"/Bookstore/Book[@category='fiction']/Title"</span><span class="token punctuation">;</span> <span class="token class-name">InputSource</span> inputSource <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">InputSource</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">StringReader</span><span class="token punctuation">(</span>xmlString<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">NodeList</span> nodes <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">NodeList</span><span class="token punctuation">)</span> xpath<span class="token punctuation">.</span><span class="token function">evaluate</span><span class="token punctuation">(</span>expression<span class="token punctuation">,</span> inputSource<span class="token punctuation">,</span> <span class="token class-name">XPathConstants</span><span class="token punctuation">.</span><span class="token constant">NODESET</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> nodes<span class="token punctuation">.</span><span class="token function">getLength</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>nodes<span class="token punctuation">.</span><span class="token function">item</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getTextContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p><a href="http://img.e-com-net.com/image/info8/38ca38d339fa4ab2b9aa23f1378536fd.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/38ca38d339fa4ab2b9aa23f1378536fd.jpg" alt="XML解析神器:Apache Commons Digester_第3张图片" width="650" height="409" style="border:1px solid black;"></a></p> <p>这段代码将输出所有类别为<code>fiction</code>的书籍的标题。</p> <h5>XPath的高级用法</h5> <p>XPath不仅限于基本的查询。它还支持更复杂的操作,比如选择特定属性的所有节点、使用运算符进行条件判断等。这使得XPath成为在处理复杂XML文档时非常强大的工具。</p> <h4>第9章:总结</h4> <h5>解析规则的灵活性</h5> <p>Commons Digester的另一个亮点是它的解析规则。咱们可以定义非常具体的规则,来精确地控制解析过程。这些规则不仅包括基本的对象创建和属性设置,还可以扩展到条件解析和使用XPath等更高级的功能。</p> <h5>XPath的强大</h5> <p>咱们深入了解了XPath这个强大的XML路径语言。它提供了一种非常灵活和强大的方式来查询和处理XML文档。使用XPath,咱们可以轻松定位到XML文档中的特定节点,进行高效的数据提取和操作。</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1742982233628622848"></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">你可能感兴趣的:(Apache,Commons,工具实战手册,xml,apache,java)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1942000159961444352.htm" title="使用Node.js命令行进行编程" target="_blank">使用Node.js命令行进行编程</a> <span class="text-muted">翠绿探寻</span> <a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E8%BE%91%E5%99%A8/1.htm">编辑器</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a> <div>Node.js是一个基于ChromeV8JavaScript引擎构建的运行时环境,它可以让开发者使用JavaScript语言编写服务器端代码。Node.js命令行界面(CLI)是一个强大的工具,它提供了与Node.js交互和执行JavaScript代码的能力。在本文中,我们将介绍如何在Node.js命令行中使用JavaScript进行编程,并提供相应的源代码示例。1.安装Node.js首先,我们需</div> </li> <li><a href="/article/1941999907716001792.htm" title="Kafka系列之:不删除Kafka Topic,清理Kafka Topic中的数据" target="_blank">Kafka系列之:不删除Kafka Topic,清理Kafka Topic中的数据</a> <span class="text-muted">快乐骑行^_^</span> <a class="tag" taget="_blank" href="/search/Kafka/1.htm">Kafka</a><a class="tag" taget="_blank" href="/search/Kafka%E7%B3%BB%E5%88%97/1.htm">Kafka系列</a><a class="tag" taget="_blank" href="/search/%E4%B8%8D%E5%88%A0%E9%99%A4Kafka/1.htm">不删除Kafka</a><a class="tag" taget="_blank" href="/search/Topic/1.htm">Topic</a><a class="tag" taget="_blank" href="/search/%E6%B8%85%E7%90%86Kafka/1.htm">清理Kafka</a><a class="tag" taget="_blank" href="/search/Topic%E6%95%B0%E6%8D%AE/1.htm">Topic数据</a> <div>Kafka系列之:不删除KafkaTopic,清理KafkaTopic中的数据一、需求二、Java删除Topic中数据三、python删除Topic中数据一、需求需要清理topic中的数据但是不能通过删除topic删除数据,则采取基于topic的offset删除topic中的数据二、Java删除Topic中数据HashMapdeleteRecords=newHashMap<>();这一行创建了一个</div> </li> <li><a href="/article/1941999655676080128.htm" title="Kafka Controller 元数据解析与故障恢复实战指南" target="_blank">Kafka Controller 元数据解析与故障恢复实战指南</a> <span class="text-muted">磐基Stack专业服务团队</span> <a class="tag" taget="_blank" href="/search/Kafka/1.htm">Kafka</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/linq/1.htm">linq</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>#作者:张桐瑞文章目录1生产案例:Controller选举在故障恢复中的关键作用1.1问题背景1.2核心操作原理:2Controller元数据全景:从ZooKeeper到内存的数据镜像2.1元数据核心载体:ControllerContext类2.2核心元数据深度解析1生产案例:Controller选举在故障恢复中的关键作用1.1问题背景某Kafka集群部分核心主题分区一直处于“不可用”状态,通过k</div> </li> <li><a href="/article/1941998144661286912.htm" title="反向遍历--当你修改一个元素的outerHTML时,该元素会被从 DOM 中移除" target="_blank">反向遍历--当你修改一个元素的outerHTML时,该元素会被从 DOM 中移除</a> <span class="text-muted">专注VB编程开发20年</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>varspans=editor.querySelectorAll('span[mytag]');//将NodeList转换为数组//varspansArray=Array.from(spans);varid=0spans.forEach(span=>{span.outerhtml这里无法直接修改吗?}在JavaScript中,outerHTML是一个可写属性,但你需要注意以下几点:1.属性名大小写</div> </li> <li><a href="/article/1941998018366599168.htm" title="java中,stream的filter和list的removeIf筛选速度比较" target="_blank">java中,stream的filter和list的removeIf筛选速度比较</a> <span class="text-muted">码傻啦弟</span> <a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/1.htm">软件开发</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/list/1.htm">list</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>在Java里,Stream的filter和List的removeIf筛选效率要依据具体情形来判断。1.操作本质有别Stream的filter:它是一种中间操作,不会立刻执行,而是把筛选条件记录下来。只有遇到终端操作时,才会开始处理元素。此操作不会对原集合进行修改,而是生成一个新的流。List的removeIf:这是一种终端操作,会立即对原集合进行修改,删除满足条件的元素。它直接在原集合上进行元素的</div> </li> <li><a href="/article/1941997514039291904.htm" title="spring中@Transactional注解和事务的实战理解附代码" target="_blank">spring中@Transactional注解和事务的实战理解附代码</a> <span class="text-muted">GJCTYU</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</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/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>文章目录前言一、事务是什么?二、事务的特性2.1隔离性2.2事务的隔离级别三、@Transactional注解@Transactional注解简介基本用法常用属性配置事务传播行为事务隔离级别异常处理与回滚性能优化建议四、事务不生效的可能原因方法访问权限非public自调用问题异常被捕获未抛出数据库引擎不支持事务未启用事务管理特殊场景:final/static方法五、分布式事务考虑总结前言在开发过程</div> </li> <li><a href="/article/1941997009670041600.htm" title="量子化学仿真软件:NWChem_(17).NWChem与其他软件的接口" target="_blank">量子化学仿真软件:NWChem_(17).NWChem与其他软件的接口</a> <span class="text-muted">kkchenjj</span> <a class="tag" taget="_blank" href="/search/%E5%8C%96%E5%B7%A5%E4%BB%BF%E7%9C%9F2/1.htm">化工仿真2</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/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</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%8C%96%E5%B7%A5%E4%BB%BF%E7%9C%9F/1.htm">化工仿真</a> <div>NWChem与其他软件的接口在量子化学仿真中,NWChem经常需要与其他软件进行接口连接,以便利用其他软件的优势或扩展其功能。本节将详细介绍NWChem与其他常用软件的接口,包括电子结构软件、分子动力学软件、数据分析工具等。我们将探讨如何通过这些接口实现数据交换、功能调用和联合仿真。1.NWChem与Gaussian的接口Gaussian是另一款广泛使用的量子化学软件,具有强大的电子结构计算功能。</div> </li> <li><a href="/article/1941989327445749760.htm" title="Tomcat镜像实战:掌握Dockerfile的编写以及发布项目" target="_blank">Tomcat镜像实战:掌握Dockerfile的编写以及发布项目</a> <span class="text-muted">hunjinYang</span> <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a> <div>1.为什么选择Docker部署Tomcat?在传统的JavaWeb项目部署中,我们通常需要手动安装JDK、配置Tomcat环境变量、手动部署WAR包,部署过程繁琐、不可重复、环境易出错。而Docker的出现彻底改变了这一局面。本博客将通过一个完整的Tomcat镜像构建与部署实例,带你逐步掌握以下技能:编写自己的Dockerfile构建定制化的Tomcat镜像(包含JDK与Tomcat)在容器中运行</div> </li> <li><a href="/article/1941987184982683648.htm" title="C#安装使用教程" target="_blank">C#安装使用教程</a> <span class="text-muted">小奇JAVA面试</span> <a class="tag" taget="_blank" href="/search/%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8%E6%95%99%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%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一、C#简介C#(读作C-Sharp)是微软开发的现代化、面向对象的编程语言,运行在.NET平台之上。它语法简洁、安全,广泛用于桌面应用、Web开发、游戏开发(Unity)以及跨平台开发。二、C#应用场景Windows桌面应用程序(WinForms、WPF)Web应用(ASP.NET)游戏开发(Unity3D)移动开发(Xamarin、MAUI)云服务、API开发控制台程序、自动化工具三、安装开发</div> </li> <li><a href="/article/1941983782642970624.htm" title="ASP.NET Web Pages - 教程" target="_blank">ASP.NET Web Pages - 教程</a> <span class="text-muted">samFuB</span> <a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</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%90%8E%E7%AB%AF/1.htm">后端</a> <div>ASP.NET是一个使用HTML、CSS、JavaScript和服务器脚本创建网页和网站的开发框架。ASP.NET支持三种不同的开发模式:WebPages(Web页面)、MVC(ModelViewController模型-视图-控制器)、WebForms(Web窗体):本教程介绍WebPages。WebPagesMVCWebForms从何入手?多数开发人员学习一个新技术,是从查看运行实例开始的。通</div> </li> <li><a href="/article/1941982648423477248.htm" title="ASP.NET Web Pages 教程:从入门到精通" target="_blank">ASP.NET Web Pages 教程:从入门到精通</a> <span class="text-muted">KrDebugging</span> <a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</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%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/1.htm">编程学习</a> <div>ASP.NETWebPages是一种用于构建动态网页的技术,它结合了传统的HTML、CSS和JavaScript,以及强大的服务器端编程语言C#。本教程将带您逐步学习ASP.NETWebPages的基础知识,并通过示例代码演示如何创建交互性强、功能丰富的网页应用程序。环境设置在开始学习ASP.NETWebPages之前,您需要进行以下环境设置:安装VisualStudio:您可以从Microsof</div> </li> <li><a href="/article/1941981767007268864.htm" title="JavaScript中==和===的区别,以及应用场景" target="_blank">JavaScript中==和===的区别,以及应用场景</a> <span class="text-muted">小熊哥^--^</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>比较操作符==与===的区别==是一个等于操作符,如果操作数相等就会返回true,但==涉及JavaScript中的隐式转换。在使用==时会先进行类型转换,再判断操作数是否相等。以下是示例:console.log(true==1);//trueconsole.log("1"==true);//trueconsole.log("55"==55);//trueconsole.log(0==false)</div> </li> <li><a href="/article/1941981640834215936.htm" title="Kafka" target="_blank">Kafka</a> <span class="text-muted">小熊哥^--^</span> <a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>一、什么是Kafka?Kafka的主要用途?Kafka是一个分布式流处理平台,是Apache的一个顶级项目,它被设计用于高吞吐量,分布式、持久性的数据流处理。Kafka实现了一套非常高效的一种发布订阅模型,应用场景非常广泛,比如日志聚合(收集日志)、数据流处理、数据仓库集成(传输数据到数据仓库)、应用程序集成(作为消息中间件来实现异步通信)、流媒体处理(列如实时监控,事件驱动的应用程序)二、top</div> </li> <li><a href="/article/1941978991992827904.htm" title="多系统兼容打印机万能驱动软件:Win/Mac/Linux自动检测 + 全品牌适配" target="_blank">多系统兼容打印机万能驱动软件:Win/Mac/Linux自动检测 + 全品牌适配</a> <span class="text-muted"></span> <div>各位打印小白们,你们有没有遇到过打印机连不上电脑,或者找不到合适驱动的糟心事?今天就来给大家唠唠打印机万能驱动这个软件软件下载地址安装包打印机万能驱动,说白了就是给打印机用的通用驱动程序工具,靠内置的驱动库和自动检测技术,能适配好多不同品牌、不同型号的打印机。你再也不用发愁找不到对应的驱动,也不用被复杂的安装流程搞得晕头转向啦!这软件兼容性超强,Windows、Mac、Linux这些操作系统它都能</div> </li> <li><a href="/article/1941977606459027456.htm" title="讨论 Git 在版本控制中的重要性(面试题200合集,中频、实用)" target="_blank">讨论 Git 在版本控制中的重要性(面试题200合集,中频、实用)</a> <span class="text-muted">快撑死的鱼</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%AE%9D%E5%85%B8%EF%BC%88%E9%9D%A2%E8%AF%95/1.htm">算法工程师宝典(面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%9C%80%E6%96%B0%E6%8A%80%E6%9C%AF%E5%BF%85%E5%A4%87%EF%BC%89/1.htm">学习最新技术必备)</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/elasticsearch/1.htm">elasticsearch</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a> <div>Git在版本控制中的重要性在软件开发领域,版本控制系统(VersionControlSystem,VCS)扮演着至关重要的角色。它不仅帮助开发者追踪和管理代码的变更历史,更是团队协作、项目管理和代码质量保障的基石。而在众多的版本控制系统中,Git凭借其卓越的性能、灵活的设计和强大的功能,已经成为当今世界范围内最流行、应用最广泛的版本控制工具。理解Git的重要性,对于任何软件开发者而言都是一项基本且</div> </li> <li><a href="/article/1941973572654264320.htm" title="Spring Boot Flyway:数据库迁移工具集成" target="_blank">Spring Boot Flyway:数据库迁移工具集成</a> <span class="text-muted">Java技术栈实战</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</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/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>SpringBootFlyway:数据库迁移工具集成全解析关键词:SpringBoot、Flyway、数据库迁移、版本控制、自动化脚本摘要:在团队协作开发中,数据库结构的变更管理一直是个“老大难”问题——手动执行SQL脚本容易漏操作、不同环境版本不一致、历史变更无法追溯……Flyway作为一款轻量级数据库迁移工具,能帮我们自动化管理数据库版本,就像给数据库“拍电影”,每一帧(每个版本)都清晰可查。</div> </li> <li><a href="/article/1941973194273517568.htm" title="Spring Boot 应用开发入门指南" target="_blank">Spring Boot 应用开发入门指南</a> <span class="text-muted">20230310121</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>引言在现代软件开发中,SpringBoot以其简化配置和快速开发的特性,成为构建Java应用的热门选择。本文将通过多个主题为大家详细介绍如何搭建和开发SpringBoot应用,涵盖开发环境配置、项目搭建、持久层整合等内容。1.配置开发环境1.1JDK安装首先,确保安装了JDK(JavaDevelopmentKit)。推荐使用JDK11或更高版本。下载地址:OracleJDK安装完成后,配置环境变量</div> </li> <li><a href="/article/1941972941617033216.htm" title="免费棱光 PDF:免安装 加水印 去水印 批量格式转换" target="_blank">免费棱光 PDF:免安装 加水印 去水印 批量格式转换</a> <span class="text-muted">小瑞软件库</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6/1.htm">开源软件</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E8%84%91/1.htm">电脑</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%9E%84%E5%BB%BA/1.htm">软件构建</a> <div>各位办公小能手们,今天给大家介绍一款超棒的PDF处理工具——棱光PDF!它完全免费,专门解决咱对PDF文件的常见操作需求。绿色免安装,体积小得跟颗花生米似的,打开就能用。它有三大核心功能,分别是水印管理、格式转换和批量处理。软件下载地址安装包先说说水印处理,你可以给PDF文件加上自定义的文字或者图片水印,还能随便调整水印的位置、大小和透明度。要是文档里已经有水印,它也能精准识别,然后一键清除。,把</div> </li> <li><a href="/article/1941969915636412416.htm" title="微信聊天记录监听与转发工具" target="_blank">微信聊天记录监听与转发工具</a> <span class="text-muted">明天过后0122</span> <a class="tag" taget="_blank" href="/search/%E9%AB%98%E6%95%88%E5%8A%9E%E5%85%AC/1.htm">高效办公</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1/1.htm">微信</a> <div>以下是基于您需求撰写的《微信聊天记录监听与转发工具需求分析开发文档》:微信聊天记录监听与转发工具需求分析开发文档一、项目概述1.1目标开发基于wxauto的自动化工具,实现:实时监听指定微信聊天窗口(群组/个人)捕获并处理新消息按指定策略转发至目标用户"元宝"确保操作间隔符合10秒限制1.2技术栈核心框架:Python3.8+微信自动化:wxauto_custom(基于wxauto的定制版本)并发</div> </li> <li><a href="/article/1941968404160245760.htm" title="单片机:STM32F103的开发环境搭建" target="_blank">单片机:STM32F103的开发环境搭建</a> <span class="text-muted">InnoLink_1024</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a> <div>本文将详细介绍如何搭建STM32F103的开发环境。STM32F103是STMicroelectronics推出的一款基于ARMCortex-M3内核的32位微控制器(MCU),广泛应用于嵌入式开发。以下是搭建开发环境的详细步骤,涵盖硬件准备、软件安装、工具链配置及简单的开发示例。1.硬件准备在搭建STM32F103开发环境之前,需要准备以下硬件:STM32F103开发板:常见型号包括STM32F</div> </li> <li><a href="/article/1941967520936292352.htm" title="支持向量机(SVM)在肝脏CT/MRI图像分类(肝癌检测)中的应用及实现" target="_blank">支持向量机(SVM)在肝脏CT/MRI图像分类(肝癌检测)中的应用及实现</a> <span class="text-muted">猿享天开</span> <a class="tag" taget="_blank" href="/search/%E5%8C%BB%E5%AD%A6%E5%BD%B1%E5%83%8F/1.htm">医学影像</a><a class="tag" taget="_blank" href="/search/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA/1.htm">支持向量机</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++,C#,Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQLserver,Oracle,mysql,postgresql等进行开发应用,熟悉DICOM医学影像及DICOM协议,业余时间自学JavaScript,Vue,</div> </li> <li><a href="/article/1941967142966587392.htm" title="C++高级编程(7)-- 协程在C++中的应用" target="_blank">C++高级编程(7)-- 协程在C++中的应用</a> <span class="text-muted">给你一颗语法糖</span> <a class="tag" taget="_blank" href="/search/C%2B%2B%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B/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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>协程在C++中的应用随着现代编程范式的发展,协程(Coroutines)已经成为了并发编程和异步编程的一个重要工具。在C++中,协程是一种能够被挂起和重新恢复执行的函数,它允许程序员以一种更加直观和简洁的方式来编写异步代码。本篇博客将深入探讨C++中的协程概念、实现原理以及高级应用案例,帮助读者更好地理解和应用这一强大的编程技术。协程基础在C++20标准中,协程是通过关键字co_await,co_</div> </li> <li><a href="/article/1941966639004184576.htm" title="简述C++ nlohmann/json 库" target="_blank">简述C++ nlohmann/json 库</a> <span class="text-muted">ikkkkkkkl</span> <a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/nlohmann/1.htm">nlohmann</a> <div>目录JSON概述nlohmann/json库的使用创建json数组/对象字符串解析(parse反序列化)数据访问序列化文件读写JSON概述JSON(JavaScripObjectNotation)是一种轻量级、跨语言的数据交换格式。它基于ECMAScript子集,以独立于编程语言的文本格式存储和表示数据,简洁清晰的结构使其成为理想的数据交换语言,易读、易写且便于机器解析生成,能提升网络传输效率。J</div> </li> <li><a href="/article/1941965502536544256.htm" title="《推客分销系统架构设计:从零搭建高并发社交裂变引擎》" target="_blank">《推客分销系统架构设计:从零搭建高并发社交裂变引擎》</a> <span class="text-muted">wx_ywyy6798</span> <a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">推客小程序</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E7%B3%BB%E7%BB%9F/1.htm">推客系统</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/1.htm">推客系统开发</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91/1.htm">推客小程序开发</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E5%88%86%E9%94%80%E7%B3%BB%E7%BB%9F/1.htm">推客分销系统</a> <div>在当今流量红利逐渐消退的数字营销环境中,推客分销系统已成为企业实现用户裂变增长和销售转化的核心工具。本文将深入解析推客分销系统的开发逻辑、架构设计及运营策略,帮助您构建一套高效的分销增长引擎。一、推客分销系统的商业价值与市场背景1.1为什么分销系统成为企业标配在获客成本不断攀升的今天,传统广告投放的ROI持续下降。推客分销系统通过将用户转化为推广者,实现了:低成本获客:平均获客成本仅为传统渠道的3</div> </li> <li><a href="/article/1941964903883534336.htm" title="深入 Go 语言垃圾回收:从原理到内建类型 Slice、Map 的陷阱以及为何需要 strings.Builder" target="_blank">深入 Go 语言垃圾回收:从原理到内建类型 Slice、Map 的陷阱以及为何需要 strings.Builder</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/go%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6/1.htm">go垃圾回收</a> <div>本文是2025-0526-go-gc.md的续篇。在理解了Go垃圾回收(GarbageCollection,GC)的宏观设计,包括并发标记清扫、三色标记法以及混合写屏障等核心机制之后,一个自然而然O问题是:这些通用的GC原理是如何与Go语言内建(built-in)的数据结构(如切片、映射等)协同工作的?这些我们日常使用的工具,其内存的生命周期管理背后又有哪些值得注意的细节?本文将作为续篇,深入探讨</div> </li> <li><a href="/article/1941962228236349440.htm" title="Android课程前言" target="_blank">Android课程前言</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/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/Kotlin/1.htm">Kotlin</a> <div>目录一.前言1.Android可以采用哪些语言2.Kotlin和Java的关系①完全互操作(核心关系)②Kotlin是Java的“升级版”③Google的官方态度④Java的现状⑤如何选择?⑥类比总结:一.前言1.Android可以采用哪些语言首选语言为Kotlin,但是上手难度较大;还可以使用Java,这是安卓的传统主力编程语言。总之,建议先使用Java语言开始学Android,后期再学Kotl</div> </li> <li><a href="/article/1941961975630196736.htm" title="Spring IO 与企业级应用开发_构建标准化项目的最佳实践" target="_blank">Spring IO 与企业级应用开发_构建标准化项目的最佳实践</a> <span class="text-muted"></span> <div>1.前言1.1SpringIO的诞生背景与定位随着Spring生态的不断扩展,Java开发者在使用SpringBoot、SpringData、SpringSecurity等模块时,常常面临一个痛点:不同模块之间版本不一致、依赖冲突频发、升级困难。为了解决这一问题,Spring推出了SpringIOPlatform,它是一个统一版本管理平台,提供了一套经过验证的模块版本组合(BOM),帮助开发者快速</div> </li> <li><a href="/article/1941961974753587200.htm" title="实战篇:(十三)新手指南:搭建 Vue 3 项目,完美结合 Element Plus 的使用技巧!" target="_blank">实战篇:(十三)新手指南:搭建 Vue 3 项目,完美结合 Element Plus 的使用技巧!</a> <span class="text-muted"></span> <div>新手指南:搭建Vue3项目,完美结合ElementPlus的使用技巧!本篇文章将带你一步一步地学习如何使用Vite创建一个Vue3+TypeScript项目,并轻松集成ElementPlus组件库,让你的应用界面更加优雅和实用。无论你是刚接触前端开发的新手,还是希望提升开发效率的开发者,这篇指南都将为你提供清晰的步骤和实用的技巧,帮助你快速上手。在文章中,我们将详细介绍项目的创建过程、按需加载El</div> </li> <li><a href="/article/1941961470992510976.htm" title="巧用云平台API实现开源模型免费调用的实战教程" target="_blank">巧用云平台API实现开源模型免费调用的实战教程</a> <span class="text-muted">herosunly</span> <a class="tag" taget="_blank" href="/search/AIGC/1.htm">AIGC</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/API/1.htm">API</a><a class="tag" taget="_blank" href="/search/%E5%AE%9E%E6%88%98%E6%95%99%E7%A8%8B/1.htm">实战教程</a> <div>  大家好,我是herosunly。985院校硕士毕业,现担任算法工程师一职,获得CSDN博客之星第一名,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得多项AI顶级比赛的Top名次,其中包括阿里云、科大讯飞比赛第一名,CCF、开放原子比赛二等奖。在技术创新领域拥有多项授权发明。曾辅导多位非科班出身的同学成功进入算法行业就业</div> </li> <li><a href="/article/1941957687512199168.htm" title="stm32c8t6工程,使用hal库,如何解决?" target="_blank">stm32c8t6工程,使用hal库,如何解决?</a> <span class="text-muted">bug菌¹</span> <a class="tag" taget="_blank" href="/search/%E5%85%A8%E6%A0%88Bug%E8%B0%83%E4%BC%98%28%E5%AE%9E%E6%88%98%E7%89%88%29/1.htm">全栈Bug调优(实战版)</a><a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!全文目录:问题描述解决方案1.**分析报错问题**2.**蓝牙通信处理的中断机制**代码示例:蓝牙数据接收中断处理3.**倒计时功能实现**4.**舵机控制**5.**O</div> </li> <li><a href="/article/72.htm" title="Java开发中,spring mvc 的线程怎么调用?" target="_blank">Java开发中,spring mvc 的线程怎么调用?</a> <span class="text-muted">小麦麦子</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a> <div>今天逛知乎,看到最近很多人都在问spring mvc 的线程http://www.maiziedu.com/course/java/ 的启动问题,觉得挺有意思的,那哥们儿问的也听仔细,下面的回答也很详尽,分享出来,希望遇对遇到类似问题的Java开发程序猿有所帮助。 问题:     在用spring mvc架构的网站上,设一线程在虚拟机启动时运行,线程里有一全局</div> </li> <li><a href="/article/199.htm" title="maven依赖范围" target="_blank">maven依赖范围</a> <span class="text-muted">bitcarter</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>1.test 测试的时候才会依赖,编译和打包不依赖,如junit不被打包 2.compile 只有编译和打包时才会依赖 3.provided 编译和测试的时候依赖,打包不依赖,如:tomcat的一些公用jar包 4.runtime 运行时依赖,编译不依赖 5.默认compile 依赖范围compile是支持传递的,test不支持传递 1.传递的意思是项目A,引用</div> </li> <li><a href="/article/326.htm" title="Jaxb org.xml.sax.saxparseexception : premature end of file" target="_blank">Jaxb org.xml.sax.saxparseexception : premature end of file</a> <span class="text-muted">darrenzhu</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/premature/1.htm">premature</a><a class="tag" taget="_blank" href="/search/JAXB/1.htm">JAXB</a> <div>如果在使用JAXB把xml文件unmarshal成vo(XSD自动生成的vo)时碰到如下错误: org.xml.sax.saxparseexception : premature end of file 很有可能时你直接读取文件为inputstream,然后将inputstream作为构建unmarshal需要的source参数。InputSource inputSource = new In</div> </li> <li><a href="/article/453.htm" title="CSS Specificity" target="_blank">CSS Specificity</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E6%9D%83%E9%87%8D/1.htm">权重</a><a class="tag" taget="_blank" href="/search/Specificity/1.htm">Specificity</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>  有时候对于页面元素设置了样式,可为什么页面的显示没有匹配上呢? because specificity CSS 的选择符是有权重的,当不同的选择符的样式设置有冲突时,浏览器会采用权重高的选择符设置的样式。     规则:   HTML标签的权重是1 Class 的权重是10 Id 的权重是100 </div> </li> <li><a href="/article/580.htm" title="java与servlet" target="_blank">java与servlet</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a> <div>servlet 搞java web开发的人一定不会陌生,而且大家还会时常用到它。 下面是java官方网站上对servlet的介绍: java官网对于servlet的解释 写道 Java Servlet Technology Overview Servlets are the Java platform technology of choice for extending and enha</div> </li> <li><a href="/article/707.htm" title="eclipse中安装maven插件" target="_blank">eclipse中安装maven插件</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>1.首先去官网下载 Maven: http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-3.2.3-bin.tar.gz 下载完成之后将其解压, 我将解压后的文件夹:apache-maven-3.2.3, 并将它放在 D:\tools目录下, 即 maven 最终的路径是:D:\tools\apache-mave</div> </li> <li><a href="/article/834.htm" title="jpa@OneToOne关联关系" target="_blank">jpa@OneToOne关联关系</a> <span class="text-muted">布衣凌宇</span> <a class="tag" taget="_blank" href="/search/jpa/1.htm">jpa</a> <div>Nruser里的pruserid关联到Pruser的主键id,实现对一个表的增删改,另一个表的数据随之增删改。 Nruser实体类 //***************************************************************** @Entity @Table(name="nruser") @DynamicInsert @Dynam</div> </li> <li><a href="/article/961.htm" title="我的spring学习笔记11-Spring中关于声明式事务的配置" target="_blank">我的spring学习笔记11-Spring中关于声明式事务的配置</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1/1.htm">事务</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE/1.htm">配置</a> <div>这两天学到事务管理这一块,结合到之前的terasoluna框架,觉得书本上讲的还是简单阿。我就把我从书本上学到的再结合实际的项目以及网上看到的一些内容,对声明式事务管理做个整理吧。我看得Spring in Action第二版中只提到了用TransactionProxyFactoryBean和<tx:advice/>,定义注释驱动这三种,我承认后两种的内容很好,很强大。但是实际的项目当中</div> </li> <li><a href="/article/1088.htm" title="java 动态代理简单实现" target="_blank">java 动态代理简单实现</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/handler/1.htm">handler</a><a class="tag" taget="_blank" href="/search/proxy/1.htm">proxy</a><a class="tag" taget="_blank" href="/search/dynamic/1.htm">dynamic</a><a class="tag" taget="_blank" href="/search/service/1.htm">service</a> <div>dynamicproxy.service.HelloService package dynamicproxy.service; public interface HelloService { public void sayHello(); }   dynamicproxy.service.impl.HelloServiceImpl package dynamicp</div> </li> <li><a href="/article/1215.htm" title="JDBC连接数据库" target="_blank">JDBC连接数据库</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/JDBC%E7%BC%96%E7%A8%8B/1.htm">JDBC编程</a><a class="tag" taget="_blank" href="/search/JAVA%E6%93%8D%E4%BD%9Coracle%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">JAVA操作oracle数据库</a> <div>         如果我们要想连接oracle公司的数据库,就要首先下载oralce公司的驱动程序,将这个驱动程序的jar包导入到我们工程中;   JDBC链接数据库的代码和固定写法;     1,加载oracle数据库的驱动;     &nb</div> </li> <li><a href="/article/1342.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/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a> <div>谈到单例模式,我们立马会想到饿汉式和懒汉式加载,所谓饿汉式就是在创建类时就创建好了实例,懒汉式在获取实例时才去创建实例,即延迟加载。 饿汉式: package com.bijian.study; public class Singleton { private Singleton() { } // 注意这是private 只供内部调用 private static</div> </li> <li><a href="/article/1469.htm" title="javascript读取和修改原型特别需要注意原型的读写不具有对等性" target="_blank">javascript读取和修改原型特别需要注意原型的读写不具有对等性</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/prototype/1.htm">prototype</a> <div>        对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象A,假设它的原型对象是B,B的原型对象是null。如果我们需要读取A对象的name属性值,那么JS会优先在A中查找,如果找到了name属性那么就返回;如果A中没有name属性,那么就到原型B中查找name,如果找到了就返回;如果原型B中也没有</div> </li> <li><a href="/article/1596.htm" title="【持久化框架MyBatis3六】MyBatis3集成第三方DataSource" target="_blank">【持久化框架MyBatis3六】MyBatis3集成第三方DataSource</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/dataSource/1.htm">dataSource</a> <div>MyBatis内置了数据源的支持,如:   <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <data</div> </li> <li><a href="/article/1723.htm" title="我程序中用到的urldecode和base64decode,MD5" target="_blank">我程序中用到的urldecode和base64decode,MD5</a> <span class="text-muted">bitcarter</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/MD5/1.htm">MD5</a><a class="tag" taget="_blank" href="/search/base64decode/1.htm">base64decode</a><a class="tag" taget="_blank" href="/search/urldecode/1.htm">urldecode</a> <div>这里是base64decode和urldecode,Md5在附件中。因为我是在后台所以需要解码: string Base64Decode(const char* Data,int DataByte,int& OutByte) { //解码表 const char DecodeTable[] = { 0, 0, 0, 0, 0, 0</div> </li> <li><a href="/article/1850.htm" title="腾讯资深运维专家周小军:QQ与微信架构的惊天秘密" target="_blank">腾讯资深运维专家周小军:QQ与微信架构的惊天秘密</a> <span class="text-muted">ronin47</span> <div>社交领域一直是互联网创业的大热门,从PC到移动端,从OICQ、MSN到QQ。到了移动互联网时代,社交领域应用开始彻底爆发,直奔黄金期。腾讯在过去几年里,社交平台更是火到爆,QQ和微信坐拥几亿的粉丝,QQ空间和朋友圈各种刷屏,写心得,晒照片,秀视频,那么谁来为企鹅保驾护航呢?支撑QQ和微信海量数据背后的架构又有哪些惊天内幕呢?本期大讲堂的内容来自今年2月份ChinaUnix对腾讯社交网络运营服务中心</div> </li> <li><a href="/article/1977.htm" title="java-69-旋转数组的最小元素。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素" target="_blank">java-69-旋转数组的最小元素。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class MinOfShiftedArray { /** * Q69 旋转数组的最小元素 * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。 * 例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 */ publ</div> </li> <li><a href="/article/2104.htm" title="看博客,应该是有方向的" target="_blank">看博客,应该是有方向的</a> <span class="text-muted">Cb123456</span> <a class="tag" taget="_blank" href="/search/%E5%8F%8D%E7%9C%81/1.htm">反省</a><a class="tag" taget="_blank" href="/search/%E7%9C%8B%E5%8D%9A%E5%AE%A2/1.htm">看博客</a> <div>看博客,应该是有方向的:  我现在就复习以前的,在补补以前不会的,现在还不会的,同时完善完善项目,也看看别人的博客.  我刚突然想到的:  1.应该看计算机组成原理,数据结构,一些算法,还有关于android,java的。  2.对于我,也快大四了,看一些职业规划的,以及一些学习的经验,看看别人的工作总结的.    为什么要写</div> </li> <li><a href="/article/2231.htm" title="[开源与商业]做开源项目的人生活上一定要朴素,尽量减少对官方和商业体系的依赖" target="_blank">[开源与商业]做开源项目的人生活上一定要朴素,尽量减少对官方和商业体系的依赖</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/1.htm">开源项目</a> <div>      为什么这样说呢?  因为科学和技术的发展有时候需要一个平缓和长期的积累过程,但是行政和商业体系本身充满各种不稳定性和不确定性,如果你希望长期从事某个科研项目,但是却又必须依赖于某种行政和商业体系,那其中的过程必定充满各种风险。。。       所以,为避免这种不确定性风险,我</div> </li> <li><a href="/article/2358.htm" title="一个 sql优化 ([精华] 一个查询优化的分析调整全过程!很值得一看 )" target="_blank">一个 sql优化 ([精华] 一个查询优化的分析调整全过程!很值得一看 )</a> <span class="text-muted">cwqcwqmax9</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>见   http://www.itpub.net/forum.php?mod=viewthread&tid=239011 Web翻页优化实例 提交时间: 2004-6-18 15:37:49      回复    发消息  环境: Linux ve</div> </li> <li><a href="/article/2485.htm" title="Hibernat and Ibatis" target="_blank">Hibernat and Ibatis</a> <span class="text-muted">dashuaifu</span> <a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a> <div>Hibernate  VS  iBATIS 简介 Hibernate 是当前最流行的O/R mapping框架,当前版本是3.05。它出身于sf.net,现在已经成为Jboss的一部分了 iBATIS 是另外一种优秀的O/R mapping框架,当前版本是2.0。目前属于apache的一个子项目了。 相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mappi</div> </li> <li><a href="/article/2612.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> <div>#!/bin/sh # this shell to backup mysql #1413161683@qq.com (QQ:1413161683 DuChengJiu) _dbDir=/var/lib/mysql/ _today=`date +%w` _bakDir=/usr/backup/$_today [ ! -d $_bakDir ] && mkdir -p </div> </li> <li><a href="/article/2739.htm" title="iOS第三方开源库的吐槽和备忘" target="_blank">iOS第三方开源库的吐槽和备忘</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a> <div>转自 ibireme的博客   做iOS开发总会接触到一些第三方库,这里整理一下,做一些吐槽。   目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code、SourceForge等地方。由于Github社区太过主流,这里主要介绍一下Github里面流行的iOS库。   首先整理了一份 Github上排名靠</div> </li> <li><a href="/article/2866.htm" title="html wlwmanifest.xml" target="_blank">html wlwmanifest.xml</a> <span class="text-muted">eoems</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>所谓优化wp_head()就是把从wp_head中移除不需要元素,同时也可以加快速度。 步骤: 加入到function.php remove_action('wp_head', 'wp_generator'); //wp-generator移除wordpress的版本号,本身blog的版本号没什么意义,但是如果让恶意玩家看到,可能会用官网公布的漏洞攻击blog remov</div> </li> <li><a href="/article/2993.htm" title="浅谈Java定时器发展" target="_blank">浅谈Java定时器发展</a> <span class="text-muted">hacksin</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%B9%B6%E5%8F%91/1.htm">并发</a><a class="tag" taget="_blank" href="/search/timer/1.htm">timer</a><a class="tag" taget="_blank" href="/search/%E5%AE%9A%E6%97%B6%E5%99%A8/1.htm">定时器</a> <div>java在jdk1.3中推出了定时器类Timer,而后在jdk1.5后由Dou Lea从新开发出了支持多线程的ScheduleThreadPoolExecutor,从后者的表现来看,可以考虑完全替代Timer了。 Timer与ScheduleThreadPoolExecutor对比: 1.    Timer始于jdk1.3,其原理是利用一个TimerTask数组当作队列</div> </li> <li><a href="/article/3120.htm" title="移动端页面侧边导航滑入效果" target="_blank">移动端页面侧边导航滑入效果</a> <span class="text-muted">ini</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascirpt/1.htm">javascirpt</a> <div>效果体验:http://hovertree.com/texiao/mobile/2.htm可以使用移动设备浏览器查看效果。效果使用到jquery-2.1.4.min.js,该版本的jQuery库是用于支持HTML5的浏览器上,不再兼容IE8以前的浏览器,现在移动端浏览器一般都支持HTML5,所以使用该jQuery没问题。HTML文件代码: <!DOCTYPE html> <h</div> </li> <li><a href="/article/3247.htm" title="AspectJ+Javasist记录日志" target="_blank">AspectJ+Javasist记录日志</a> <span class="text-muted">kane_xie</span> <a class="tag" taget="_blank" href="/search/aspectj/1.htm">aspectj</a><a class="tag" taget="_blank" href="/search/javasist/1.htm">javasist</a> <div>在项目中碰到这样一个需求,对一个服务类的每一个方法,在方法开始和结束的时候分别记录一条日志,内容包括方法名,参数名+参数值以及方法执行的时间。   @Override public String get(String key) { // long start = System.currentTimeMillis(); // System.out.println("Be</div> </li> <li><a href="/article/3374.htm" title="redis学习笔记" target="_blank">redis学习笔记</a> <span class="text-muted">MJC410621</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a> <div>1)nosql数据库主要由以下特点:非关系型的、分布式的、开源的、水平可扩展的。 1,处理超大量的数据 2,运行在便宜的PC服务器集群上, 3,击碎了性能瓶颈。 1)对数据高并发读写。 2)对海量数据的高效率存储和访问。 3)对数据的高扩展性和高可用性。 redis支持的类型: Sring 类型 set name lijie get name lijie set na</div> </li> <li><a href="/article/3501.htm" title="使用redis实现分布式锁" target="_blank">使用redis实现分布式锁</a> <span class="text-muted">qifeifei</span> <div>在多节点的系统中,如何实现分布式锁机制,其中用redis来实现是很好的方法之一,我们先来看一下jedis包中,有个类名BinaryJedis,它有个方法如下:   public Long setnx(final byte[] key, final byte[] value) { checkIsInMulti(); client.setnx(key, value); ret</div> </li> <li><a href="/article/3628.htm" title="BI并非万能,中层业务管理报表要另辟蹊径" target="_blank">BI并非万能,中层业务管理报表要另辟蹊径</a> <span class="text-muted">张老师的菜</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/BI/1.htm">BI</a><a class="tag" taget="_blank" href="/search/%E5%95%86%E4%B8%9A%E6%99%BA%E8%83%BD/1.htm">商业智能</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8C%96/1.htm">信息化</a> <div>       BI是商业智能的缩写,是可以帮助企业做出明智的业务经营决策的工具,其数据来源于各个业务系统,如ERP、CRM、SCM、进销存、HER、OA等。        BI系统不同于传统的管理信息系统,他号称是一个整体应用的解决方案,是融入管理思想的强大系统:有着系统整体的设计思想,支持对所有</div> </li> <li><a href="/article/3755.htm" title="安装rvm后出现rvm not a function 或者ruby -v后提示没安装ruby的问题" target="_blank">安装rvm后出现rvm not a function 或者ruby -v后提示没安装ruby的问题</a> <span class="text-muted">wudixiaotie</span> <a class="tag" taget="_blank" href="/search/function/1.htm">function</a> <div>1.在~/.bashrc最后加入 [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"  2.重新启动terminal输入:   rvm use ruby-2.2.1 --default  把当前安装的ruby版本设为默</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>