CXF
CXF ถูกนำไปใช้บนพื้นฐานของ XFIRE
1) ก่อนอื่นมันยังคงเป็นปัญหาของแพ็คเกจ คุณสามารถดาวน์โหลด CXF เวอร์ชันล่าสุดได้ที่ http://cxf.apache.org/download.html แน่นอนฉันใช้เวอร์ชันล่าสุด ถัดไปเป็นเรื่องไร้สาระสร้างโครงการเว็บและวางไว้ในแพ็คเกจ Jar เราไม่ได้เลือกแพ็คเกจ Jar ใส่ไว้ทั้งหมด
เราจะเห็นว่ามันมีแพ็คเกจขวดของฤดูใบไม้ผลิ เมื่อเราต้องการปรับใช้ CXF เป็นโครงการเว็บเราจำเป็นต้องใช้ไฟล์การกำหนดค่าสปริงซึ่งจะกล่าวถึงในภายหลัง
หรือคลาสอินเตอร์เฟสและคลาสการใช้งาน:
@webservice อินเตอร์เฟสสาธารณะ ireaderservice {public reader getReader (@webparam (name = "name") ชื่อสตริง,@webparam (name = "รหัสผ่าน") รหัสผ่านสตริง); รายการสาธารณะ <Rester> GetReaders (); } @webservice (EndpointInterface = "com.cxf.servlet.ireaderservice", serviceName = "ReaderService") คลาสสาธารณะ Readerservice ใช้ iReaderservice {Public Reader GetReader (@WebParam (ชื่อ = "ชื่อ") ชื่อสตริง@webparam } รายการสาธารณะ <reader> getReaders () {list <reader> readerList = new ArrayList <Aderer> (); readerlist.add (ผู้อ่านใหม่ ("shun1", "123")); readerlist.add (ผู้อ่านใหม่ ("shun2", "123")); ส่งคืนผู้อ่าน; - ยกเว้นการเพิ่มคำอธิบายประกอบทั้งสองคลาสนี้จะเหมือนกับที่กล่าวถึงเมื่อวานนี้ ฉันจะไม่พูดถึงที่นี่ สำหรับคำอธิบายของคำอธิบายประกอบคุณสามารถดูเอกสาร Javaee ได้ แต่ควรเข้าใจง่ายตามความหมาย
ถัดไปคือ Javabean หรือคลาสผู้อ่าน:
ผู้อ่านระดับสาธารณะ {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 1L; ชื่อสตริงส่วนตัว; รหัสผ่านสตริงส่วนตัว Public Reader () {} Public Reader (ชื่อสตริง, รหัสผ่านสตริง) {this.name = name; this.password = รหัสผ่าน; } // get/set วิธีการละเว้นสตริงสาธารณะ toString () {return "ชื่อ:"+name+", รหัสผ่าน:"+รหัสผ่าน; - ข้างต้นได้รับการเขียน
2) เราต้องการใช้เป็นโครงการเว็บหรือไม่? ไม่ต้องกังวลอย่าใช้ตอนนี้ CXF มาพร้อมกับบริการคอนเทนเนอร์ที่มีน้ำหนักเบาซึ่งเทียบเท่ากับสปริงตัวเองให้บริการคอนเทนเนอร์ IOC เราสามารถใช้มันเพื่อทดสอบว่าการปรับใช้ของเราสำเร็จหรือไม่
มาเรียนชั้นเรียนกันเถอะ:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println ("เซิร์ฟเวอร์กำลังเริ่มต้น ... "); ReadERService ReadERService = ใหม่ ReadERService (); Endpoint.publish ("http: // localhost: 8080/readerservice", Readerservice); System.out.println ("เซิร์ฟเวอร์เริ่มต้น ... "); - ง่ายมาก. ไม่เป็นไรที่จะเผยแพร่ที่อยู่โดยตรงจากนั้นระบุอินเทอร์เฟซหรือคลาส ฉันใช้คลาสที่นี่ แต่ลองใช้อินเทอร์เฟซ ท้ายที่สุดแล้วการเขียนโปรแกรมเชิงอินเตอร์เฟสเป็นแนวคิดเชิงวัตถุจริง
เริ่มเห็นผลลัพธ์:
เราเห็นว่าการเริ่มต้นเสร็จสมบูรณ์แล้วเริ่มเบราว์เซอร์เพื่อดูว่าประสบความสำเร็จหรือไม่
ป้อน http: // localhost: 8080/readerservice? wsdl ในเบราว์เซอร์เราสามารถดู:
มันสร้างไฟล์ WSDL ที่เราต้องการโดยระบุว่าเราได้ปรับใช้สำเร็จแล้ว
3) หลังจากการปรับใช้สำเร็จเราจะเรียกมันว่า การโทรของมันก็ค่อนข้างง่าย มันคล้ายกับ xfire คุณสามารถรับอินเทอร์เฟซแล้วเรียกวิธีการเช่นคลาสท้องถิ่น
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {jaxwsproxyfactorybean startorybean = ใหม่ jaxwsproxyfactorybean (); FactoryBean.SetServiceClass (iReaderservice.class); FactoryBean.setAddress ("http: // localhost: 8080/readerservice"); iReaderservice readerservice = (ireaderservice) FactoryBean.create (); reader reader = readerservice.getReader ("Shun", "123"); System.out.println ("Reader:"+Reader); - มันง่ายมากที่นี่ คุณสามารถรับคลาสโรงงานจากนั้นตั้งค่าอินเทอร์เฟซและที่อยู่โดยตรงและสร้างเพื่อรับอินเทอร์เฟซที่เกี่ยวข้อง เช่นเดียวกับ XFIRE คุณต้องกำหนดต้นแบบอินเตอร์เฟสก่อนมิฉะนั้นการโทรเหล่านี้จะไม่มีวิธีเริ่มต้น
เราวิ่งเพื่อรับผลลัพธ์:
ไม่มีปัญหามันสอดคล้องกับผลลัพธ์ที่เราคาดหวัง
4) แต่ในหลายกรณีเราไม่ต้องการให้เว็บเซิร์ฟเวอร์และแอปพลิเคชันของเราแยกเซิร์ฟเวอร์สองเซิร์ฟเวอร์ แต่ต้องการให้พวกเขาอยู่ในคอนเทนเนอร์เดียวกัน Tomcat หรือ JBoss หรืออื่น ๆ ดังนั้นเราต้องปรับใช้เว็บเซอร์ที่เราทำก่อนหน้านี้ผ่านเว็บ
โปรดทราบว่าเราจำเป็นต้องใช้ไฟล์นิยามสปริงที่นี่
ก่อนอื่นที่ web.xml:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <web-app xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://java.sun.com/xml xmlns: web = "http://java.sun.com/xml/ns/javaee" xmlns: web = "http://java.sun.com/xml/ns/javaee/web-app_2_5_5.xsd" XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id = "webapp_id" เวอร์ชัน = "3.0"> <param-value> web-inf/beans.xml </param-value> </context-param> <listener> <sistener-lass> org.springframework.web.context.contextloaderlistener </listener-class> </listener> <servlet> <servlet-class> org.apache.cxf.transport.servlet.cxfservlet </servlet-class> </servlet> <servlet-mapping> <servlet-name> cxfservlet </servlet-name> <url-pattern>/webservice/*
มันง่ายมากที่นี่เพียงแค่ระบุสปริงฟังและเส้นทางไฟล์การกำหนดค่าที่สอดคล้องกันและระบุวิธีการสกัดกั้น CXF
จากนั้นลองดูที่ beans.xml:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: jaxws = "http://cxf.apache.org/jaxws" xsi: schemalocation = "http://www.springframework.org/schema/beans http://ww.springframework http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd "> <import Resource =" classpath: meta-inf/cxf/cxf.xml "/> <ournation resource =" classpath: meta-inf/cxf/cxf/cxf Resource = "classpath: meta-inf/cxf/cxf-extension-soap.xml"/> <import Resource = "classpath: meta-inf/cxf/cxf-servlet.xml"/> <jaxws: endpoint id = "readerservicce2
มันง่ายมากที่นี่เพียงแค่กำหนดเว็บเซอร์ผ่าน Jaxws: Endpoint ผู้ดำเนินการเป็นคลาสการประมวลผลของเว็บเซอร์และที่อยู่คือเส้นทางการเข้าถึงคล้ายกับ ReadERService ที่เราเขียนไว้ก่อนหน้านี้
ในเวลานี้เราสามารถปรับใช้กับ Tomcat และสามารถเข้าถึงได้โดยตรงผ่าน http: // localhost: 8080/cxfwebservice/webservice/readerservice2? WSDL
เพื่อนบางคนจะถามว่าทำไม URL ที่คุณเยี่ยมชมครั้งนี้แตกต่างจากคนก่อนหน้า ในความเป็นจริงที่อยู่การเข้าถึงก่อนหน้านี้ถูกกำหนดโดยตัวเราเองและที่อยู่เว็บเซิร์ฟเวอร์ที่นี่ได้รับการกำหนดค่าในไฟล์การกำหนดค่าและถูกปรับใช้ผ่านโครงการเว็บ ชื่อโครงการเป็นสิ่งจำเป็นที่นี่และเรากำหนดค่ารูปแบบ URL เป็นเว็บเซอร์วิสใน CXFServlet ดังนั้น URL สุดท้ายจึงเหมือนกับด้านบน
เราสามารถเห็นผลกระทบ:
สิ่งนี้พิสูจน์ได้ว่าการปรับใช้ของเราประสบความสำเร็จ
คุณสามารถใช้คลาสทดสอบก่อนหน้าเพื่อทดสอบอีกครั้ง โปรดทราบว่าคุณต้องแก้ไขที่อยู่ไปยัง URL ที่เราโพสต์
CXF มีความกระชับมากกว่า XFIRE เล็กน้อย แม้ว่ามันจะเพิ่มคำอธิบายประกอบบางอย่าง แต่สิ่งเหล่านี้ไร้เดียงสา มันเพียงแค่มุ่งเน้นข้อมูลใน services.xml ก่อนหน้าในชั้นเรียนซึ่งสะดวกกว่าในการบำรุงรักษา อย่างไรก็ตามนี่ยังคงเป็นเรื่องของความเห็น บางคนชอบไฟล์การกำหนดค่าในขณะที่คนอื่นไม่ได้ นอกจากนี้วิธีการโทรของ CXF นั้นกระชับมากกว่าและมีปริมาณรหัสที่น้อยกว่า XFIRE ซึ่งเป็นการปรับปรุงที่สำคัญ
เพื่อนบางคนมีปัญหาบางอย่างในระหว่างกระบวนการก่อสร้างดังนั้นพวกเขาจึงได้รับการยกเว้นจากการตอบกลับทีละคน รหัสถูกวางจำหน่ายที่นี่ เพื่อนที่ต้องการสามารถดาวน์โหลดได้
แพ็คเกจทั้งหมดในไดเรกทอรี LIB ไม่ได้ใส่เพียงใส่แพ็คเกจทั้งหมดใน CXF
หมายเหตุ: IDE ที่ใช้เป็นแนวคิดและโครงสร้างไฟล์ไม่ได้เป็นเรื่องธรรมดาสำหรับ Eclipse หากคุณต้องการใช้ภายใต้ Eclipse คุณสามารถคัดลอกรหัสและไฟล์โดยตรงไปยังโครงการที่สร้างขึ้นใหม่ใน Eclipse
เสื้อ
ลองมาดูการใช้งานขั้นพื้นฐาน
มาดูโครงการกันเถอะ ก่อนที่จะเริ่มโครงการคุณควรดาวน์โหลดแพ็คเกจด้วยตัวเอง: https://maven.java.net/content/repositories/releases/com/sun/jersey/to เรียกใช้ตัวอย่างคุณต้องดาวน์โหลดทั้งเซิร์ฟเวอร์และไคลเอนต์ แน่นอนว่าฉันไม่ต้องการค้นหามากมายดังนั้นฉันจึงสามารถดาวน์โหลดแพ็คเกจซิปนี้ได้โดยตรง https://maven.java.net/service/local/artifact/maven/redirect?r=releases&g=com.sun.jersey&a=jersey-archive&v=1.10&e=zip
1) แค่ทำ javabean
@XMLROOTELEMENT ผู้อ่านคลาสสาธารณะใช้ serializable {ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = 1L; ชื่อสตริงส่วนตัว; รหัสผ่านสตริงส่วนตัว Public Reader () {} Public Reader (ชื่อสตริง, รหัสผ่านสตริง) {this.name = name; this.password = รหัสผ่าน; } // ละเว้นวิธีการรับ/ตั้งค่าสตริงสาธารณะ toString () {return "ชื่อ:"+ชื่อ+", รหัสผ่าน:"+รหัสผ่าน; - แท็กถูกใช้ที่นี่ซึ่งแสดงถึงประเภทเมื่อมันกลับมานั่นคือคลาสผู้อ่านนี้สามารถใช้สำหรับการส่งคืน XML
2) หากคุณต้องการใช้คลาสบริการคุณไม่จำเป็นต้องอินเทอร์เฟซเช่น CXF และ XFIRE ในอดีตอีกต่อไป เพียงแค่ใช้คลาสโดยตรง
@Path ("/readerService/{ชื่อ}/{รหัสผ่าน}") คลาสสาธารณะ readerservice {@get @produces (mediaType.application_json) ผู้อ่านสาธารณะ GetReader (@PathParam ("ชื่อ") ชื่อสตริง @pathparam ("รหัสผ่าน") } โมฆะคงที่สาธารณะหลัก (String [] args) พ่น unledalargumentexception, ioexception, urisyntaxexception {httpserver server = httpserverfactory.create ("http: // localhost: 8080/"); Server.start (); - ในเวลานี้มีการใช้แท็กหลายแท็ก Path เชื่อว่าเพื่อนที่ใช้ SpringMVC ควรรู้วิธีการเขียนนี้ซึ่งเป็นการจับคู่ URL หากคุณไม่ชัดเจนคุณสามารถไปดูก่อน แท็ก GET บ่งชี้ว่าวิธีนี้สามารถเข้าถึงได้ผ่านวิธี GET เท่านั้นในขณะที่การผลิตระบุผลลัพธ์ที่สร้างขึ้นซึ่งหมายความว่าระบบจะแนบวัตถุเครื่องอ่านไว้ในผลลัพธ์ JSON และส่งคืน
ไม่สำคัญว่าคุณจะไม่เข้าใจคุณสามารถเข้าใจได้หลังจากผ่านไประยะหนึ่ง
และในเวลานี้มีวิธีการหลักฉันเชื่อว่ามีคำถามใหญ่ นี่คือภาชนะภายในที่มีน้ำหนักเบาโดยเจอร์ซีย์ มันสามารถใช้ชั่วคราวเพื่อให้เราทำการดีบัก แต่ก็เป็นไปไม่ได้ที่จะใช้สิ่งนี้ในการใช้งานจริง
3) มาเขียนคลาสทดสอบกันเถอะ
Public Class ReaderClient {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {ไคลเอนต์ไคลเอนต์ = client.create (); Webresource Resource = client.resource ("http: // localhost: 8080/readerservice/shun/123213"); reader reader = resource.get (reader.class); System.out.println (ผู้อ่าน); - รหัสง่ายมากคุณควรเข้าใจ วัตถุไคลเอนต์ร้องขอเว็บเซิร์ฟเวอร์ส่งคืนทรัพยากรจากนั้นทรัพยากรเรียกใช้วิธีการที่เกี่ยวข้องโดยตรง แน่นอนวิธีนี้จับคู่ผ่าน URL ของเรา
ที่นี่เราจะทดสอบด้วยบริการที่มีน้ำหนักเบาที่มาพร้อมกับมันก่อน เรียกใช้ Readerservice โดยตรงซึ่งมีวิธีการหลัก หลังจากทำงานแล้วเราเรียกใช้ ReaderClient และเราจะเห็นว่าผลลัพธ์คือ:
ผลลัพธ์ถูกต้อง
แน่นอนว่าเราไม่ต้องการใช้บริการน้ำหนักเบาที่มาพร้อมกับมันเป็นเซิร์ฟเวอร์ของเรา เราจำเป็นต้องวางไว้บนเซิร์ฟเวอร์เดียวกันกับโครงการของเราเช่น Tomcat, JBoss ฯลฯ
4) แน่นอน web.xml เป็นสิ่งที่ขาดไม่ได้สำหรับโครงการเว็บ
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <web-app xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://java.sun.com/xml xmlns: web = "http://java.sun.com/xml/ns/javaee" xmlns: web = "http://java.sun.com/xml/ns/javaee/web-app_2_5_5.xsd" XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id = "webapp_id" เวอร์ชัน = "3.0"> <servlet-class> com.sun.jersey.spi.container.servlet.servletContainer </servlet-class> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name> <welcome-file-list> <welcome-file> index.jsp </welcome-file> </selcome-file-list> </eb-app>
ในเวลานี้เส้นทางที่เหลือทั้งหมดที่ระบุจะถูกสกัดกั้นโดยเจอร์ซีย์
เราปรับใช้กับ Tomcat และเริ่มต้นจากนั้นเรียกใช้ ReaderClient อีกครั้ง โปรดทราบว่าเราจำเป็นต้องแก้ไขเส้นทางทรัพยากรก่อน:
Webresource Resource = client.resource ("http: // localhost: 8080/jerseywebservice/rest/readerservice/shun/123213"); ชื่อโครงการของฉันคือ jerseywebservice โปรดแก้ไขตามชื่อโครงการของคุณ
หลังจากการแก้ไขเราเรียกใช้อีกครั้งและผลลัพธ์มีดังนี้:
สอดคล้องกับผลลัพธ์ข้างต้นหมายความว่าเอฟเฟกต์การปรับใช้นั้นเหมือนกันและถูกต้องเช่นกัน