stax 和jaxb 关系_XML解组基准:JAXB,STAx,Woodstox

stax 和jaxb 关系

介绍

上周末,我开始考虑如何以一种资源友好的方式处理大量XML数据。我要解决的主要问题是如何以块的形式处理大型XML文件,同时提供上游/下游系统,需要处理一些数据。

当然,我已经使用JAXB技术已有几年了。 使用JAXB的主要优点是可以加快产品上市时间; 如果拥有XML模式,则可以使用工具自动自动生成相应的Java域模型类(Eclipse Indigo,各种工具中的Maven jaxb插件,ant任务,仅举几例)。 然后,JAXB API提供一个Marshaller和Unmarshaller来编写/读取XML数据,从而映射Java域模型。

当JAXB的思想作为我的问题解决方案,我suddendlly意识到,JAXB保存在内存中的XML架构的整体客观 ,所以一个显而易见的问题是:“如何将我们的基础设施应对大型XML文件(例如,在我的情况与一些元素> 100,000)是否要使用JAXB?”。 我可以简单地生成一个大的XML文件,然后为其创建一个客户端,并了解有关内存消耗的信息。

众所周知,在Java中主要有两种处理XML数据的方法:DOM和SAX。 使用DOM,XML文档以树的形式表示在内存中。 如果需要对树节点进行樱桃式访问或需要编写简短的XML文档,则DOM很有用。 另一方面,是一种事件驱动技术SAX,该技术当时将整个文档解析为一个XML元素,并且对于每个XML重要事件,将回调“推”到Java客户端,然后该Java客户端处理它们(例如START_DOCUMENT,START_ELEMENT,END_ELEMENT等)。 由于SAX不会将整个文档带入内存,而是将类似游标的方法应用于XML处理,因此它不会消耗大量内存。 SAX的缺点是它处理整个文档的开始到结束; 这可能不一定是大型XML文档所需要的。 例如,在我的场景中,我希望能够传递给下游系统XML元素(但可用),但同时也许我只想一次传递100个元素,实现某种分页解。 从内存消耗的角度来看,DOM似乎过于苛刻,而SAX似乎可以满足我的需求。

我记得曾经读过一些有关STax的知识,它是一种Java技术,在RAM友好的同时提供了拉XML元素 (而不是推送XML元素,例如SAX)的能力。 然后,我研究了该技术,并决定STax可能是我想要的折衷方案。 但是我想保留JAXB提供的简单编程模型,所以我确实需要将两者结合起来。 在调查STax时,我遇到了Woodstox。 这个开源项目有望成为一个比许多其他工具更快的XML解析器,因此我决定也将其包含在我的基准测试中。 现在,我具有创建基准的所有元素,以便在处理大型XML文档时为我提供内存消耗和处理速度指标。

基准计划

为了创建基准,我需要执行以下操作:

  • 创建一个定义我的域模型的XML模式。 这将是JAXB创建Java域模型的输入
  • 创建代表该模型的三个大型XML文件,分别具有10,000 / 100,000 / 1,000,000元素
  • 有一个纯JAXB客户端,它将完全在内存中解组大型XML文件
  • 有一个STax / JAXB客户端,它将SAX技术的低内存消耗与JAXB提供的简便编程模型结合在一起
  • 拥有一个具有与STax / JAXB客户端相同特征的Woodstox / JAXB客户端(简而言之,我只是想更改基础解析器,看看是否可以获得任何性能提升)
  • 记录内存消耗和处理速度(例如,每个解决方案以多快的速度使XML块作为JAXB域模型类在内存中可用)
  • 因为我们知道,一张图片可以说一千个单词,所以可以图形方式显示结果。

域模型XML模式

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://uk.co.jemos.integration.xml/large-file" 
xmlns:tns="http://uk.co.jemos.integration.xml/large-file" 
elementFormDefault="qualified"><complexType name="PersonType"><sequence><element name="firstName" type="string"></element><element name="lastName" type="string"></element><element name="address1" type="string"></element><element name="address2" type="string"></element><element name="postCode" type="string"></element><element name="city" type="string"></element><element name="country" type="string"></element></sequence><attribute name="active" type="boolean" use="required" /></complexType><complexType name="PersonsType"><sequence><element name="person" type="tns:PersonType"                   maxOccurs="unbounded" minOccurs="1"></element></sequence></complexType><element name="persons" type="tns:PersonsType"></element>
</schema>

我决定建立一个相对简单的域模型,用XML元素代表人物及其姓名和地址。 我还想记录一个人是否活跃。

使用JAXB创建Java模型

我是Maven的粉丝,并将其用作构建系统的默认工具。 这是我为此小基准定义的POM:

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>uk.co.jemos.tests.xml</groupId><artifactId>large-xml-parser</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><name>large-xml-parser</name><url>http://www.jemos.co.uk</url><properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.jvnet.jaxb2.maven2</groupId><artifactId>maven-jaxb2-plugin</artifactId><version>0.7.5</version><executions><execution><goals><goal>generate</goal></goals></execution></executions><configuration><schemaDirectory>${basedir}/src/main/resources</schemaDirectory><includeSchemas><includeSchema>**/*.xsd</includeSchema></includeSchemas><extension>true</extension><args><arg>-enableIntrospection</arg><arg>-XtoString</arg><arg>-Xequals</arg><arg>-XhashCode</arg></args><removeOldOutput>true</removeOldOutput><verbose>true</verbose><plugins><plugin><groupId>org.jvnet.jaxb2_commons</groupId><artifactId>jaxb2-basics</artifactId><version>0.6.1</version></plugin></plugins></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.3.1</version><configuration><archive><manifest><addClasspath>true</addClasspath><mainClass>uk.co.jemos.tests.xml.XmlPullBenchmarker</mainClass></manifest></archive></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>2.2</version><configuration><outputDirectory>${project.build.directory}/site/downloads</outputDirectory><descriptors><descriptor>src/main/assembly/project.xml</descriptor><descriptor>src/main/assembly/bin.xml</descriptor></descriptors></configuration></plugin></plugins></build><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.5</version><scope>test</scope></dependency><dependency><groupId>uk.co.jemos.podam</groupId><artifactId>podam</artifactId><version>2.3.11.RELEASE</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.0.1</version></dependency><!-- XML binding stuff --><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>2.1.3</version></dependency><dependency><groupId>org.jvnet.jaxb2_commons</groupId><artifactId>jaxb2-basics-runtime</artifactId><version>0.6.0</version></dependency><dependency><groupId>org.codehaus.woodstox</groupId><artifactId>stax2-api</artifactId><version>3.0.3</version></dependency></dependencies>
</project>

关于此pom.xml的几点注意事项。

  • 我使用Java 6,因为从版本6开始,Java包含了JAXB,DOM,SAX和STax的所有XML库。
  • 为了从XSD架构自动生成域模型类,我使用了出色的maven-jaxb2-plugin,该插件除其他外还允许获得具有toString,equals和hashcode支持的POJO。

我还声明了jar插件,以为基准创建可执行的jar,并声明程序集插件以分发基准的可执行版本。 基准测试的代码附于此后,因此,如果您要自己构建并运行它,只需解压缩项目文件,打开命令行并运行:

$ mvn全新安装程序:

此命令会将* -bin。*文件放入目标/站点/下载文件夹中。 解压缩您的首选项之一并运行基准测试(-Dcreate.xml = true将生成XML文件。如果已经拥有这些文件(例如,第一次运行之后),则不要传递它:

$ java -jar -Dcreate.xml = true large-xml-parser-1.0.0-SNAPSHOT.jar

创建测试数据

为了创建测试数据,我使用了PODAM (一种Java工具,用数据自动填充POJO和JavaBean)。 代码很简单:

JAXBContext context = JAXBContext.newInstance("xml.integration.jemos.co.uk.large_file");Marshaller marshaller = context.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");PersonsType personsType = new ObjectFactory().createPersonsType();List<PersonType> persons = personsType.getPerson();PodamFactory factory = new PodamFactoryImpl();for (int i = 0; i < nbrElements; i++) {persons.add(factory.manufacturePojo(PersonType.class));}JAXBElement<PersonsType> toWrite = new ObjectFactory().createPersons(personsType);File file = new File(fileName);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file), 4096);try {marshaller.marshal(toWrite, bos);bos.flush();} finally {IOUtils.closeQuietly(bos);}

XmlPullBenchmarker在〜/ xml-benchmark下生成三个大​​型XML文件:

  • large-person-10000.xml(大约3M)
  • large-person-100000.xml(大约30M)
  • large-person-1000000.xml(大约300M)

每个文件如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons xmlns="http://uk.co.jemos.integration.xml/large-file"><person active="false"><firstName>Ult6yn0D7L</firstName><lastName>U8DJoUTlK2</lastName><address1>DxwlpOw6X3</address1><address2>O4GGvxIMo7</address2><postCode>Io7Kuz0xmz</postCode><city>lMIY1uqKXs</city><country>ZhTukbtwti</country></person><person active="false"><firstName>gBc7KeX9Tn</firstName><lastName>kxmWNLPREp</lastName><address1>9BIBS1m5GR</address1><address2>hmtqpXjcpW</address2><postCode>bHpF1rRldM</postCode><city>YDJJillYrw</city><country>xgsTDJcfjc</country></person>[..etc]
</persons>

每个文件包含10,000 / 100,000 / 1,000,000 <person>元素。

运行环境

我在三种不同的环境下尝试了基准测试程序:

  • Ubuntu 10,64位作为 Windows 7 Ultimate上的虚拟机运行 ,具有CPU i5、750 @ 2.67GHz和2.66GHz,8GB RAM,其中4GB专用于VM。 JVM:1.6.0_25,热点
  • Windows 7 Ultimate ,用于托管上述VM,因此具有相同的处理器。 JVM,1.6.0_24,热点
  • Ubuntu 10、32 ,3GB RAM,双核。 JVM,1.6.0_24,OpenJDK

XML解组

为了解组代码,我使用了三种不同的策略:

  • 纯JAXB
  • STAX + JAXB
  • 伍德斯托克斯+ JAXB

纯JAXB解组

我过去使用JAXB解组大型XML文件的代码如下:

private void readLargeFileWithJaxb(File file, int nbrRecords) throws Exception {JAXBContext ucontext = JAXBContext.newInstance("xml.integration.jemos.co.uk.large_file");Unmarshaller unmarshaller = ucontext.createUnmarshaller();BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));long start = System.currentTimeMillis();long memstart = Runtime.getRuntime().freeMemory();long memend = 0L;try {JAXBElement<PersonsType> root = (JAXBElement<PersonsType>) unmarshaller.unmarshal(bis);root.getValue().getPerson().size();memend = Runtime.getRuntime().freeMemory();long end = System.currentTimeMillis();LOG.info("JAXB (" + nbrRecords + "): - Total Memory used: " + (memstart - memend));LOG.info("JAXB (" + nbrRecords + "): Time taken in ms: " + (end - start));} finally {IOUtils.closeQuietly(bis);}
}

该代码使用单线解组每个XML文件:

JAXBElement<PersonsType> root = (JAXBElement<PersonsType>) unmarshaller.unmarshal(bis);

我还访问了基础PersonType集合的大小以“接触”内存数据。 顺便说一句,调试该应用程序显示,在这行代码之后,内存中确实确实有所有10,000个元素可用。

JAXB + STax

使用STax,我只需要使用XMLStreamReader,遍历所有<person>元素,然后依次将每个元素传递给JAXB,以将其解组为PersonType域模型对象。 代码如下:

// set up a StAX reader
XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader xmlr = xmlif.createXMLStreamReader(new FileReader(file));
JAXBContext ucontext = JAXBContext.newInstance(PersonType.class);
Unmarshaller unmarshaller = ucontext.createUnmarshaller();
long start = System.currentTimeMillis();
long memstart = Runtime.getRuntime().freeMemory();
long memend = 0L;try {xmlr.nextTag();xmlr.require(XMLStreamConstants.START_ELEMENT, null, "persons");xmlr.nextTag();while (xmlr.getEventType() == XMLStreamConstants.START_ELEMENT) {JAXBElement<PersonType> pt = unmarshaller.unmarshal(xmlr,PersonType.class);if (xmlr.getEventType() == XMLStreamConstants.CHARACTERS) {xmlr.next();}}memend = Runtime.getRuntime().freeMemory();long end = System.currentTimeMillis();LOG.info("STax - (" + nbrRecords + "): - Total memory used: " + (memstart - memend));LOG.info("STax - (" + nbrRecords + "): Time taken in ms: " + (end - start));} finally {xmlr.close();}
}

请注意,这次创建上下文时,我必须指定它用于PersonType对象,并且在调用JAXB解组时,我还必须传递所需的返回类类型,并带有:

JAXBElement<PersonType> pt = unmarshaller.unmarshal(xmlr, PersonType.class);

请注意,我对对象不做任何事情,只是创建它,以通过不引入任何不必要的步骤来使基准保持真实和可能。

JAXB + Woodstox

对于Woodstox,此方法与用于STax的方法非常相似。 实际上,Woodstox提供了与STax2兼容的API,所以我要做的就是提供正确的工厂,然后……砰! 我让伍德斯托克斯在掩护下工作。

private void readLargeXmlWithFasterStax(File file, int nbrRecords)throws FactoryConfigurationError, XMLStreamException,FileNotFoundException, JAXBException {// set up a Woodstox readerXMLInputFactory xmlif = XMLInputFactory2.newInstance();XMLStreamReader xmlr = xmlif.createXMLStreamReader(new FileReader(file));JAXBContext ucontext = JAXBContext.newInstance(PersonType.class);Unmarshaller unmarshaller = ucontext.createUnmarshaller();long start = System.currentTimeMillis();long memstart = Runtime.getRuntime().freeMemory();long memend = 0L;try {xmlr.nextTag();xmlr.require(XMLStreamConstants.START_ELEMENT, null, "persons");xmlr.nextTag();while (xmlr.getEventType() == XMLStreamConstants.START_ELEMENT) {JAXBElement<PersonType> pt = unmarshaller.unmarshal(xmlr,PersonType.class);if (xmlr.getEventType() == XMLStreamConstants.CHARACTERS) {xmlr.next();}}memend = Runtime.getRuntime().freeMemory();long end = System.currentTimeMillis();LOG.info("Woodstox - (" + nbrRecords + "): Total memory used: " + (memstart - memend));LOG.info("Woodstox - (" + nbrRecords + "): Time taken in ms: " + (end - start));} finally {xmlr.close();}
}

请注意以下行:

XMLInputFactory xmlif = XMLInputFactory2.newInstance();

我在哪里传递STax2 XMLInputFactory。 这使用Woodstox实现。

主循环

一旦文件就位(通过传递-Dcreate.xml = true获得此文件),主程序将执行以下操作:

System.gc();
System.gc();for (int i = 0; i < 10; i++) {main.readLargeFileWithJaxb(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-10000.xml"), 10000);main.readLargeFileWithJaxb(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-100000.xml"), 100000);main.readLargeFileWithJaxb(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-1000000.xml"), 1000000);main.readLargeXmlWithStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-10000.xml"), 10000);main.readLargeXmlWithStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-100000.xml"), 100000);main.readLargeXmlWithStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-1000000.xml"), 1000000);main.readLargeXmlWithFasterStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-10000.xml"), 10000);main.readLargeXmlWithFasterStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-100000.xml"), 100000);main.readLargeXmlWithFasterStax(new File(OUTPUT_FOLDER + File.separatorChar + "large-person-1000000.xml"), 1000000);
}

它邀请GC运行,尽管我们知道这是由GC线程决定的。 然后,它将每个策略执行10次,以标准化 RAM和CPU消耗。 然后,通过十次运行的平均值来收集最终数据。

内存消耗的基准测试结果

下面是一些图表,这些图表显示了在解组10,000 / 100,000 / 1,000,000文件时不同运行环境下的内存消耗。

您可能会注意到,与STax相关的策略的内存消耗通常显示为负值。 这意味着在解组所有元素之后比在解组循环开始时有更多的空闲内存。 反过来,这表明GC使用STax运行的次数比使用JAXB运行的次数多得多。 如果有人考虑,这是合乎逻辑的。 由于使用STax时,我们不会将所有对象都保留在内存中,因此有更多对象可用于垃圾回收。 在这种特殊情况下,我认为在while循环中创建的PersonType对象符合GC的条件,并进入年轻一代区域,然后由GC对其进行回收。 但是,这应该对性能产生最小的影响,因为我们知道从年轻一代空间中声明对象非常有效。

10,000个XML元素的摘要

100,000个XML元素的摘要

1,000,000个XML元素的摘要

处理速度的基准结果

10,000个元素的结果

100,000个元素的结果

1,000,000个元素的结果

结论

在所有三种不同环境下的结果,尽管有所不同,但都告诉我们相同的故事:

  • 如果您正在寻找性能(例如XML解组速度),请选择JAXB
  • 如果您正在寻找内存不足的使用(并准备牺牲一些性能速度),请使用STax。

我个人的看法是,我不会选择Woodstox,但是我会选择JAXB(如果我需要处理能力并且能够负担得起RAM)或STax(如果我不需要最高速度并且基础设施资源不足) )。 这些技术都是Java标准,并且是从Java 6开始的JDK的一部分。

资源基准测试器源代码

  • 邮编版本: 下载Large-xml-parser-1.0.0-SNAPSHOT-project
  • tar.gz版本: 下载Large-xml-parser-1.0.0-SNAPSHOT-project.tar
  • tar.bz2版本: 下载Large-xml-parser-1.0.0-SNAPSHOT-project.tar

标杆可执行文件:

  • 邮编版本: 下载Large-xml-parser-1.0.0-SNAPSHOT-bin
  • tar.gz版本: 下载Large-xml-parser-1.0.0-SNAPSHOT-bin.tar
  • tar.bz2版本: 下载Large-xml-parser-1.0.0-SNAPSHOT-bin.tar

数据文件:

  • Ubuntu 64位VM运行环境: 下载Stax-vs-jaxb-ubuntu-64-vm
  • Ubuntu 32位运行环境: 下载Stax-vs-jaxb-ubuntu-32位
  • Windows 7 Ultimate运行环境: 下载Stax-vs-jaxb-windows7

参考: Java中的XML编组基准: Marco Tedone博客博客中的JCG合作伙伴 Marco Tedone的JAXB vs STax vs Woodstox 。


翻译自: https://www.javacodegeeks.com/2012/05/xml-unmarshalling-benchmark-jaxb-vs.html

stax 和jaxb 关系

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

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

相关文章

48道C语言上机题参考答案,二级C语言上机题库参考答案(已修改).doc

二级C语言上机题库参考答案(已修改).doc下载提示(请认真阅读)1.请仔细阅读文档&#xff0c;确保文档完整性&#xff0c;对于不预览、不比对内容而直接下载带来的问题本站不予受理。2.下载的文档&#xff0c;不会出现我们的网址水印。3、该文档所得收入(下载内容预览)归上传者、…

(原创)SpringBoot入门

本文章是SpringBoot入门的介绍在这里 我会尽量写一些细节性的东西,我用的是IDEA2016 Tomcat7 JDK1.8 Maven3.3.9 IDEA Tomcat JDK Maven的安装我就不详细了, 这里我会提到Maven的安装和如何使用阿里云的镜像,因为官网的JAR下载真的是...比乌龟还慢 先从Maven的配置开始,到官…

电脑基础c语言,C语言经验: 如何从零基础学习C语言?

C语言是面向过程的&#xff0c;而C 是面向对象的C和C 之间的区别:C是一种结构化语言&#xff0c;其重点是算法和数据结构. 在C程序设计中&#xff0c;首先要考虑的是如何通过过程来处理输入(或环境条件)以获得输出(或实现过程(事务)控制).C &#xff0c;首先要考虑的是如何构建…

java cpu_Java High CPU故障排除指南–第1部分

java cpu本文是该系列的第1部分&#xff0c;它将为您提供有关如何进行故障排除和识别Java高CPU问题根本原因的综合指南。 本指南也适用于独立的Java程序&#xff0c;但旨在帮助涉及Java EE企业日常生产支持的个人。 它还将包括最常见的高级CPU问题列表以及高级解决方案。 生产…

android:ellipsize=end 不起作用,android:ellipsize=end 失效或者 相关的Bug

其实这文章有点傻逼。相关的问题TextView android:ellipsize“end”超出一个字符时不显示…的解决http://www.pocketdigi.com/20140122/1261.html上面我到没有遇到过。但是我遇到的更神奇。就是在使用android:ellipsize“end”正常的情况下这个属性。该textView的文本就不能加入…

适用于具有Couchbase和WildFly的多容器和多主机应用程序的Docker Machine,Swarm和Compose...

该博客将说明如何使用Docker创建部署在多个主机上的多容器应用程序。 这将使用Docker Machine&#xff0c;Swarm和Compose实现。 是的&#xff0c;所有这三个工具一起使此博客更加有趣&#xff01; 该图说明了关键组件&#xff1a; Docker Machine用于配置多个Docker主机 …

一键复制android代码,兼容安卓和ios实现一键复制内容到剪切板

js兼容安卓和ios实现粘贴板一键复制color: #000;background: #fff;overflow-y: scroll;-webkit-text-size-adjust: 100%;-ms-text-size-adjust: 100%;}html*{outline:0;-webkit-text-size-adjust: none;-webkit-tap-highlight-color: transparent}*{margin:0;padding:0}.conten…

adf时间作用域_ADF:在任务流终结器中支持bean作用域

adf时间作用域介绍 当我们需要在任务流消失之前做一些最终工作&#xff08;干净的资源&#xff0c;紧密的连接等&#xff09;时&#xff0c;这是使用任务流终结器的非常普遍的建议做法。 和往常一样&#xff0c;我们使用在任务流中声明的托管bean。 托管Bean可以具有不同的范围…

Drools:fireAllRules,fireUntilHalt和Timers内部代码清理的详细说明

在六月&#xff0c;我们在博客上发布了一个新的内部状态机&#xff0c;用于管理用户&#xff0c;计时器和引擎线程之间的交互。 现在&#xff0c;我们对该代码进行了另一次大的内部清理&#xff0c;以使其更易于阅读和理解。 如前所述&#xff0c;所有操作&#xff08;插入&am…

nodejs+vue+ElementUi房屋房产销售预约看房系统bqv00

完成房产销售系统&#xff0c;对房源的信息、用户信息及各种资料进行收集和科学的管理&#xff0c;该系统的功能基本可以满足当前市面上的小型房产企业对于房产销售的基本要求&#xff0c;收集各个地区的房源信息并进行分类管理&#xff0c;用户通过注册账号登录网站查询房源信…

ios framework 找不到.h_找不到好看的壁纸?上万张「高清壁纸」,都在iOS捷径里...

所需工具&#xff1a;iOS捷径获取方法&#xff1a;后台私信回复「363」不和大家废话&#xff0c;今天给大家分享一个超好用的ios壁纸捷径&#xff0c;用了它之后再也不怕找不到喜欢的壁纸了~将克拉壁纸的捷径链接在Safari浏览器打开&#xff0c;就会自动跳转到一个获取捷径的窗…

div内容用html语言写,html – 使用DIV作为另一个元素的背景

这里我用2个div做了一个例子&#xff1a;> .content,包含前端所需的一切> .background – 包含文本,图像和背景中的所有其他内容要将一个div包装在另一个div上(制作叠加层),你必须将它们放入相同的元素中,在本例中它是#wrapper div.放置位置&#xff1a;包装的相对宽度/高…

jetty 配置jndi_使用Jetty设置JNDI(嵌入式)

jetty 配置jndi我在开发工作区上运行嵌入式Jetty&#xff0c;从而节省了一些恶性的编译和部署周期。 我与Jetty的合作不多&#xff0c;易用性使我着迷于它。 我需要设置JNDI才能检索与数据库相关的活动的连接池。 尽管某些地方有完整的文档&#xff0c;但大多数都是分散的。 因…

auot lisp 选择集处理_离散量的计算机处理63_1Cv6

计算机语言运用--数值计算6-离散量的计算机处理63_1Cv6计算机&#xff1a;电子线路组成的计算机器。人与计算机则是通过计算机语言-符号系统说给计算机听而交流。计算机语言有低级语言-机器语言、汇编、高级语言-C/C/C#/VB/PASCAL/LISP/JAVA/PYTHON/……成百上千种之多。作为一…

linkedblockingqueue 后 take 不消化_消化不良的成因及护理

疾病名称&#xff1a;消化不良就诊科室&#xff1a;消化内科疾病成因心理和精神的不良应激&#xff1a;患者的精神不愉快、长期闷闷不乐或突然受到猛烈的刺激等均可引起。不良饮食习惯&#xff1a;包括刺激性食物&#xff08;咖啡、浓茶、甜食、油腻、生冷等&#xff09;和不良…

Yandex.Algorithm 2011 Round 2 D. Powerful array 莫队

题目链接&#xff1a;点击传送D. Powerful arraytime limit per test5 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputAn array of positive integers a1, a2, ..., an is given. Let us consider its arbitrary subarray al, al  …

html 形状div,div+css实现各种形状(精心整理)

1.正方形.div {width: 100px;height: 100px;background: red;}2.矩形.div {width: 200px;height: 100px;background: red;}3.圆形.div {width: 100px;height: 100px;background: red;-moz-border-radius: 50px;-webkit-border-radius: 50px;border-radius: 50px;}4.椭圆.div {w…

4.1.5事件

用事件有一种监听的思想 一个事件对应一个委托 事件是委托类型 一个事件对应一个委托&#xff0c;委托可以对应多个方法 如气球爆炸了 气球的反应 小孩的反应 事件源有代码自动激发事件 扔出事件 —————————————— 3.只能在类的内部触发事件 4.可以在内部…

485不用双绞线可以吗_现在在上海,挡风玻璃可以一个标志都不用贴吗?

问近日&#xff0c;有市民咨询&#xff1a;现在在上海&#xff0c;车上挡风玻璃可以一个标志都不用贴吗&#xff1f;答可以一个标志都不贴。自2020年3月1日起&#xff0c;本市机动车在本市办理注册、变更、转移登记和核发检验标志、补换检验标志业务时&#xff0c;将自动生成检…

2021上饶市高考中考成绩查询,2021年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口...

2018年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口2018年上饶高考结束了&#xff0c;可是上饶中考又来了!6月注定是一个不平淡的月份。又一大批孩子朝着青春出发踏着坚定的脚步&#xff0c;行走在如火的六月。宁静的清晨&#xff0c;静谧的夜&#xff0c;那条反反复复走…