Java WebService技術(shù)詳解
WebService
WebService簡介
Web Service技術(shù), 能使得運(yùn)行在不同機(jī)器上的不同應(yīng)用無須借助附加的、專門的第三方軟件或硬件, 就可相互交換數(shù)據(jù)或集成。依據(jù)Web Service規(guī)范實施的應(yīng)用之間, 無論它們所使用的語言、 平臺或內(nèi)部協(xié)議是什么, 都可以相互交換數(shù)據(jù)。
簡單的說,WebService就是一種跨編程語言和跨操作系統(tǒng)平臺的遠(yuǎn)程調(diào)用技術(shù)。所謂跨編程語言和跨操作平臺,就是說服務(wù)端程序采用java編寫,客戶端程序則可以采用其他編程語言編寫,反之亦然。跨操作系統(tǒng)平臺則是指服務(wù)端程序和客戶端程序可以在不同的操作系統(tǒng)上運(yùn)行。 遠(yuǎn)程調(diào)用,就是一臺計算機(jī)的應(yīng)用可以調(diào)用其他計算機(jī)上的應(yīng)用。例如:支付寶,支付寶并沒有銀行卡等數(shù)據(jù),它只是去調(diào)用銀行提供的接口來獲得數(shù)據(jù)。還有天氣預(yù)報等,也是氣象局把自己的系統(tǒng)服務(wù)以webservice服務(wù)的形式暴露出來,讓第三方網(wǎng)站和程序可以調(diào)用這些服務(wù)功能。
WebService原理
XML,SOAP和WSDL就是構(gòu)成WebService平臺的三大技術(shù) 。
- WebService采用Http協(xié)議來在客戶端和服務(wù)端之間傳輸數(shù)據(jù)。WebService使用XML來封裝數(shù)據(jù),XML主要的優(yōu)點在于它是跨平臺的。
- WebService通過HTTP協(xié)議發(fā)送請求和接收結(jié)果時,發(fā)送的請求內(nèi)容和結(jié)果內(nèi)容都采用XML格式封裝,并增加了一些特定的HTTP消息頭,以說明HTTP消息的內(nèi)容格式,這些特定的HTTP消息頭和XML內(nèi)容格式就是SOAP協(xié)議規(guī)定的。
- WebService服務(wù)器端首先要通過一個WSDL文件來說明自己有什么服務(wù)可以對外調(diào)用。簡單的說,WSDL就像是一個說明書,用于描述WebService及其方法、參數(shù)和返回值。 WSDL文件保存在Web服務(wù)器上,通過一個url地址就可以訪問到它??蛻舳艘{(diào)用一個WebService服務(wù)之前,要知道該服務(wù)的WSDL文件的地址。WebService服務(wù)提供商可以通過兩種方式來暴露它的WSDL文件地址:1.注冊到UDDI服務(wù)器,以便被人查找;2.直接告訴給客戶端調(diào)用者。
WebService交互的過程就是,WebService遵循SOAP協(xié)議通過XML封裝數(shù)據(jù),然后由Http協(xié)議來傳輸數(shù)據(jù)。
JAVA WebService規(guī)范
Java 中共有三種WebService 規(guī)范,分別是JAXM&SAAJ、JAX-WS(JAX-RPC)、JAX-RS。
(1)JAX-WS:
JAX-WS(Java API For XML-WebService)。早期的基于SOAP 的JAVA 的Web 服務(wù)規(guī)范JAX-RPC(java API For XML-Remote Procedure Call)目前已經(jīng)被JAX-WS 規(guī)范取代,JAX-WS 是JAX-RPC 的演進(jìn)版本,但JAX-WS 并不完全向后兼容JAX-RPC,二者最大的區(qū)別就是RPC/encoded 樣式的WSDL,JAX-WS 已經(jīng)不提供這種支持。JAX-RPC 的API 從JAVA EE5 開始已經(jīng)移除,如果你使用J2EE1.4,其API 位于javax.xml.rpc.包。JAX-WS(JSR 224)規(guī)范的API 位于javax.xml.ws.包,其中大部分都是注解,提供API 操作Web 服務(wù)(通常在客戶端使用的較多,由于客戶端可以借助SDK 生成,因此這個包中的API 我們較少會直接使用)。
(2)JAXM&SAAJ:
JAXM(JAVA API For XML Message)主要定義了包含了發(fā)送和接收消息所需的API,相當(dāng)于Web 服務(wù)的服務(wù)器端,其API 位于javax.messaging.*包,它是Java EE 的可選包,因此你需要單獨下載。
SAAJ(SOAP With Attachment API For Java,JSR 67)是與JAXM 搭配使用的API,為構(gòu)建SOAP 包和解析SOAP 包提供了重要的支持,支持附件傳輸,它在服務(wù)器端、客戶端都需要使用。這里還要提到的是SAAJ 規(guī)范,其API 位于javax.xml.soap.*包。
JAXM&SAAJ 與JAX-WS 都是基于SOAP 的Web 服務(wù),相比之下JAXM&SAAJ 暴漏了SOAP更多的底層細(xì)節(jié),編碼比較麻煩,而JAX-WS 更加抽象,隱藏了更多的細(xì)節(jié),更加面向?qū)ο?,實現(xiàn)起來你基本上不需要關(guān)心SOAP 的任何細(xì)節(jié)。那么如果你想控制SOAP 消息的更多細(xì)節(jié),可以使用JAXM&SAAJ。
(3)JAX-RS:
JAX-RS 是JAVA 針對REST(Representation State Transfer)風(fēng)格制定的一套Web 服務(wù)規(guī)范,由于推出的較晚,該規(guī)范(JSR 311,目前JAX-RS 的版本為1.0)并未隨JDK1.6 一起發(fā)行。
WebService入門案例
服務(wù)端的實現(xiàn)
我們來實現(xiàn)一個天氣系統(tǒng)的案例,客戶端發(fā)送城市名稱,服務(wù)器端回應(yīng)相應(yīng)的天氣。
1. 編寫SEI(Service Endpoint Interface),SEI在webservice中稱為portType,在java中就是普通接口 public interface WeatherInterface { public String queryWeather(String cityName); }
2. 編寫SEI實現(xiàn)類,此類作為webservice提供服務(wù)類 @WebService //@WebService表示該類是一個服務(wù)類,需要發(fā)布其中的public的方法 public class WeatherInterfaceImpl implements WeatherInterface { @Override public String queryWeather(String cityName) { System.out.println("獲取城市名"+cityName); String weather="暴雨"; return weather; } }
3. 第三步:發(fā)布服務(wù),Endpoint類發(fā)布服務(wù),publish方法,兩個參數(shù):1.服務(wù)地址;2.服務(wù)實現(xiàn)類 public class WeatherServer { public static void main(String[] args) { Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl()); } }
4. 測試服務(wù)是否發(fā)布成功,通過閱讀wsdl,確定客戶端調(diào)用的接口、方法、參數(shù)和返回值存在,證明服務(wù)發(fā)布成功 //我們在瀏覽器輸入 http://127.0.0.1:12345/weather?wsdl 來獲取wsdl文件進(jìn)行閱讀 //wsdl,是以XML文件形式來描述WebService的”說明書”,有了說明書,我們才可以知道如何使用或是調(diào)用這個服務(wù). //現(xiàn)在我們還不知道怎么去閱讀,后面我們會詳解,只要能獲取到,就能確定WebService服務(wù)發(fā)布成功
客戶端的實現(xiàn)
//客戶端調(diào)用服務(wù)有很多種方法,我們先用工具生成客戶端代碼,后面會詳解 //wsimport是jdk自帶的webservice客戶端工具,可以根據(jù)wsdl文檔生成客戶端調(diào)用代碼(java代碼).當(dāng)然,無論服務(wù)器端的WebService是用什么語言寫的,都可以生成調(diào)用webservice的客戶端代碼。 1.創(chuàng)建一個客戶端空項目,cmd命令行進(jìn)入此項目的src目錄 使用以下命令生成客戶端代碼 wsimport -s . http://127.0.0.1:12345/weather?wsdl -s是指編譯出源代碼文件,后面的.(點)指將代碼放到當(dāng)前目錄下. 最后面的http….是指獲取wsdl說明書的地址
2.編寫客戶端 public class WeatherClient { public static void main(String[] args) { //創(chuàng)建服務(wù)視圖,視圖是從wsdl文件的service標(biāo)簽的name屬性獲取 WeatherInterfaceImplService weatherInterfaceImplService=new WeatherInterfaceImplService(); //獲取服務(wù)實現(xiàn)類,實現(xiàn)類從wsdl文件的portType的name屬性獲取 WeatherInterfaceImpl weatherInterfaceImpl=weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class); //獲取查詢方法,從portType的operation標(biāo)簽獲取 String weather=weatherInterfaceImpl.queryWeather("北京"); System.out.println(weather); } }
至此,我們的客戶端就可以獲取遠(yuǎn)程服務(wù)端的數(shù)據(jù),接下來我們來詳解一下各個部分。
WSDL
WSDL(Web Services Description Language), web服務(wù)描述語言,他是webservice服務(wù)端使用說明書,說明服務(wù)端接口、方法、參數(shù)和返回值,WSDL是隨服務(wù)發(fā)布成功,自動生成,無需編寫。
文檔結(jié)構(gòu)
- Service:相關(guān)端口的集合,包括其關(guān)聯(lián)的接口、操作、消息等。
- Binding:特定端口類型的具體協(xié)議和數(shù)據(jù)格式規(guī)范
- portType: 服務(wù)端點,描述 web service可被執(zhí)行的操作方法,以及相關(guān)的消息,通過binding指向portType
- message: 定義一個操作(方法)的數(shù)據(jù)參數(shù)
- types: 定義 web service 使用的全部數(shù)據(jù)類型
閱讀方式
WSDL文檔應(yīng)該從下往上閱讀。
- 1.先看service標(biāo)簽,看相應(yīng)port的binding屬性,然后通過值查找上面的binding標(biāo)簽。
- 2.通過binding標(biāo)簽可以獲得具體協(xié)議等信息,然后查看binding的type屬性
- 3.通過binding的type屬性,查找對應(yīng)的portType,可以獲得可操作的方法和參數(shù)、返回值等。
- 4.通過portType下的operation標(biāo)簽的message屬性,可以向上查找message獲取具體的數(shù)據(jù)參數(shù)信息。
SOAP
SOAP即簡單對象訪問協(xié)議,他是使用http發(fā)送的XML格式的數(shù)據(jù),它可以跨平臺,跨防火墻,SOAP不是webservice的專有協(xié)議。
SOAP=http+xml
SOAP結(jié)構(gòu)
- 必需的 Envelope 元素,可把此 XML 文檔標(biāo)識為一條 SOAP 消息
- 可選的 Header 元素,包含頭部信息
- 必需的 Body 元素,包含所有的調(diào)用和響應(yīng)信息
- 可選的 Fault 元素,提供有關(guān)在處理此消息所發(fā)生錯誤的信息
我們來看一下我們上面天氣程序發(fā)送的數(shù)據(jù)的格式,這需要一個工具TCP/IP Monitor ,Eclipse自帶的Debug工具之一,用于捕獲Http、TCP/IP協(xié)議包。原理是一個代理服務(wù),客戶端先把數(shù)據(jù)發(fā)送到代理服務(wù),然后代理服務(wù)再把數(shù)據(jù)發(fā)送到服務(wù)器,這樣就能獲取請求數(shù)據(jù)和響應(yīng)數(shù)據(jù)。
第一步:打開這個工具,選擇other,然后輸入TCP/IP Monitor
第二步:設(shè)置要代理的服務(wù)器
第三步:詳細(xì)設(shè)置
- 第一個參數(shù)是代理服務(wù)器端口,我們設(shè)置為54321
- 第二個參數(shù)是被代理服務(wù)器的地址
- 第三個參數(shù)是被代理服務(wù)器的端口
- 第四個參數(shù)要選擇為TCP/IP
第四步:檢測是否設(shè)置成功,我們訪問代理服務(wù)器來獲得wsdl文件
第五步:設(shè)置成功后,我們需要改一下客戶端要連接的服務(wù)器,改成代理服務(wù)器的端口
將WeatherInterfaceImplService里的所有原來地址的端口改為54321
第六步:我們啟動我們的客戶端,獲取請求數(shù)據(jù)和響應(yīng)數(shù)據(jù)
請求 //先發(fā)送get請求,去獲得wsdl文件,然后獲得方法、參數(shù)等信息 GET /weather?wsdl HTTP/1.1 User-Agent: Java/1.8.0_111 Host: 127.0.0.1:54321 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive //發(fā)送數(shù)據(jù) POST /weather HTTP/1.1 Accept: text/xml, multipart/related Content-Type: text/xml; charset=utf-8 SOAPAction: "http://ws.cad.com/WeatherInterfaceImpl/queryWeatherRequest" User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e Host: 127.0.0.1:54321 Connection: keep-alive Content-Length: 203 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:queryWeather xmlns:ns2="http://ws.cad.com/"> <arg0>北京</arg0> </ns2:queryWeather> </S:Body> </S:Envelope>
響應(yīng)數(shù)據(jù) HTTP/1.1 200 OK Date: Tue, 25 Jul 2017 05:05:58 GMT Transfer-encoding: chunked Content-type: text/xml;charset=utf-8 //響應(yīng)wsdl內(nèi)容,來獲得方法、參數(shù)等信息 899 <?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --><!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.cad.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.cad.com/" name="WeatherInterfaceImplService"> <types> <xsd:schema> <xsd:import namespace="http://ws.cad.com/" schemaLocation="http://127.0.0.1:54321/weather?xsd=1"></xsd:import> </xsd:schema> </types> <message name="queryWeather"> <part name="parameters" element="tns:queryWeather"></part> </message> <message name="queryWeatherResponse"> <part name="parameters" element="tns:queryWeatherResponse"></part> </message> <portType name="WeatherInterfaceImpl"> <operation name="queryWeather"> <input wsam:Action="http://ws.cad.com/WeatherInterfaceImpl/queryWeatherRequest" message="tns:queryWeather"></input> <output wsam:Action="http://ws.cad.com/WeatherInterfaceImpl/queryWeatherResponse" message="tns:queryWeatherResponse"></output> </operation> </portType> <binding name="WeatherInterfaceImplPortBinding" type="tns:WeatherInterfaceImpl"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding> <operation name="queryWeather"> <soap:operation soapAction=""></soap:operation> <input> <soap:body use="literal"></soap:body> </input> <output> <soap:body use="literal"></soap:body> </output> </operation> </binding> <service name="WeatherInterfaceImplService"> <port name="WeatherInterfaceImplPort" binding="tns:WeatherInterfaceImplPortBinding"> <soap:address location="http://127.0.0.1:54321/weather"></soap:address> </port> </service> </definitions> 0 //響應(yīng)數(shù)據(jù) HTTP/1.1 200 OK Date: Tue, 25 Jul 2017 05:05:59 GMT Transfer-encoding: chunked Content-type: text/xml; charset=utf-8 df <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:queryWeatherResponse xmlns:ns2="http://ws.cad.com/"> <return>暴雨</return> </ns2:queryWeatherResponse> </S:Body> </S:Envelope> 0
UDDI
UDDI 是一種目錄服務(wù),企業(yè)可以使用它對 Web services 進(jìn)行注冊和搜索。
如果我們要使用一種服務(wù),但是不知道地址(wsdl等),我們就可以在UDDI中查找。
大部分情況下,我們都是知道服務(wù)地址的。
Webservice的客戶端調(diào)用方式
一:生成客戶端調(diào)用方式
wsimport是jdk自帶的webservice客戶端工具,可以根據(jù)wsdl文檔生成客戶端調(diào)用代碼(java代碼). wsimport.exe位于JAVA_HOME\bin目錄下 常用參數(shù)為: -d<目錄> - 將生成.class文件。默認(rèn)參數(shù)。 -s<目錄> - 將生成.java文件。 -p<生成的新包名> -將生成的類,放于指定的包下
調(diào)用公網(wǎng)的手機(jī)歸屬地查詢服務(wù)
公網(wǎng)服務(wù)地址 (里面提供了很多免費(fèi)調(diào)用的服務(wù))
http://www.webxml.com.cn/zh_cn/index.aspx
第一步:wsimport生成客戶端代碼 wsimport -p cn.cad.mobile -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl 會出現(xiàn)一些警告,是因為服務(wù)端提供的一些方法是SOAP1.2標(biāo)準(zhǔn)的,這個工具沒有實現(xiàn)SOAP1.2標(biāo)準(zhǔn)的生成方式。
第二步:查看wsdl文件,獲取我們需要的信息
第三步:根據(jù)獲取到的服務(wù)名等信息來創(chuàng)建我們的客戶端 public class MobileClient { public static void main(String[] args) { //創(chuàng)建服務(wù)視圖 MobileCodeWS mobileCodeWS=new MobileCodeWS(); //獲取服務(wù)實現(xiàn)類 MobileCodeWSSoap mobileCodeWSSoap= mobileCodeWS.getPort(MobileCodeWSSoap.class); //調(diào)用查詢方法 String message=mobileCodeWSSoap.getMobileCodeInfo("xxxxxxxx", null); System.out.println(message); } }
第四步:獲取到信息
還有天氣等服務(wù),自己可以去實現(xiàn)一下。
該種方式使用簡單,但一些關(guān)鍵的元素在代碼生成時寫死在生成代碼中,不方便維護(hù),所以僅用于測試。
二:service編程調(diào)用方式
public class MobileClient2 { public static void main(String[] args) throws IOException { //創(chuàng)建WSDL文件的URL URL wsdlDocumentLocation=new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"); //創(chuàng)建服務(wù)名稱 //1.namespaceURI - 命名空間地址 //2.localPart - 服務(wù)視圖名 QName serviceName=new QName("http://WebXml.com.cn/","MobileCodeWS"); Service service=Service.create(wsdlDocumentLocation, serviceName); //獲取服務(wù)實現(xiàn)類 MobileCodeWSSoap mobileCodeWSSoap= service.getPort(MobileCodeWSSoap.class); //調(diào)用方法 String message=mobileCodeWSSoap.getMobileCodeInfo("XXXXXXX", null); System.out.println(message); } }
該種方式可以自定義命名空間,服務(wù)視圖名等元素,方便以后維護(hù),是一種標(biāo)準(zhǔn)的開發(fā)方式 。
三:HttpURLConnection調(diào)用方式
這種方式是由自己編寫客戶端,不再由工具生成,比較麻煩。
開發(fā)步驟: 第一步:創(chuàng)建服務(wù)地址 第二步:打開一個通向服務(wù)地址的連接 第三步:設(shè)置參數(shù) 第四步:組織SOAP數(shù)據(jù),發(fā)送請求 第五步:接收服務(wù)端響應(yīng)
public class MobileClient2 { public static void main(String[] args) throws IOException { //第一步:創(chuàng)建服務(wù)地址,不是WSDL地址 URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx"); //第二步:打開一個通向服務(wù)地址的連接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //第三步:設(shè)置參數(shù) //3.1發(fā)送方式設(shè)置:POST必須大寫 connection.setRequestMethod("POST"); //3.2設(shè)置數(shù)據(jù)格式:content-type connection.setRequestProperty("content-type", "text/xml;charset=UTF-8"); //3.3設(shè)置輸入輸出,因為默認(rèn)新創(chuàng)建的connection沒有讀寫權(quán)限, connection.setDoInput(true); connection.setDoOutput(true); //第四步:組織SOAP數(shù)據(jù),發(fā)送請求 String soapXML = getXML("XXXXXXX"); OutputStream os = connection.getOutputStream(); os.write(soapXML.getBytes()); //第五步:接收服務(wù)端響應(yīng),打印 int responseCode = connection.getResponseCode(); if(200 == responseCode){//表示服務(wù)端響應(yīng)成功 InputStream is = connection.getInputStream(); //將字節(jié)流轉(zhuǎn)換為字符流 InputStreamReader isr = new InputStreamReader(is,"utf-8"); //使用緩存區(qū) BufferedReader br = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String temp = null; while(null != (temp = br.readLine())){ sb.append(temp); } System.out.println(sb.toString()); is.close(); isr.close(); br.close(); } os.close(); } //組織數(shù)據(jù),將數(shù)據(jù)拼接一下 public static String getXML(String phoneNum){ String soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +"<soap:Body>" +"<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">" +"<mobileCode>"+phoneNum+"</mobileCode>" +"<userID></userID>" +"</getMobileCodeInfo>" +"</soap:Body>" +"</soap:Envelope>"; return soapXML; } }
使用注解修改WSDL內(nèi)容
作用:
通過注解,可以更加形像的描述Web服務(wù)。對自動生成的wsdl文檔進(jìn)行修改,為使用者提供一個更加清晰的wsdl文檔
WebService的注解都位于javax.jws包下: @WebService-定義服務(wù),在類上邊 targetNamespace:指定命名空間 name:portType的名稱 portName:port的名稱 serviceName:服務(wù)名稱 endpointInterface:SEI接口地址,如果一個服務(wù)類實現(xiàn)了多個接口,只需要發(fā)布一個接口的方法,可通過此注解指定要發(fā)布服務(wù)的接口。 @WebMethod-定義方法,在公開方法上邊 operationName:方法名 exclude:設(shè)置為true表示此方法不是webservice方法,反之則表示webservice方法,默認(rèn)是false @WebResult-定義返回值,在方法返回值前邊 name:返回結(jié)果值的名稱 @WebParam-定義參數(shù),在方法參數(shù)前邊 name:指定參數(shù)的名稱
//以我們前面做的天氣案例為例子 @WebService( targetNamespace="http://service.cad.com", portName="WeatherSOAPPort", serviceName="WeatherWSS", name="WeatherSOAP" ) public class WeatherInterfaceImpl implements WeatherInterface { @WebMethod( operationName="getWeather", exclude=false ) public @WebResult(name="result")String queryWeather(@WebParam(name="cityName")String cityName) { System.out.println("獲取城市名"+cityName); String weather="暴雨"; return weather; } }
然后重新發(fā)布服務(wù),我們再訪問wsdl文件,就可以看到我們改變的內(nèi)容
到此這篇關(guān)于Java WebService技術(shù)詳解的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合RestTemplate用法的實現(xiàn)
本篇主要介紹了RestTemplate中的GET,POST,PUT,DELETE、文件上傳和文件下載6大常用的功能,具有一定的參考價值,感興趣的可以了解一下2023-08-08SpringMVC編程使用Controller接口實現(xiàn)控制器實例代碼
這篇文章主要介紹了SpringMVC編程使用Controller接口實現(xiàn)控制器實例代碼,具有一定參考價值,需要的朋友可以參考下。2017-11-11詳解如何用spring Restdocs創(chuàng)建API文檔
這篇文章將帶你了解如何用spring官方推薦的restdoc去生成api文檔。具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05SpringBoot實現(xiàn)Thymeleaf驗證碼生成
本文使用SpringBoot實現(xiàn)Thymeleaf驗證碼生成,使用后臺返回驗證碼圖片,驗證碼存到session中后端實現(xiàn)校驗,前端只展示驗證碼圖片。感興趣的可以了解下2021-05-05Java數(shù)據(jù)類型分類與基本數(shù)據(jù)類型轉(zhuǎn)換
這篇文章主要介紹了Java數(shù)據(jù)類型分類與基本數(shù)據(jù)類型轉(zhuǎn)換,Java的數(shù)據(jù)類型主要分為兩類,基本數(shù)據(jù)類型、引用數(shù)據(jù)類型,下文詳細(xì)介紹,感興趣的朋友可以參考一下2022-07-07