ความแตกต่างระหว่าง servlet และบริการเว็บ


89

2 ตัวนี้ต่างกันอย่างไร? ฉันพบผลลัพธ์บางอย่างใน Google โดยไม่มีข้อสรุป

คำถามติดตามผลมีดังนี้

สมมติว่าฉันสร้างแอปเว็บสปริง mvc ใส่คำอธิบายประกอบสองชั้นด้วยคำอธิบายประกอบ @Controller และสร้างสิ่งที่จะถ่ายโอนข้อมูลบางส่วนจากส่วนหน้า -> ส่วนหลังและในทางกลับกันได้สำเร็จและบางทีฐานข้อมูลบางส่วนอาจเกี่ยวข้องกับด้านหลัง

คุณจะเรียกมันว่าอะไร? พักบริการเว็บหรือ servlet หรืออย่างอื่น?


6
คำแนะนำ: หากคุณไม่ทราบว่า servlet คืออะไรคุณมีแนวโน้มที่จะต่อสู้กับ spring mvc (พร้อมคำอธิบายประกอบ) วิธีแก้ปัญหาที่ง่ายกว่า (vanilla servlet + jdbc) อาจช่วยให้คุณเรียนรู้พื้นฐานได้เร็วขึ้น
biziclop

1
หาก servlet มีพฤติกรรมที่มีความหมายเพียงอย่างเดียวและ servlet นั้นถูกแมปกับ URL ที่ชัดเจนฉันไม่เห็นเหตุผลว่าทำไม (1) พารามิเตอร์ GET หรือ POST ไม่สามารถส่งไปยัง Servlet (2) การตอบสนองของ Servlet อาจเป็นการส่งคืนภาระ XML พร้อมชุดประเภท MIME ที่เหมาะสม (3) ซึ่งไม่เหมือนกับ Web Service ในความหมายทางวิชาการ?
8bitjunkie

@GandalfStormCrow ด้วย servlet ข้อมูลจริงที่กำลังส่งผ่านไม่ใช่ข้อมูล แต่เป็นเอกสาร html เอกสาร html เหมาะสมกว่าสำหรับการร้องขอเช่น 1) รับเอกสาร 2) แสดงเอกสารจากมนุษย์สู่คอมพิวเตอร์ แต่ความต้องการคือการสื่อสารแอพ - แอพในรูปแบบอิสระของเครื่อง ดังนั้นบริการบนเว็บจึงพูดถึงการถ่ายโอนข้อมูลโดยใช้ xml ผ่าน http
เปลี่ยนแปลงมากเกินไป

คำตอบ:


91

บริการเว็บเป็นบริการที่มีวิธีการบริการให้กับลูกค้าของตนโดยใช้กระบวนทัศน์การเขียนโปรแกรม REST หรือโปรโตคอล SOAP สำหรับการสื่อสาร มีหลายวิธีในการใช้บริการเว็บ วิธีที่ง่ายที่สุดในการเขียนเว็บเซอร์วิสคือการเขียนคลาสและใส่คำอธิบายประกอบด้วย@WebServiceและ@WebMethodคำอธิบายประกอบจากjavax.jwsนั้นจึงเปิดใช้งานจาก a main-method ด้วย:

Endpoint.publish("http://localhost:8089/myservice", new MyWebService());

ผลลัพธ์ก็คือคุณสามารถดูWSDL ได้ที่ URL ที่ลงทะเบียนและหากคุณมี SoapUI หรือไคลเอนต์ SOAP อื่น ๆ คุณสามารถทดสอบและใช้บริการเว็บของคุณได้

เซิร์ฟเล็ตบนมืออื่น ๆ ที่ใช้ในการขนส่งHTTPร้องขอและการตอบสนอง สามารถใช้ในการเขียนเว็บแอปพลิเคชันด้วย JSPs และ HTML หรือเพื่อตอบสนอง XML และ JSON (เช่นเดียวกับบริการ RESTful) และแน่นอนว่ายังรับและส่งคืนข้อความ SOAP คุณสามารถคิดว่ามันเป็นชั้นหนึ่งดังต่อไปนี้บริการเว็บ Servlets มีมาตรฐานของตนเองซึ่งปัจจุบันคือJava Servlet Specification Version 4.0

แนวทางที่ครอบคลุมและเป็นประโยชน์มากขึ้นคือการเขียนเว็บเซอร์วิสด้วยเฟรมเวิร์กและเผยแพร่บนแอพพลิเคชั่นเซิร์ฟเวอร์หรือคอนเทนเนอร์ servlet เช่น Tomcat หรือ JBoss ในกรณีนี้คุณจะใช้ Servlet เพื่อจัดการการส่งคำขอ HTTP ที่ส่งข้อความ SOAP หรือ REST ของคุณ

ในการเขียนเว็บเซอร์วิสด้วยเทคโนโลยี servlet คุณสามารถใช้ JAX-WS (เช่น SOAP) ได้ ในการเขียนบริการ RESTful คุณสามารถใช้ JAX-RS (โดยใช้การอ้างอิงเป็นJersey ) หรืออีกทางหนึ่งคือคุณสามารถใช้Spring WebMVCแต่เท่าที่ฉันรู้ว่านั่นไม่ใช่จุดประสงค์หลักของกรอบนี้และ Jersey ก็เป็นอย่างมาก ใช้งานง่ายขึ้น

เกี่ยวกับคำถามที่สอง: @Controllerคำอธิบายประกอบเป็นคำอธิบายประกอบแบบตายตัวเฉพาะของSpringที่บอก Spring เกี่ยวกับสิ่งที่ถั่วของคุณควรทำ สิ่งที่วิธีการของคอนโทรลเลอร์จะส่งคืนนั้นขึ้นอยู่กับการใช้งานจริงของวิธีการของคุณคุณสามารถกำหนดค่า Spring เพื่อส่งคืนข้อความธรรมดา HTML, JSON, XML, ข้อมูลไบนารีหรือสิ่งที่คุณต้องการ

หมายเหตุด้านข้างคลาสที่ใส่คำอธิบายประกอบ@Controllerยังไม่ได้เป็น servlet แต่เป็นเพียงถั่ว วิธีที่คุณใช้ servlets ขึ้นอยู่กับ Framework ที่คุณใช้เป็นหลัก ตัวอย่างเช่นเมื่อคุณใช้ Spring งาน servlet จะทำโดย Springs DispatcherServletซึ่งจะส่งต่อคำขอไปยังถั่วที่ถูกต้อง หากคุณใช้ Tomcat คุณสามารถเขียน servlets ของคุณเองได้โดยตรงเพียงแค่แบ่งคลาสย่อยjavax.servlet.http.HttpServletและเขียนทับเมธอดที่จำเป็นเช่นdoGetที่ตอบสนองคำขอ HTTP GET จากเบราว์เซอร์ของคุณ


3
"REST หรือ SOAP เป็นโปรโตคอล" ... แต่ REST ไม่ใช่โปรโตคอล !!
ไม่ใช่ข้อผิดพลาด

3
พูดอย่างชัดเจนว่าไม่ใช่มันเป็นกระบวนทัศน์การเขียนโปรแกรม ฉันได้แก้ไขสูตรของฉันเพื่อให้สอดคล้องกับสิ่งนั้นแล้ว
lanoxx

@lanoxx เป้าหมายของบริการบนเว็บคือการช่วยรวมแอปพลิเคชันขององค์กรหนึ่งเข้ากับแอปพลิเคชันอื่น ๆ ได้อย่างง่ายดายโดยสมมติว่าแอปพลิเคชันเหล่านั้นเพิ่งใหม่จำเป็นต้องพูดคุยกัน รวมโปรแกรมเอ็นเตอร์ไพรส์
เปลี่ยนแปลงมากเกินไป

ลิงก์ Java Servlet ด้านบน (ตอนนี้ 4.0) ตายแล้วตอนนี้สามารถพบได้ในโฮมเพจ / github ใหม่ที่javaee.github.io/servlet-spec/DOWNLOADS.html
Manohar Reddy Poreddy

43

สิ่งที่คุณกำลังอธิบายคือเว็บแอปพลิเคชันที่มนุษย์ใช้เบราว์เซอร์เพื่อโต้ตอบกับระบบซอฟต์แวร์

บริการเว็บเป็นวิธีการที่ระบบซอฟต์แวร์ในการสื่อสารกับแต่ละอื่น ๆ โดยใช้ HTTP และ XML หรือ JSON โดยไม่มีมนุษย์ใด ๆ ที่เกี่ยวข้อง

เซิร์ฟเล็ตเป็นวิธี Java เฉพาะของการเขียนซอฟแวร์ที่ตอบสนองต่อการร้องขอ HTTP Spring MVC สรุปรายละเอียดการใช้งานจำนวนมากเพื่อให้การเขียนเว็บแอปพลิเคชันง่ายขึ้น แต่ใช้ servlets ใต้ฝาครอบ


นอกจากนี้ยังสามารถใช้รูปแบบการเขียนโปรแกรมบนเว็บสำหรับระบบซอฟต์แวร์เพื่อสื่อสารกันได้ แต่ฉันคิดว่ามันไม่ใช่วิธีการเขียนโปรแกรมที่มีโครงสร้างและไม่ใช่มาตรฐานที่ใช้ในอุตสาหกรรมไอที
Mohamed Iqzas

10

สิ่งที่ฉันทำคือ Web Service กำหนดสิ่งที่เป็นนามธรรมในระดับที่สูงขึ้นเช่นฟังก์ชันเฉพาะทางธุรกิจบางอย่าง ในขณะที่ Servlet เป็นเพียงส่วนประกอบการใช้งานซอฟต์แวร์ที่รับผิดชอบในการขนส่งข้อมูล

โดยทั่วไปการใช้งาน Web Service จะอาศัย servlet ในการรับข้อมูล อย่างไรก็ตามสามารถใช้เลเยอร์ที่กำหนดเองในการจัดการกับข้อมูลโปรโตคอลได้เช่นกัน

@Controller อาจเกี่ยวข้องกับ Web Service มากกว่า servlet ซึ่งเป็นอีกวิธีหนึ่งในการใช้งานการขนส่ง


1
@Controllerเป็นส่วนหนึ่งของเฟรมเวิร์ก Spring Web MVC (เป็น C) ดังนั้นจึงไม่ใช่สิ่งที่ให้บริการเว็บอย่างแน่นอน แต่ก็ไม่เกี่ยวข้องอย่างใกล้ชิดกับ servlets
biziclop

ฉันเห็นด้วย @Controller ไม่ได้เป็นบริการเว็บด้วยตัวเอง แต่โดยส่วนตัวแล้วฉันมักจะใช้ @Controller เป็นจุดสิ้นสุดสำหรับบริการ REST ฉันสงสัยว่ามันเป็นการใช้งาน Spring MVC ที่ไม่ค่อยได้รับความนิยม
Alex Gitelman

3

ความแตกต่างที่ชัดเจนที่สุดระหว่าง Servlet และ Web Service คือคุณเข้าถึง servlet ผ่าน HTTP ในขณะที่เข้าถึง Web Service ผ่าน SOAP (Simple Object Access Protocol) แต่ในความเป็นจริงคุณไม่สามารถเรียกใช้ servlet ได้โดยตรงคุณสามารถเปิดการเชื่อมต่อ URL และใส่พารามิเตอร์บางตัวให้กับ servlet หากผู้เรียกไม่อยู่ในแอปพลิเคชันของคุณ และคุณไม่สามารถ จำกัด พารามิเตอร์ที่ผู้โทรสามารถใส่ได้ ผู้เรียกไม่ทราบว่า servlet ของคุณสามารถรับพารามิเตอร์ใดได้บ้าง ดังนั้นคุณควรใช้บริการเว็บเพื่อให้ API กับแอปพลิเคชันอื่น ๆ ดีกว่าไฟล์ WSDL ของบริการบนเว็บของคุณสามารถให้ข้อมูลเพียงพอแก่ผู้โทรเพื่อเรียกใช้บริการเว็บของคุณ


2

servlet คือตัวจัดการแบบสอบถาม HTTP คุณสามารถทำสิ่งที่คุณต้องการได้ด้วยคำถามที่เข้ามา servlet ทำงานบน JVM

บริการเว็บเชื่อมโยงกับโปรโตคอลที่เข้มงวดมากขึ้นหรือน้อยลง: อินเทอร์เฟซ (API) ถูกกำหนดด้วยวิธีการที่พร้อมใช้งานและอาร์กิวเมนต์และค่าส่งคืนสำหรับบริการ

อินเทอร์เฟซนี้ถูกเปิดเผยโดยใช้กลไกโปรโตคอล โปรโตคอลเหล่านี้ไม่เชื่อเรื่องพระเจ้าเกี่ยวกับโฮสต์ที่จะเรียกใช้บริการ: คุณสามารถกำหนดบริการเว็บเดียวกันโดยใช้ PHP, Java, C # หรือภาษาของคุณเอง คุณต้องมีโค้ดเพียงชิ้นเดียวที่สามารถเข้าใจการสืบค้นสำหรับโปรโตคอลและสามารถสร้างคำตอบที่ลูกค้าอ่านได้

ตัวอย่างเช่นSOAPเป็นโปรโตคอลบริการเว็บ: คำจำกัดความของ Wikipedia:

SOAP เดิมกำหนดเป็น Simple Object Access Protocol เป็นข้อกำหนดของโปรโตคอลสำหรับการแลกเปลี่ยนข้อมูลที่มีโครงสร้างในการนำ Web Services ไปใช้ในเครือข่ายคอมพิวเตอร์


2

บริการบนเว็บทำงานในระดับที่สูงกว่า servlets Servlets เป็น API ที่เรียบง่ายและมีความสามารถในการเขียนส่วนประกอบฝั่งเซิร์ฟเวอร์

ตัวอย่างเช่น RESTfull เป็นบริการบนเว็บที่มี "ฟังก์ชัน" อื่น ๆ อีกมากมายพร้อมด้วย ในการปรับใช้เราอาจกำหนด web.xml เป็น -

<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>jersey.rest.test</param-value>
</init-param>
<load-on-startup>1</load-on-startup>

ซึ่งไม่ใช่ แต่เป็น servlet


2

Web Service ใช้คลาส ServletContainer ซึ่งเป็นคลาส Servlet อีกครั้งซึ่งจัดการกับคำร้องขอด้วยวิธีที่สะอาดและมีโครงสร้าง REST ย่อมาจาก REpresentational STateless Protocol ที่นี่คำขอจะไม่จัดเก็บข้อมูลใด ๆ

REST Web Service สนับสนุนวิธี HTTP

  1. รับ - โดยปกติจะดึงข้อมูล
  2. POST - เพื่อแทรกวัตถุใหม่
  3. PUT - เพื่ออัปเดตวัตถุที่มีอยู่
  4. DELETE - เพื่อลบวัตถุ

เราสามารถแมป URL จำนวนเท่าใดก็ได้กับคลาส Web Service ซึ่งสามารถมีเมธอด HTTP ประเภทใดก็ได้

ในทางกลับกันการแมป URL สามารถทำได้เพียง 1 รายการสำหรับแต่ละ servlet แม้ว่าความต้องการขั้นสุดท้ายสามารถทำได้ด้วยความช่วยเหลือของเงื่อนไขพารามิเตอร์การร้องขอ แต่การใช้ servlet ในปัจจุบันไม่สามารถให้วิธีที่สะอาดได้

ในบริการเว็บเราสามารถกำหนดเส้นทาง URL ที่ระดับชั้นเช่นเดียวกับระดับวิธีการซึ่งช่วยให้เราเขียนโค้ดได้อย่างมีแบบแผนมากขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.