Giá trị của servlet <load-on-startup> biểu thị điều gì


174

Tôi nhận được một chút bối rối ở đây. Trong ứng dụng của chúng tôi, chúng tôi đang có một vài dịch vụ được xác định. Đây là đoạn trích từ web.xmlmột trong những servlet:

<servlet>
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>com.foo.framework.axis2.http.FrameworkServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet> 

Theo hiểu biết của tôi, giá trị cho <load-on-startup>phải là một số nguyên dương để nó được tải tự động. Tôi đã tra cứu trên google nhưng những phản hồi tôi gặp chỉ làm tăng thêm sự nhầm lẫn của tôi.

Câu trả lời:


186

Nhựa 3.0 ghi lại hành vi này:

load-on-startup có thể chỉ định một giá trị nguyên (tùy chọn). Nếu giá trị bằng 0 hoặc lớn hơn, nó chỉ ra một lệnh cho các servlet được tải, các servlet có số cao hơn sẽ được tải sau các servlet có số thấp hơn.

Thông số kỹ thuật JSP 3.1 (JSR 340) cho biết điều này trên trang 14-160:

Phần tử load-on-startupchỉ ra rằng servlet này sẽ được tải (khởi tạo và có init () được gọi) khi khởi động ứng dụng Web. Nội dung phần tử của phần tử này phải là một số nguyên cho biết thứ tự mà servlet sẽ được tải. Nếu giá trị là số nguyên âm hoặc phần tử không có mặt, thì container có thể tự do tải servlet bất cứ khi nào nó chọn. Nếu giá trị là số nguyên dương hoặc 0, thì container phải tải và khởi tạo servlet khi ứng dụng được triển khai. Container phải đảm bảo rằng các servlet được đánh dấu với số nguyên thấp hơn được tải trước khi các servlet được đánh dấu với số nguyên cao hơn. Container có thể chọn thứ tự tải các servlet có cùng load-on-startupgiá trị.

Bạn có thể muốn kiểm tra không chỉ JSR, mà cả tài liệu cho bộ chứa web của bạn. Có thể có sự khác biệt


Cletus sai trong câu trả lời của mình. Bạn nên xem xét để chỉnh sửa bài.
Alboz

3
Điều gì xảy ra khi tải khi khởi động không được chỉ định?
Nertal

1
@Nirmal Đoạn thứ hai chỉ định rằng nếu phần tử không có mặt thì nó có hành vi tương tự như là âm, tức là container có thể tự do tải servlet bất cứ khi nào nó chọn.
Finnegan

129

Trả lời ngắn : value> = 0 có nghĩa là servlet được tải khi ứng dụng web được triển khai hoặc khi máy chủ khởi động. giá trị <0: servlet được tải bất cứ khi nào container cảm thấy thích.

Câu trả lời dài (từ thông số kỹ thuật):

Phần tử load-on-startup chỉ ra rằng servlet này sẽ được tải (khởi tạo và có init () được gọi) khi khởi động ứng dụng web. Nội dung tùy chọn của các phần tử này phải là một số nguyên cho biết thứ tự mà servlet sẽ được tải. Nếu giá trị là số nguyên âm hoặc phần tử không có mặt, thì container có thể tự do tải servlet bất cứ khi nào nó chọn. Nếu giá trị là số nguyên dương 128 hoặc 0, thì container phải tải và khởi tạo servlet khi ứng dụng được triển khai. Container phải đảm bảo rằng các servlet được đánh dấu với số nguyên thấp hơn được tải trước khi các servlet được đánh dấu với số nguyên cao hơn. Container có thể chọn thứ tự tải các servlet có cùng giá trị tải khi khởi động.


1
Và đó là lý do tại sao chúng tôi đánh dấu 0 cho thứ tự của DispatcherServlet để tải nó trước khi ứng dụng bắt đầu ..
Lucky

11

Nó chỉ ra rằng servlet sẽ không được bắt đầu cho đến khi một yêu cầu cố gắng truy cập nó.

Nếu tải khi khởi động lớn hơn hoặc bằng 0 thì khi container khởi động, nó sẽ khởi động servlet đó theo thứ tự tăng dần của giá trị khởi động mà bạn đặt ở đó (tức là 0, 1 rồi 2 rồi 5 rồi 10, v.v.) .


7
Không gây ra tải, quá. Chỉ các giá trị âm không được bảo đảm: "[...] Nếu giá trị là số nguyên dương hoặc 0, thì bộ chứa phải tải và khởi tạo servlet khi ứng dụng được triển khai. [...]"
marabol

1
@cletus Tôi nghĩ tốt hơn là sửa đổi lớn hơn 0 bằng lớn hơn hoặc bằng 0 , vì nhiều người dùng đọc câu trả lời của bạn như được chỉ định cho mỗi câu được chấp nhận. Cảm ơn trước
Tarik

9

Vòng đời của Servlet

Vòng đời của một servlet được điều khiển bởi container trong đó servlet đã được triển khai. Khi một yêu cầu được ánh xạ tới một servlet, container thực hiện các bước sau.

  1. Nếu một phiên bản của servlet không tồn tại, bộ chứa web:

    a. Tải lớp servlet

    b. Tạo một thể hiện của lớp servlet

    c. Khởi tạo cá thể servlet bằng cách gọi phương thức init (khởi tạo được trình bày trong Tạo và Khởi tạo một Servlet )

  2. Container gọi phương thức dịch vụ, truyền các đối tượng yêu cầu và đáp ứng. Phương pháp dịch vụ được thảo luận trong Phương pháp dịch vụ bằng văn bản .

Giá trị 0 trên load-on-startupcó nghĩa là điểm 1 được thực thi khi có yêu cầu đến servlet đó. Các giá trị khác có nghĩa là điểm 1 được thực thi khi khởi động container.


câu trả lời hoàn hảo!
bò tót

1

Như đã nêu trong câu trả lời khác và bài viết không tải khi khởi động này là chấp nhận được và nếu không có bất kỳ servlet nào khác, điều này sẽ ưu tiên tải và tải trong quá trình triển khai. Cách sử dụng tốt nhất của statup khi tải là tải các máy chủ mất nhiều thời gian hơn để khởi tạo tốt trước khi yêu cầu đầu tiên đến như các máy chủ tạo kết nối mạng hoặc thực hiện cuộc gọi mạng hoặc giữ tài nguyên cồng kềnh, điều này sẽ giảm đáng kể thời gian phản hồi cho một vài yêu cầu đầu tiên.


1
  1. Nếu giá trị là giống nhau cho hai servlet thì chúng sẽ được tải theo thứ tự mà chúng được khai báo bên trong tệp web.xml.
  2. if là 0 hoặc số nguyên âm hơn Servlet sẽ được tải khi Container cảm thấy tải chúng.
  3. đảm bảo tải, khởi tạo và gọi phương thức init () của servlet bằng web container.
  4. Nếu không có phần tử nào cho bất kỳ servlet nào thì chúng sẽ được tải khi bộ chứa web quyết định tải chúng.

0

vâng, nó có thể có cùng một giá trị .... lý do cho việc đưa số vào khi khởi động tải là để xác định một chuỗi cho máy chủ tải tất cả các servlet. servlet có 0 tải khi khởi động sẽ tải trước và servlet có giá trị 1 sẽ tải sau đó.

nếu hai servlet sẽ có cùng giá trị cho tải khi khởi động thì nó sẽ được tải theo cách chúng được khai báo trong tệp web.xml từ trên xuống dưới. Servlet xuất hiện đầu tiên trong web.xml sẽ được tải trước và cái còn lại sẽ được tải sau đó.


0

-> (Không có tải khi khởi động) Trước hết khi bao giờ servlet được triển khai trong máy chủ, trách nhiệm của máy chủ là tạo đối tượng servlet. Ví dụ: Giả sử Servlet được triển khai trong máy chủ, (Đối tượng Servlet không có sẵn trong máy chủ), máy khách sẽ gửi yêu cầu đến servlet lần đầu tiên sau đó máy chủ tạo đối tượng servlet với sự trợ giúp của hàm tạo mặc định và gọi ngay init (). Từ đó, khi khách hàng gửi yêu cầu, chỉ có phương thức dịch vụ sẽ được thực thi vì đối tượng đã có sẵn

Nếu thẻ load-on-start-up được sử dụng trong bộ mô tả triển khai: Tại thời điểm triển khai, máy chủ sẽ tạo đối tượng servlet cho các servlet dựa trên giá trị dương được cung cấp ở giữa các thẻ. Việc tạo các đối tượng cho các lớp servlet sẽ theo sau từ 0-128 0 số servlet sẽ được tạo trước và tiếp theo là các số khác.

Nếu chúng tôi cung cấp cùng một giá trị cho hai servlet trong web.xml thì việc tạo các đối tượng sẽ được thực hiện dựa trên vị trí của các lớp trong web.xml cũng thay đổi tùy theo máy chủ.

Nếu chúng tôi cung cấp giá trị âm ở giữa tải khi khởi động thẻ thì máy chủ sẽ không tạo đối tượng servlet.

Các tình huống khác trong đó máy chủ tạo đối tượng cho servlet.

Nếu chúng ta không sử dụng thẻ tải khi khởi động trong web.xml, thì dự án sẽ được triển khai khi khách hàng gửi yêu cầu cho máy chủ lần đầu tiên tạo đối tượng và máy chủ chịu trách nhiệm gọi các phương thức vòng đời của nó. Sau đó, nếu một. Class được sửa đổi trong máy chủ (tomcat). một lần nữa máy khách gửi yêu cầu cho servlet được sửa đổi nhưng trong trường hợp tomcat, đối tượng mới sẽ không được tạo và máy chủ sử dụng đối tượng hiện tại trừ khi việc khởi động lại máy chủ diễn ra. Nhưng trong lớp logic web khi từng tệp. Class được sửa đổi trong máy chủ mà không khởi động lại máy chủ nếu nó nhận được yêu cầu thì máy chủ sẽ gọi phương thức hủy trên servlet hiện có và tạo một đối tượng servlet mới và gọi init () để khởi tạo .


-1

Nếu giá trị <0, serlet được khởi tạo khi yêu cầu đến, khác> = 0, container sẽ tải theo thứ tự tăng dần của các giá trị. nếu 2 hoặc nhiều servlet có cùng giá trị, thì thứ tự của các servlet được khai báo trong tệp web.xml.


-2

Container servlet tải servlet trong khi khởi động hoặc khi yêu cầu đầu tiên được thực hiện. Việc tải servlet phụ thuộc vào thuộc tính "load-on-startup" trong tệp "web.xml". Nếu thuộc tính có số nguyên dương (0 đến 128) thì servlet được tải cùng với việc tải container nếu không nó sẽ tải khi yêu cầu đầu tiên được cung cấp cho dịch vụ.

Khi servlet được tải một khi nó nhận được yêu cầu thì nó được gọi là "Lazy load".


-6

Nó đơn giản như bạn thậm chí không mong đợi.

Nếu giá trị dương, nó được tải khi container bắt đầu

Nếu giá trị không dương hơn thì dịch vụ được tải khi yêu cầu được thực hiện.

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.