java中常用XML解析器的使用
(JAXP、DOM4J、Jsoup、JsoupXPath等常用XML解析器的使用)
XML概述
XML(Extensible Markup Language),可擴(kuò)展標(biāo)記語(yǔ)言。XML具有標(biāo)簽自定義,語(yǔ)法嚴(yán)格,適用于存儲(chǔ)數(shù)據(jù)與傳輸數(shù)據(jù)等特點(diǎn)。
組成部分
1.文檔聲明
格式:<?xml 屬性列表 ?> 屬性列表: version:版本號(hào),必須的屬性 encoding:編碼方式。告知解析引擎當(dāng)前文檔使用的字符集,默認(rèn)值:ISO-8859-1 standalone:是否獨(dú)立 yes:不依賴(lài)其他文件 no:依賴(lài)其他文件
2.指令
用于結(jié)合css:<?xml-stylesheet type="text/css" href="xml.css" rel="external nofollow" ?>
3.標(biāo)簽
標(biāo)簽名稱(chēng)自定義,需遵循規(guī)則:
名稱(chēng)可以包含字母、數(shù)字以及其他的字符 名稱(chēng)不能以數(shù)字或者標(biāo)點(diǎn)符號(hào)開(kāi)始 名稱(chēng)不能以字母 xml(或者 XML、Xml 等等)開(kāi)始 名稱(chēng)不能包含空格
4.屬性
id屬性值唯一
5.文本
CDATA區(qū):在該區(qū)域中的數(shù)據(jù)會(huì)被原樣展示 格式: <![CDATA[ 展示數(shù)據(jù)]]>
語(yǔ)法
xml文檔的后綴名 .xml xml第一行必須定義為文檔聲明,可選部分,如果存在需要放在文檔的第一行 xml文檔中有且僅有一個(gè)根標(biāo)簽,是所有其他元素的父元素 屬性值必須使用引號(hào)(單雙都可)引起來(lái) 標(biāo)簽必須正確關(guān)閉,所有的XML元素都必須有一個(gè)關(guān)閉標(biāo)簽 xml標(biāo)簽名稱(chēng)區(qū)分大小寫(xiě)
XML示例
<?xml version="1.0" encoding="UTF-8" ?> <students> <student id='1'> <name>小白</name> <age>20</age> </student> <student id='2'> <name>大白</name> <age>30</age> </student> </students>
約束
約束是規(guī)定xml文檔的書(shū)寫(xiě)規(guī)則。約束分為:DTD(一種簡(jiǎn)單的約束技術(shù))與Schema(一種復(fù)雜的約束技術(shù))共兩類(lèi)。
DTD
students.dtd
<!ELEMENT students (student+) > <!ELEMENT student (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ATTLIST student name ID #REQUIRED>
引入方式:
內(nèi)部dtd:將約束規(guī)則定義在xml文檔中
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE students [ <!ELEMENT students (student+) > <!ELEMENT student (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ATTLIST student name ID #REQUIRED> ]> <students> <student name="xb"> <name>小白</name> <age>20</age> </student> <student name="db"> <name>大白</name> <age>30</age> </student> </students>
外部dtd:將約束的規(guī)則定義在外部的dtd文件中
本地:<!DOCTYPE 根標(biāo)簽名 SYSTEM "dtd文件的位置">
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE students SYSTEM "student.dtd"> <students> <student name="xb"> <name>小白</name> <age>20</age> </student> <student name="db"> <name>大白</name> <age>30</age> </student> </students>
網(wǎng)絡(luò):<!DOCTYPE 根標(biāo)簽名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
Schema
1.填寫(xiě)xml文檔的根元素 <?xml version="1.0" encoding="UTF-8"?> 2.引入xsi前綴 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3.引入xsd文件命名空間 xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" 4.為每一個(gè)xsd約束聲明一個(gè)前綴,作為標(biāo)識(shí) xmlns:mvc="http://www.springframework.org/schema/mvc"
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <bean></bean> <mvc:annotation-driven /> </beans>
XML的解析
解析就是操作xml文檔,將文檔中的數(shù)據(jù)讀取到內(nèi)存中,再將內(nèi)存中的數(shù)據(jù)保存到xml文檔中,持久化存儲(chǔ)。
解析方式
1. DOM:將標(biāo)記語(yǔ)言文檔一次性加載進(jìn)內(nèi)存,在內(nèi)存中形成一顆dom樹(shù)。操作方便,可以對(duì)文檔進(jìn)行CRUD的操作,但占用內(nèi)存。 2. SAX:逐行讀取,基于事件驅(qū)動(dòng)的,其優(yōu)點(diǎn)不占用內(nèi)容,但是只能讀取,不能增刪改。
常見(jiàn)解析器
1. JAXP:sun公司提供的解析器,支持dom和sax兩種思想 2. DOM4J:是一個(gè)十分優(yōu)秀的Java XML API,用來(lái)讀寫(xiě)XML文件,具有性能優(yōu)異、功能強(qiáng)大和極其易使用的特點(diǎn)。 3. Jsoup:jsoup 是一款Java的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過(guò)DOM,CSS以及類(lèi)似于jQuery的操作方法來(lái)取出和操作數(shù)據(jù)。 4. JsoupXPath:XPath即為XML路徑語(yǔ)言(XML Path Language),它是一種用來(lái)確定XML文檔中某部分位置的語(yǔ)言。
JAXP的使用
準(zhǔn)備student.xml文件
創(chuàng)建student.xml文件,用于XML解析、寫(xiě)入測(cè)試。
<?xml version="1.0" encoding="UTF-8" ?> <students> <student id='1'> <name>小白</name> <age>20</age> </student> <student id='2'> <name>大白</name> <age>30</age> </student> </students>
解析XML文檔
解析XML文檔的步驟:
使用javax.xml.parsers包下的DocumentBuilderFactory類(lèi)中的newInstance()方法獲得一個(gè)解析器工廠對(duì)象 使用解析器工廠對(duì)象的newDocumentBuilder()方法獲得一個(gè)解析器對(duì)象 用解析器對(duì)象的parse(String uri)方法解析指定XML文檔并返回一個(gè)org.w3c.dom包下的Document對(duì)象 使用Document對(duì)象的getElementsByTagName(String tagname)方法獲得指定標(biāo)簽名的NodeList列表 使用NodeList列表的item(int index)方法得到指定角標(biāo)的節(jié)點(diǎn)對(duì)象 使用Node接口中的一系列方法對(duì)其進(jìn)行操作
public static void main(String[] args) throws Exception { String path = ApplicationTests.class.getClassLoader().getResource("students.xml").getPath(); // 創(chuàng)建解析器工廠對(duì)象 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); // 創(chuàng)建解析器對(duì)象 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); // 解析指定XML文檔返回document Document document = documentBuilder.parse(new File(path)); // 獲得指定標(biāo)簽名的NodeList列表 NodeList students = document.getElementsByTagName("name"); // 得到指定角標(biāo)的節(jié)點(diǎn)對(duì)象 for (int i = 0; i < students.getLength(); i++) { Node node = students.item(i); // TODO 使用Node接口中的一系列方法對(duì)其進(jìn)行操作 System.out.println("node name = " + node.getTextContent()); } }
寫(xiě)入XML文檔
寫(xiě)入XML文檔的步驟:
創(chuàng)建sex標(biāo)簽節(jié)點(diǎn) 創(chuàng)建sex標(biāo)簽對(duì)應(yīng)文本值 對(duì)sex標(biāo)簽添加text 對(duì)某個(gè)節(jié)點(diǎn)添加sex標(biāo)簽節(jié)點(diǎn) 通過(guò)javax.xml.transform包下的TransformerFactory.newInstance()方法得到一個(gè)回寫(xiě)轉(zhuǎn)換器對(duì)象工廠 通過(guò)回寫(xiě)轉(zhuǎn)換器對(duì)象工廠的newTransformer()方法得到回寫(xiě)轉(zhuǎn)換器對(duì)象 使用回寫(xiě)轉(zhuǎn)換器對(duì)象的transform(Source xmlSource, Result outputTarget)方法將內(nèi)存中內(nèi)容回寫(xiě)入XML文檔。 Source參數(shù)通過(guò)new DOMSource(文檔對(duì)象)方法獲得 Result參數(shù)可以通過(guò)javax.xml.tramsform.stream包下的StreamResult(String URL)方法獲得
public static void main(String[] args) throws Exception { String path = ApplicationTests.class.getClassLoader().getResource("students.xml").getPath(); // 創(chuàng)建解析器工廠對(duì)象 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); // 創(chuàng)建解析器對(duì)象 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); // 解析指定XML文檔返回document Document document = documentBuilder.parse(new File(path)); //創(chuàng)建sex標(biāo)簽 Node sex = document.createElement("sex"); //創(chuàng)建文本 Text text = document.createTextNode("男"); // sex標(biāo)簽添加text sex.appendChild(text); Node node = document.getElementsByTagName("student").item(0); // student標(biāo)簽添加sex節(jié)點(diǎn) node.appendChild(sex); // 得到回寫(xiě)轉(zhuǎn)換器對(duì)象工廠 TransformerFactory transformerFactory = TransformerFactory.newInstance(); // 得到回寫(xiě)轉(zhuǎn)換器對(duì)象 Transformer transformer = transformerFactory.newTransformer(); // 將內(nèi)存中內(nèi)容回寫(xiě)入XML文檔 transformer.transform(new DOMSource(document), new StreamResult(new File(path))); }
dom4j的使用
dom4j是一個(gè)開(kāi)源的XML處理框架,集成了XPath,全面支持DOM、SAX、JAXP和Java平臺(tái)。是一個(gè)十分優(yōu)秀的Java XML API,用來(lái)讀寫(xiě)XML文件,具有性能優(yōu)異、功能強(qiáng)大和極其易使用的特點(diǎn)。
GitHub地址:https://github.com/dom4j/dom4j
Document對(duì)象獲取方式
解析XML過(guò)程是通過(guò)獲取Document對(duì)象,然后繼續(xù)獲取各個(gè)節(jié)點(diǎn)以及屬性等操作,獲取Document對(duì)象是第一步,總共有三種方式。
1.使用DocumentHelper.createDocument()創(chuàng)建Document對(duì)象
Document document = DocumentHelper.createDocument(); //其中students是根節(jié)點(diǎn),可以繼續(xù)添加其他節(jié)點(diǎn)等操作。 Element root = document.addElement("students");
2.建SAXReader對(duì)象然后轉(zhuǎn)換成Document對(duì)象
//創(chuàng)建SAXReader對(duì)象 SAXReader reader = new SAXReader(); //讀取文件 轉(zhuǎn)換成Document Document document = reader.read(new File("XXXX.xml"));
3.讀取XML文本內(nèi)容獲取Document對(duì)象
String xmlStr = "<students>......</students>"; Document document = DocumentHelper.parseText(xmlStr);
引入依賴(lài)
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version> </dependency>
解析XML文檔
public static void main(String[] args) throws Exception { String path = XmlTest.class.getClassLoader().getResource("students.xml").getPath(); //UTF-8編碼 String filePath = URLDecoder.decode(path, "UTF-8"); //xml解析器 SAXReader saxReader = new SAXReader(); Document read = saxReader.read(filePath); //拿到根節(jié)點(diǎn) Element rootElement = read.getRootElement(); //getNodes(rootElement); getALLNodes(rootElement); } static public void getNodes(Element rootElement) { System.out.println("節(jié)點(diǎn)名稱(chēng):" + rootElement.getName()); //拿到節(jié)點(diǎn)屬性 List<Attribute> attributes = rootElement.attributes(); for (Attribute attribute : attributes) { System.out.println("屬性:" + attribute.getName() + "---" + attribute.getText()); } //節(jié)點(diǎn)名稱(chēng) <name>大白</name>節(jié)點(diǎn)中的值 if (!rootElement.getTextTrim().equals("")) { System.out.println(rootElement.getName() + "---" + rootElement.getText()); } //迭代器遍歷 Iterator<Element> elementIterator = rootElement.elementIterator(); while (elementIterator.hasNext()) { //獲取當(dāng)前節(jié)點(diǎn)值 Element next = elementIterator.next(); getNodes(next); } } static public void getALLNodes(Element rootElement) { System.out.println("根節(jié)點(diǎn)名稱(chēng):" + rootElement.getName()); //根節(jié)點(diǎn)下的節(jié)點(diǎn) List<Element> elements = rootElement.elements(); for (Element element : elements) { //拿到節(jié)點(diǎn)屬性 List<Attribute> attributes = element.attributes(); for (Attribute attribute : attributes) { System.out.println("屬性:" + attribute.getName() + "---" + attribute.getText()); } //根節(jié)點(diǎn)下的節(jié)點(diǎn)的節(jié)點(diǎn) List<Element> sonElements = element.elements(); for (Element sonElement : sonElements) { //節(jié)點(diǎn)名稱(chēng) <name>大白</name>節(jié)點(diǎn)中的值 if (!sonElement.getTextTrim().equals("")) { System.out.println(sonElement.getName() + "---" + sonElement.getText()); } } } }
文檔寫(xiě)入XML
public static void main(String[] args) throws Exception { String path = ApplicationTests.class.getClassLoader().getResource("students.xml").getPath(); //UTF-8編碼 String filePath = URLDecoder.decode(path, "UTF-8"); //xml解析器 SAXReader saxReader = new SAXReader(); Document read = saxReader.read(filePath); createStudentNode(read, path); } /** * 創(chuàng)建新的student節(jié)點(diǎn) * * @param document */ public static void createStudentNode(Document document, String path) { try (Writer writer = new OutputStreamWriter(new FileOutputStream(path), "UTF-8")) { // 獲取根節(jié)點(diǎn) Element root = document.getRootElement(); // 添加根節(jié)點(diǎn)的子節(jié)點(diǎn) 新的student節(jié)點(diǎn) Element b = root.addElement("student"); // 創(chuàng)建student節(jié)點(diǎn)的各個(gè)子節(jié)點(diǎn) // 添加子節(jié)點(diǎn)的屬性 b.addAttribute("id", "3");//原有長(zhǎng)度+1 // 添加子節(jié)點(diǎn)的的子節(jié)點(diǎn)name b.addElement("name").setText("createNode"); // 添加子節(jié)點(diǎn)的子節(jié)點(diǎn)age b.addElement("age").setText("22"); // 寫(xiě)入XML document.write(writer); } catch (IOException e) { throw new RuntimeException(e); } }
Jsoup的使用
GitHub地址:https://github.com/jhy/jsoup
官網(wǎng):https://jsoup.org
jsoup 是一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過(guò)DOM,CSS以及類(lèi)似于jQuery的操作方法來(lái)取出和操作數(shù)據(jù)。
Jsoup主要功能
從一個(gè)URL,文件或字符串中解析HTML 使用DOM或CSS選擇器來(lái)查找、取出數(shù)據(jù) 可操作HTML元素、屬性、文本
引入依賴(lài)
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.13.1</version> </dependency>
核心對(duì)象
1.Jsoup
Jsoup是一個(gè)工具類(lèi),可以解析html或xml文檔,返回Document。
常用方法:
//解析xml或html字符串 public static Document parse(String html) { return Parser.parse(html, ""); } //解析xml或html文件 public static Document parse(File in, String charsetName) throws IOException { return DataUtil.load(in, charsetName, in.getAbsolutePath()); } //通過(guò)網(wǎng)絡(luò)路徑獲取指定的html或xml的文檔對(duì)象 public static Document parse(URL url, int timeoutMillis) throws IOException { Connection con = HttpConnection.connect(url); con.timeout(timeoutMillis); return con.get(); }
2.Document
Document是指文檔對(duì)象,代表內(nèi)存中的dom樹(shù)。
常用方法:
//根據(jù)id屬性值獲取唯一的element對(duì)象 public Element getElementById(String id) { Validate.notEmpty(id); Elements elements = Collector.collect(new Id(id), this); return elements.size() > 0 ? (Element)elements.get(0) : null; } //根據(jù)標(biāo)簽名稱(chēng)獲取元素對(duì)象集合 public Elements getElementsByTag(String tagName) { Validate.notEmpty(tagName); tagName = Normalizer.normalize(tagName); return Collector.collect(new org.jsoup.select.Evaluator.Tag(tagName), this); } //根據(jù)屬性名稱(chēng)獲取元素對(duì)象集合 public Elements getElementsByAttribute(String key) { Validate.notEmpty(key); key = key.trim(); return Collector.collect(new Attribute(key), this); } //根據(jù)對(duì)應(yīng)的屬性名和屬性值獲取元素對(duì)象集合 public Elements getElementsByAttributeValue(String key, String value) { return Collector.collect(new AttributeWithValue(key, value), this); }
3.Elements與Element
Element是元素對(duì)象,Elements是元素Element對(duì)象的集合,可以當(dāng)做 ArrayList<Element>使用。
常用方法:
//根據(jù)id屬性值獲取唯一的element對(duì)象 public Element getElementById(String id) { Validate.notEmpty(id); Elements elements = Collector.collect(new Id(id), this); return elements.size() > 0 ? (Element)elements.get(0) : null; } //根據(jù)class屬性值獲取elements對(duì)象集合 public Elements getElementsByClass(String className) { Validate.notEmpty(className); return Collector.collect(new Class(className), this); } //根據(jù)標(biāo)簽名稱(chēng)獲取元素對(duì)象集合 public Elements getElementsByTag(String tagName) { Validate.notEmpty(tagName); tagName = Normalizer.normalize(tagName); return Collector.collect(new org.jsoup.select.Evaluator.Tag(tagName), this); } //根據(jù)屬性名稱(chēng)獲取元素對(duì)象集合 public Elements getElementsByAttribute(String key) { Validate.notEmpty(key); key = key.trim(); return Collector.collect(new Attribute(key), this); } //根據(jù)對(duì)應(yīng)的屬性名和屬性值獲取元素對(duì)象集合 public Elements getElementsByAttributeValue(String key, String value) { return Collector.collect(new AttributeWithValue(key, value), this); } //根據(jù)屬性名稱(chēng)獲取屬性值 public String attr(String attributeKey) { Validate.notNull(attributeKey); if (!this.hasAttributes()) { return ""; } else { String val = this.attributes().getIgnoreCase(attributeKey); if (val.length() > 0) { return val; } else { return attributeKey.startsWith("abs:") ? this.absUrl(attributeKey.substring("abs:".length())) : ""; } } } //獲取文本內(nèi)容 public String text() { StringBuilder sb = new StringBuilder(); Element element; for(Iterator var2 = this.iterator(); var2.hasNext(); sb.append(element.text())) { element = (Element)var2.next(); if (sb.length() != 0) { sb.append(" "); } } return sb.toString(); } //獲取標(biāo)簽體的所有內(nèi)容(包括字標(biāo)簽的字符串內(nèi)容) public String html() { StringBuilder sb = new StringBuilder(); Element element; for(Iterator var2 = this.iterator(); var2.hasNext(); sb.append(element.html())) { element = (Element)var2.next(); if (sb.length() != 0) { sb.append("\n"); } } return sb.toString(); }
解析XML文檔
public static void main(String[] args) throws IOException { //根據(jù)xml文檔獲取,獲取Document對(duì)象 String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath(); //解析xml文檔,加載文檔進(jìn)內(nèi)存 Document document = Jsoup.parse(new File(path), "utf-8"); //獲取元素對(duì)象Element Elements elements = document.getElementsByTag("name"); //循環(huán)得到每一個(gè)element對(duì)象 for (Element element : elements) { //獲取數(shù)據(jù) String name = element.text(); System.out.println(name); } //獲取屬性名為id的元素對(duì)象們 Elements elements1 = document.getElementsByAttribute("id"); System.out.println(elements1); //獲取id屬性值為2的元素對(duì)象 Elements elements2 = document.getElementsByAttributeValue("id", "2"); System.out.println(elements2); //獲取id屬性值的元素對(duì)象 Element elements3 = document.getElementById("2"); System.out.println(elements3); //通過(guò)Element對(duì)象獲取子標(biāo)簽對(duì)象 Elements ele_name = elements3.getElementsByTag("name"); System.out.println(ele_name); //獲取student對(duì)象的屬性值 String id = elements3.attr("id"); System.out.println(id); //獲取文本內(nèi)容 String text = ele_name.text(); System.out.println(text); String html = ele_name.html(); System.out.println(html); }
JsoupXPath的使用
GitHub地址:https://github.com/zhegexiaohuozi/JsoupXpath
XPath即為XML路徑語(yǔ)言(XML Path Language),它是一種用來(lái)確定XML文檔中某部分位置的語(yǔ)言。
XPath基于XML的樹(shù)狀結(jié)構(gòu),提供在數(shù)據(jù)結(jié)構(gòu)樹(shù)中找尋節(jié)點(diǎn)的能力。
引入依賴(lài)
<!-- https://mvnrepository.com/artifact/cn.wanghaomiao/JsoupXpath --> <dependency> <groupId>cn.wanghaomiao</groupId> <artifactId>JsoupXpath</artifactId> <version>2.4.3</version> </dependency>
解析XML文檔
public static void main(String[] args) throws IOException, XpathSyntaxErrorException { //獲取student.xml的path String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath(); //獲取Document對(duì)象 Document document = Jsoup.parse(new File(path), "utf-8"); //根據(jù)document對(duì)象,創(chuàng)建JXDocument對(duì)象 JXDocument jxDocument = new JXDocument(document); //查詢(xún)所有student標(biāo)簽 List<JXNode> jxNodes = jxDocument.selN("http://student"); for (JXNode jxNode : jxNodes) { System.out.println(jxNode); } //查詢(xún)所有student標(biāo)簽下的name標(biāo)簽 List<JXNode> jxNodes2 = jxDocument.selN("http://student/name"); for (JXNode jxNode : jxNodes2) { System.out.println(jxNode); } //查詢(xún)帶有id屬性的student標(biāo)簽 List<JXNode> jxNodes3 = jxDocument.selN("http://student[@id]"); for (JXNode jxNode : jxNodes3) { System.out.println(jxNode); } //查詢(xún)帶有id屬性的student標(biāo)簽并且id屬性值為1 List<JXNode> jxNodes4 = jxDocument.selN("http://student[@id='1']"); for (JXNode jxNode : jxNodes4) { System.out.println(jxNode); } }
到此這篇關(guān)于java中常用XML解析器的使用的文章就介紹到這了,更多相關(guān)java常用XML解析器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)JDBC連接數(shù)據(jù)庫(kù)簡(jiǎn)單案例
這篇文章主要介紹了Java實(shí)現(xiàn)JDBC連接數(shù)據(jù)庫(kù)簡(jiǎn)單案例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Java實(shí)戰(zhàn)之用hutool-db實(shí)現(xiàn)多數(shù)據(jù)源配置
在微服務(wù)搭建中經(jīng)常會(huì)使用到多數(shù)據(jù)庫(kù)情形這個(gè)時(shí)候,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)戰(zhàn)之用hutool-db實(shí)現(xiàn)多數(shù)據(jù)源配置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12java實(shí)現(xiàn)求兩個(gè)字符串最長(zhǎng)公共子串的方法
這篇文章主要介紹了java實(shí)現(xiàn)求兩個(gè)字符串最長(zhǎng)公共子串的方法,是一道華為OJ上的一道題目,涉及Java針對(duì)字符串的遍歷、轉(zhuǎn)換及流程控制等技巧,需要的朋友可以參考下2015-12-12Spring Boot2發(fā)布調(diào)用REST服務(wù)實(shí)現(xiàn)方法
這篇文章主要介紹了Spring Boot2發(fā)布調(diào)用REST服務(wù)實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java FTPClient實(shí)現(xiàn)文件上傳下載
這篇文章主要為大家詳細(xì)介紹了Java FTPClient實(shí)現(xiàn)文件上傳下載的相關(guān)資料,需要的朋友可以參考下2016-04-04servlet實(shí)現(xiàn)文件上傳、預(yù)覽、下載、刪除功能
這篇文章主要為大家詳細(xì)介紹了servlet實(shí)現(xiàn)文件上傳、預(yù)覽、下載、刪除功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Java使用設(shè)計(jì)模式中的代理模式構(gòu)建項(xiàng)目的實(shí)例展示
這篇文章主要介紹了Java使用設(shè)計(jì)模式中的代理模式構(gòu)建項(xiàng)目的實(shí)例展示,代理模式中的代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用,需要的朋友可以參考下2016-05-05Spring Boot異步調(diào)用@Async過(guò)程詳解
這篇文章主要介紹了Spring Boot異步調(diào)用@Async過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Java基礎(chǔ)第二篇方法與數(shù)據(jù)成員
在上一篇文章中介紹了Java基礎(chǔ) 從HelloWorld到面向?qū)ο?,我們初步了解了?duì)象(object)。對(duì)象中的數(shù)據(jù)成員表示對(duì)象的狀態(tài)。對(duì)象可以執(zhí)行方法,表示特定的動(dòng)作。這篇文章我們進(jìn)一步深入到對(duì)象。了解Java中方法與數(shù)據(jù)成員的一些細(xì)節(jié)。2021-09-09