Sự khác biệt giữa Servlet 2.5 và 3 là gì?


92

Tôi đang lăn mã J2EE tuân theo Servlet 2.5 và tôi đang tự hỏi đâu là sự khác biệt chính giữa 2.5 và 3. Con trỏ đến tài liệu chính thức của Sun và trải nghiệm cá nhân được đánh giá cao nhất.

Nếu tôi không nên quan tâm đến bản thân mình với 3 vào lúc này, hãy nói như vậy. Cảm ơn!


2
+1 Chỉ chờ câu trả lời :)
ATorras

Câu trả lời:


149

CẬP NHẬT

Chỉ là một bản cập nhật và nói rõ hơn, đây là những điểm khác biệt chính giữa servlet 2.5 và 3 (Tôi không cố gắng trình bày đầy đủ, tôi chỉ đề cập đến những phần thú vị nhất):

Chú thích để khai báo các servlet, bộ lọc và trình nghe (dễ phát triển)

Trong servlet 2.5, để khai báo một servlet với một tham số init, bạn cần thêm tham số này vào 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>

Trong servlet 3, web.xml là tùy chọn và bạn có thể sử dụng chú thích thay vì XML. Ví dụ tương tự:

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

Đối với bộ lọc, bạn cần thêm cái này vào web.xml trong servlet 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>

Tương tự khi sử dụng chú thích trong các servlet 3:

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

Đối với một trình nghe (trong trường hợp này là ServletContextListener), trong servlet 2.5:

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

Sử dụng chú thích cũng vậy:

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

Mô-đun hóa web.xml (Tính dễ hiểu)

  • Trong servlet 2.5 chỉ có một tệp web.xml nguyên khối .
  • Trong servlet 3, mỗi jar "có thể tải được" có thể có web -gment.xml trong thư mục META-INF của nó chỉ định các servlet, bộ lọc, v.v. Điều này cho phép các thư viện và khung công tác chỉ định các servlet của riêng chúng hoặc các đối tượng khác.

Đăng ký động các servlet, bộ lọc và bộ lắng nghe tại thời điểm khởi tạo ngữ cảnh (Khả năng phù hợp)

Trong servlets 3, một ServletContextListenercó thể thêm động servlets, bộ lọc và nghe bằng cách sử dụng các phương pháp sau đây thêm vào SevletContext: addServlet(), addFilter()addListener()

Hỗ trợ không đồng bộ

Ví dụ: giả sử một số thùng chứa servlet có năm luồng trong nhóm luồng của nó và có một quá trình tốn thời gian để được thực thi cho mỗi yêu cầu (như một truy vấn SQL phức tạp).

  • Với servlets 2,5 servlet container này sẽ chạy ra khỏi chủ đề có sẵn nếu nó nhận lăm yêu cầu cùng một lúc và năm chủ đề có sẵn bắt đầu thực hiện quá trình này, bởi vì các chủ đề sẽ không trở lại cho đến khi service()(hoặc doGet(), doPost()vv) được thực hiện từ khi bắt đầu để kết thúc và trả về một phản hồi.

  • Với servlet 3.0, quá trình lâu dài này có thể được ủy quyền cho một luồng khác và kết thúc service()trước khi gửi phản hồi (phản hồi bây giờ sẽ được gửi bởi luồng mới nhất). Bằng cách này, chủ đề có thể miễn phí nhận các phản hồi mới.

Một ví dụ về hỗ trợ không đồng bộ:

Servlets 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.

        // ...

    }

}

Giao diện AsyncContextcũng có các phương thức để lấy đối tượng yêu cầu, đối tượng phản hồi và thêm người nghe để thông báo cho họ khi một quá trình kết thúc.

Đăng nhập và đăng xuất có lập trình (cải tiến bảo mật)

Trong servlet 3, giao diện HttpServletRequestđã được thêm vào hai phương thức mới: login(username, password)logout().

Để biết thêm chi tiết, hãy xem Java EE 6 API .


3
Điều đáng nói là Servlet 3.0 đã được phát hành trở lại vào tháng 12 năm 2009. Câu hỏi và câu trả lời được chấp nhận hiện tại có trước những câu hỏi đó.
eis

1
@ServletFilter@WebFilter@WebServletContextListener@WebListenertrong thông số kỹ thuật chính thức AFAICT.
lapo

21

Servlet 3.0 vẫn chưa được phát hành, nhưng có vẻ như nó đã rất gần. Những thay đổi quan trọng nhất trong 3.0 là: Tính dễ hiểu, Tính dễ phát triển, Async Servlet, Bảo mật. Tôi không thể nói những điều này có quan trọng đối với bạn hay không.

Điều quan trọng nhất trong số này có lẽ là hỗ trợ cho các Servlet không đồng bộ. Đây là một bài báo mô tả chi tiết điều này. Thông số kỹ thuật đầy đủ có thể được tải xuống tại đây .


Khỉ thật, thật tuyệt. Nội dung không đồng bộ trông tuyệt vời, cảm ơn vì thông tin. Tôi vừa hoàn thành mã hóa một cái gì đó tương tự như thế này.
Tối đa A.

@adi nó được phát hành vào tháng 12 năm 2009 ( jcp.org/aboutJava/communityprocess/final/jsr315 )
mauhiz

4
CẬP NHẬT thông số Servlet 3.1 được phát hành 2013-05. Xem có gì mới .
Basil Bourque

13

Như Don đã đề cập, các lĩnh vực cải tiến và bổ sung chính là:

  • Tính dễ hiểu (mô-đun hóa web.xml)
  • Dễ phát triển (chú thích, chung chung, quy ước về cấu hình)
  • Hỗ trợ Servlet không đồng bộ (để lập trình kiểu sao chổi, proxy web không đồng bộ, dịch vụ web không đồng bộ)
  • Cải tiến bảo mật (đăng nhập / đăng xuất có lập trình)
  • Khác (HttpOnly Cookie, Theo dõi phiên, EJB trong tệp WAR)

Hãy xem bản trình bày Javaone 2008 " Java Servlet 3.0 API: Có gì mới và thú vị " để biết thêm chi tiết.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.