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 ServletContextListener
có 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()
và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 AsyncContext
cũ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)
và logout()
.
Để biết thêm chi tiết, hãy xem Java EE 6 API .