Servlet 2.5 และ 3 แตกต่างกันอย่างไร


92

ฉันกำลังใช้โค้ด J2EE ที่เป็นไปตาม Servlet 2.5 และฉันสงสัยว่าอะไรคือความแตกต่างที่สำคัญระหว่าง 2.5 และ 3 คำแนะนำสำหรับ Sun docs อย่างเป็นทางการและประสบการณ์ส่วนตัวเป็นที่ชื่นชอบมากที่สุด

ถ้าฉันไม่ควรจะคิดว่าตัวเองเป็น 3 ในตอนนี้ก็แค่พูดอย่างนั้น ขอบคุณ!


2
+1 รอคำตอบ :)
ATorras

คำตอบ:


150

อัปเดต

เช่นเดียวกับการอัปเดตและเพื่อให้ชัดเจนยิ่งขึ้นสิ่งเหล่านี้คือความแตกต่างที่สำคัญระหว่าง servlets 2.5 และ 3 (ฉันไม่ได้พยายามที่จะละเอียดถี่ถ้วนฉันแค่พูดถึงส่วนที่น่าสนใจที่สุด):

คำอธิบายประกอบเพื่อประกาศ servlets ตัวกรองและตัวฟัง (ความง่ายในการพัฒนา)

ใน servlets 2.5 หากต้องการประกาศ servlet ด้วยพารามิเตอร์ init หนึ่งตัวคุณต้องเพิ่มสิ่งนี้ในweb.xml :

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>my.server.side.stuff.MyAwesomeServlet</servlet-class>
    <init-param>
        <param-name>configFile</param-name>
        <param-value>config.xml</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/path/to/my/servlet</url-pattern>
</servlet-mapping>

ใน servlets 3 web.xmlเป็นทางเลือกและคุณสามารถใช้คำอธิบายประกอบแทน XML ได้ ตัวอย่างเดียวกัน:

@WebServlet(name="myServlet",
    urlPatterns={"/path/to/my/servlet"},
    initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }

สำหรับตัวกรองคุณต้องเพิ่มสิ่งนี้ในweb.xmlใน servlets 2.5:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>my.server.side.stuff.MyAwesomeServlet</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/path/to/my/filter</url-pattern>
</filter-mapping>

เทียบเท่าโดยใช้คำอธิบายประกอบใน servlets 3:

@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }

สำหรับผู้ฟัง (ในกรณีนี้คือ ServletContextListener) ใน servlets 2.5:

<listener>
    <listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>

การใช้คำอธิบายประกอบเช่นเดียวกัน:

@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }

Modularization ของ web.xml (Pluggability)

  • ใน servlets 2.5 มีไฟล์web.xmlเสาหินเพียงไฟล์เดียว
  • ใน servlets 3 แต่ละ jar "loadable" สามารถมีweb-fragment.xmlในไดเร็กทอรี META-INF ที่ระบุ servlets ตัวกรองและอื่น ๆ เพื่อให้ไลบรารีและเฟรมเวิร์กสามารถระบุ servlets ของตนเองหรืออ็อบเจ็กต์อื่น ๆ

การลงทะเบียนแบบไดนามิกของ servlets ตัวกรองและตัวฟังในเวลาเริ่มต้นบริบท (ความสามารถในการเสียบ)

ใน servlets 3 a ServletContextListenerสามารถเพิ่ม servlets ตัวกรองและตัวฟังแบบไดนามิกโดยใช้วิธีการต่อไปนี้ที่เพิ่มในSevletContext: addServlet(), addFilter()และaddListener()

การสนับสนุนแบบอะซิงโครนัส

ตัวอย่าง: สมมติว่าคอนเทนเนอร์ servlet บางตัวมีเธรด 5 เธรดในเธรดพูลและมีกระบวนการที่ใช้เวลานานในการดำเนินการต่อคำขอ (เช่นเคียวรี SQL ที่ซับซ้อน)

  • ด้วย Servlets 2.5 ภาชนะ servlet นี้จะวิ่งออกจากหัวข้อที่มีอยู่หากได้รับการร้องขอห้าในเวลาเดียวกันและหัวข้อที่มีอยู่ห้าเริ่มต้นทำกระบวนการเพราะกระทู้จะไม่กลับมาจนกว่าservice()(หรือdoGet(), doPost()ฯลฯ ) จะถูกดำเนินการตั้งแต่เริ่มต้น เพื่อสิ้นสุดและส่งคืนการตอบกลับ

  • ด้วย servlets 3.0 กระบวนการที่ใช้เวลานานนี้สามารถมอบหมายให้กับเธรดอื่นและทำให้เสร็จสิ้นservice()ก่อนที่จะส่งการตอบกลับ (การตอบกลับจะถูกส่งโดยเธรดล่าสุด) วิธีนี้ทำให้เธรดมีอิสระในการรับการตอบกลับใหม่

ตัวอย่างของการสนับสนุนแบบอะซิงโครนัส:

เซอร์เวท 2.5:

public class MyAwesomeServlet extends HttpSerlvet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        // ...

        runSlowProcess();
        // no async support, thread will be free when runSlowProcess() and
        // doGet finish

        // ...
    }

}

Servlets 3:

@WebServlet(name="myServlet",
             urlPatterns={"/mySlowProcess"},
             asyncSupported=true) // asyncSupported MUST be specified for
                                  // servlets that support asynchronous
                                  // processing
public class MyAwesomeServlet extends HttpSerlvet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {


        // an AsyncContext is created, now the response will be completed
        // not when doGet finalizes its execution, but when
        // myAsyncContext.complete() is called.
        AsyncContext myAsyncContext = request.startAsync(request, response);

        // ...

        // myAsyncContext is passed to another thread
        delegateExecutionToProcessingThread(myAsyncContext);

        // done, now this thread is free to serve another request
    }

}

// ... and somewhere in another part of the code:

public class MyProcessingObject {

    public void doSlowProcess() {

        // ...

        runSlowProcess();
        myAsyncContext.complete(); // request is now completed.

        // ...

    }

}

อินเทอร์เฟซAsyncContextยังมีเมธอดในการรับอ็อบเจ็กต์คำขออ็อบเจ็กต์การตอบสนองและเพิ่ม Listeners เพื่อแจ้งเตือนเมื่อกระบวนการเสร็จสิ้น

การเข้าสู่ระบบและออกจากระบบแบบเป็นโปรแกรม (การปรับปรุงความปลอดภัย)

ใน servlets 3 อินเทอร์เฟซHttpServletRequestได้ถูกเพิ่มสองวิธีการใหม่: login(username, password)และlogout().

สำหรับรายละเอียดเพิ่มเติมดูได้ที่เป็นJava EE 6 API


3
เป็นเรื่องที่ควรค่าแก่การกล่าวถึงว่า Servlet 3.0 ได้รับการเผยแพร่ในเดือนธันวาคม 2552 คำถามและคำตอบที่ยอมรับในปัจจุบันเกิดขึ้นก่อนหน้านี้
eis

1
@ServletFilter@WebFilterและ@WebServletContextListener@WebListenerในรายละเอียดอย่างเป็นทางการ AFAICT
lapo

21

Servlet 3.0 ยังไม่เปิดตัว แต่ดูเหมือนว่าจะใกล้เคียงมาก การเปลี่ยนแปลงที่สำคัญที่สุดใน 3.0 ได้แก่ : Pluggability, Ease of development, Async Servlet, Security ไม่ว่าสิ่งเหล่านี้จะสำคัญสำหรับคุณหรือไม่นั้นเป็นไปไม่ได้ที่ฉันจะพูด

สิ่งที่สำคัญที่สุดคือการรองรับ Servlets แบบอะซิงโครนัส นี่คือบทความที่อธิบายรายละเอียดนี้ สเปคเต็มรูปแบบสามารถดาวน์โหลดได้ที่นี่


โอ้โหสุดยอดมาก สิ่งที่ async ดูดีมากขอบคุณสำหรับข้อมูล ฉันเพิ่งเสร็จสิ้นการเขียนโค้ดสิ่งที่คล้ายกับสิ่งนี้
สูงสุดอ.

@adi เปิดตัวในเดือนธันวาคม 2009 ( jcp.org/aboutJava/communityprocess/final/jsr315 )
mauhiz

4
UPDATE Servlet 3.1 specออกเมื่อ 2013-05 ดูว่ามีอะไรใหม่
Basil Bourque

13

ดังที่ดอนกล่าวไว้ประเด็นหลักของการปรับปรุงและเพิ่มเติม ได้แก่ :

  • ความสามารถในการเสียบ (modularizing ของ web.xml)
  • ความง่ายในการพัฒนา (คำอธิบายประกอบทั่วไปการประชุมผ่านการกำหนดค่า)
  • การสนับสนุน Async servlet (สำหรับการเขียนโปรแกรมสไตล์ดาวหาง, async web proxy, async web services)
  • การปรับปรุงความปลอดภัย (การเข้าสู่ระบบแบบเป็นโปรแกรม / ออกจากระบบ)
  • อื่น ๆ (HttpOnly Cookie, การติดตามเซสชัน, EJB ในไฟล์ WAR)

ตรวจสอบงานนำเสนอ Javaone 2008 " Java Servlet 3.0 API: มีอะไรใหม่และน่าตื่นเต้น " สำหรับรายละเอียด


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