Danh sách câu hỏi của đề

Câu hỏi: PRJ301 Phát triển ứng dụng Java web – Bộ ôn tập thi lại số 1

50 câu trắc nghiệm kèm lời giải của môn PRJ301 - Phát triển ứng dụng Java web, xếp đúng thứ tự trong đề. Trang 2/3 — câu 21–40.

Danh sách câu hỏi

40/50 câuCòn 10
AUse the getConnection() method of the DriverManager class
BCall the createConnection() method of the ConnectionFactory class
CInstantiate a new Connection object directly
DExecute a SQL query to establish a connection dynamically
Lời giải
Đáp án đúng: "Use the getConnection() method of the DriverManager class". Trình tự thông thường là nạp driver rồi gọi phương thức tĩnh này với chuỗi địa chỉ dạng jdbc kèm tên người dùng và mật khẩu; lớp quản lý driver hỏi lần lượt các driver đã đăng ký xem ai hiểu chuỗi địa chỉ đó và trả về đối tượng kết nối do driver ấy tạo, rồi từ đối tượng kết nối ta mới tạo được câu lệnh để chạy SQL. "Call the createConnection() method of the ConnectionFactory class" sai vì trong JDBC chuẩn không có lớp nào mang tên đó, đây là tên nghe giống khuôn mẫu nhà máy nhưng không tồn tại. "Instantiate a new Connection object directly" sai vì kết nối là một giao diện, không thể dựng trực tiếp bằng toán tử tạo đối tượng; thực thể cụ thể luôn do driver cung cấp. "Execute a SQL query to establish a connection dynamically" sai ở thứ tự nhân quả: muốn gửi được một câu SQL thì phải có kết nối trước đã, nên không thể dùng chính SQL để mở kết nối.
Mở trang câu hỏi này →
AIt disables the transaction management feature.
BIt turns on auto-commit mode for each SQL statement.
CIt requires each transaction to be committed or rolled back manually.
DIt automatically rolls back transactions if an error occurs.
Lời giải
Đáp án đúng: "It requires each transaction to be committed or rolled back manually.". Mặc định kết nối ở chế độ tự chốt, mỗi câu lệnh là một giao dịch đóng ngay sau khi chạy xong. Đặt cờ ấy thành false mở một giao dịch kéo dài: các câu lệnh sau đó chỉ ghi tạm cho tới khi gọi commit để chốt hoặc rollback để huỷ, nhờ vậy nhiều câu lệnh trở thành một đơn vị nguyên tử, ví dụ trừ tiền tài khoản này rồi cộng cho tài khoản kia. "It disables the transaction management feature." nói ngược: thao tác này không tắt mà chính là mở quản lý giao dịch một cách tường minh. "It turns on auto-commit mode for each SQL statement." sai vì tham số false tắt chế độ tự chốt, muốn bật lại phải truyền true. "It automatically rolls back transactions if an error occurs." sai vì không hề có việc tự huỷ khi gặp lỗi; chương trình phải tự gọi rollback trong khối bắt ngoại lệ, bỏ qua thì phần đã làm có thể bị chốt hoặc bị bỏ dở tuỳ cách đóng kết nối.
Mở trang câu hỏi này →
AHttpSession is valid even after the browser is closed and reopened
BHttpSession allows storing user data across multiple HTTP requests
CSession IDs are often stored in cookies or appended to URLs
DHttpSession can be retrieved via request.getSession(true)
Lời giải
Đáp án đúng: "HttpSession is valid even after the browser is closed and reopened". Mã phiên được gửi qua một cookie phiên không khai thời hạn sống, nên trình duyệt xoá nó khi đóng; lần mở lại người dùng không còn gửi mã cũ, container không tìm thấy phiên nào khớp và cấp một phiên mới, còn bản ghi cũ nằm trên máy chủ cho tới khi hết khoảng chờ không hoạt động rồi bị dọn. Vì vậy phát biểu rằng phiên vẫn còn hiệu lực sau khi đóng rồi mở lại trình duyệt chính là phát biểu sai mà câu hỏi tìm. "HttpSession allows storing user data across multiple HTTP requests" là phát biểu đúng, bởi giữ dữ liệu xuyên nhiều yêu cầu chính là lý do tồn tại của phiên. "Session IDs are often stored in cookies or appended to URLs" cũng đúng, đó là hai cách mang mã phiên đi theo khi client gọi lại. "HttpSession can be retrieved via request.getSession(true)" đúng nữa: gọi lấy phiên với tham số true nghĩa là trả về phiên hiện có, hoặc tạo mới nếu người dùng chưa có phiên nào.
Mở trang câu hỏi này →
ABy allowing separate scaling of user interface and data processing components.
BBy minimizing the amount of data stored in a database.
CBy consolidating all logic into a single component
DBy enforcing stateful interactions between components.
Lời giải
Đáp án đúng: "By allowing separate scaling of user interface and data processing components.". MVC chia ứng dụng thành ba phần có trách nhiệm rõ ràng và ranh giới gọi nhau hẹp, nên từng phần triển khai rồi nhân bản độc lập: phần hiển thị cùng bộ điều khiển chạy trên nhiều máy phía trước, trong khi phần xử lý dữ liệu đặt riêng và được tối ưu theo cách khác; đổi trang hiển thị cũng không buộc sửa lớp truy cập dữ liệu và ngược lại. "By minimizing the amount of data stored in a database." lạc đề vì MVC là cách tổ chức mã, nó không hứa hẹn gì về lượng dữ liệu lưu trong cơ sở dữ liệu. "By consolidating all logic into a single component" chính là mô tả của kiểu dồn mọi thứ vào một chỗ, đúng cái mà MVC muốn tránh, và nó làm việc mở rộng khó hơn chứ không dễ hơn. "By enforcing stateful interactions between components." sai vì MVC không bắt buộc giữ trạng thái giữa các thành phần; muốn mở rộng theo chiều ngang thì càng nên giữ ít trạng thái trên máy chủ.
Mở trang câu hỏi này →
AIt would make the application harder to test due to increased complexity
BIt would improve testability by allowing the components to be tested in isolation
CIt would have no impact on testability as the architecture doesn't influence testing approaches
DIt would reduce testability due to the tight coupling between view and controller.
Lời giải
Đáp án đúng: "It would improve testability by allowing the components to be tested in isolation". MVC2 dồn việc điều phối vào một servlet trung tâm và đẩy nghiệp vụ xuống các lớp Java thuần, nên mỗi phần kiểm thử được một mình: lớp mô hình và lớp truy cập dữ liệu chạy trong bộ kiểm thử đơn vị mà không cần container, bộ điều khiển thử bằng đối tượng yêu cầu và phản hồi giả lập, còn trang hiển thị chỉ còn việc đọc dữ liệu đã chuẩn bị sẵn nên gần như không còn logic phải kiểm. "It would make the application harder to test due to increased complexity" sai vì cái tăng thêm là số lớp, không phải độ rối của từng đơn vị; mỗi đơn vị nhỏ và ít phụ thuộc thì càng dễ kiểm. "It would have no impact on testability as the architecture doesn't influence testing approaches" sai vì kiến trúc quyết định đúng cái ranh giới kiểm thử: khi nghiệp vụ nằm lẫn trong trang hiển thị thì buộc phải chạy cả máy chủ mới thử nổi. "It would reduce testability due to the tight coupling between view and controller." sai ngay ở tiền đề, chính MVC2 làm giảm ràng buộc chặt giữa hiển thị và điều khiển bằng cách cho chúng chỉ trao đổi qua dữ liệu đặt trong phạm vi yêu cầu.
Mở trang câu hỏi này →
APlace all user-generated content in a single tier to simplify security protocols.
BDistribute user-generated content across multiple tiers, applying appropriate security measures at each level.
CCentralize all business logic in the presentation tier to control access to user-generated content.
DUtilize a flat architecture to avoid the complexity of multi-tier security.
Lời giải
Đáp án đúng: "Distribute user-generated content across multiple tiers, applying appropriate security measures at each level.". Nguyên tắc nhiều tầng là mỗi tầng tự coi dữ liệu đến từ tầng ngoài là chưa đáng tin và tự đặt chốt kiểm riêng: tầng hiển thị lọc rồi thoát ký tự để nội dung do người dùng gửi không chạy được như mã, tầng nghiệp vụ kiểm quyền và kiểm quy tắc trước khi chấp nhận thao tác, tầng dữ liệu dùng câu lệnh tham số hoá cùng tài khoản kết nối chỉ đủ quyền tối thiểu; nhờ nhiều lớp mà một chốt bị lọt thì vẫn còn chốt sau. "Place all user-generated content in a single tier to simplify security protocols." sai vì gom hết vào một tầng tạo ra đúng một điểm vỡ, lọt một lần là mất tất cả. "Centralize all business logic in the presentation tier to control access to user-generated content." sai vì đưa nghiệp vụ lên tầng hiển thị khiến mọi kiểm soát nằm ở chỗ gần người dùng nhất và có thể bị bỏ qua khi ai đó gọi thẳng tầng dưới. "Utilize a flat architecture to avoid the complexity of multi-tier security." sai vì kiến trúc phẳng xoá luôn các ranh giới tin cậy, tức bỏ đi chính thứ tạo nên chiều sâu phòng thủ.
Mở trang câu hỏi này →
AIP address of the client
BUser-agent string
CSession ID
DServer-generated random token
Lời giải
Đáp án đúng: "Session ID". Phía máy chủ, mỗi phiên là một bản ghi trong bảng phiên của container và khoá tra cứu chính là mã phiên: client gửi mã ấy kèm mỗi yêu cầu, container đối chiếu rồi trả về đúng đối tượng phiên, đó là việc xảy ra bên trong lời gọi lấy phiên. "IP address of the client" không dùng được làm khoá vì nhiều máy sau một bộ định tuyến chia nhau cùng một địa chỉ, lại đổi khi người dùng chuyển mạng, nên vừa không duy nhất vừa không bền. "User-agent string" càng không, bởi hàng loạt máy cùng cấu hình khai báo chuỗi giống nhau, mà chuỗi này do client tự gửi nên sửa lúc nào cũng được. "Server-generated random token" chỉ nói về cách sinh ra giá trị, vì bản thân mã phiên vốn là một giá trị ngẫu nhiên do máy chủ tạo; nó không chỉ ra một cơ chế nhận diện nào khác, và thứ container dùng để tra phiên vẫn là mã phiên.
Mở trang câu hỏi này →
AThis method is both secure and efficient, providing immediate retrieval of authorization details
BIt is often considered unsafe because there is a risk that someone could change the session information, which could lead to unauthorized access to higher privileges..
CAdvisable to reduce the frequency of database queries, hence optimizing performance.
DThere are no identified disadvantages; this technique is widely endorsed for managing access controls
Lời giải
Đáp án đúng: "Advisable to reduce the frequency of database queries, hence optimizing performance.". Dữ liệu đặt trong phiên nằm ở bộ nhớ phía máy chủ, client chỉ giữ mã phiên, nên sau khi đăng nhập một lần ta đọc vai trò và quyền từ phiên cho mọi yêu cầu sau mà không phải hỏi lại cơ sở dữ liệu; với ứng dụng mà trang nào cũng cần kiểm quyền thì số truy vấn tiết kiệm được rất đáng kể, và đó đúng là hệ quả câu hỏi nhắm tới. "This method is both secure and efficient, providing immediate retrieval of authorization details" khẳng định quá mạnh ở chữ an toàn: cách làm này vẫn phải chống việc chiếm mã phiên và vẫn phải làm mới khi quyền thay đổi, nên gọi nó vừa an toàn vừa hiệu quả là không chính xác. Lựa chọn cho rằng cách này "unsafe because there is a risk that someone could change the session information" lại mô tả sai cơ chế: nội dung phiên không nằm phía client nên người dùng không sửa trực tiếp được, khác hẳn dữ liệu đặt trong cookie hay trường ẩn. "There are no identified disadvantages; this technique is widely endorsed for managing access controls" sai vì nhược điểm có thật và dễ chỉ ra: quyền bị thu hồi trong cơ sở dữ liệu không tự phản ánh vào phiên đang mở, và dữ liệu phiên chiếm bộ nhớ nên phải nhân bản khi chạy nhiều máy.
Mở trang câu hỏi này →
AServletContext stores data for the entire application, while HttpSession only stores data for each user
BServletContext is created each time a user accesses, HttpSession is created each request
CServletContext is destroyed when the session times out, while HttpSession is destroyed when the server shuts down
DThere is no difference
Lời giải
Đáp án đúng: "ServletContext stores data for the entire application, while HttpSession only stores data for each user". Mỗi ứng dụng web chỉ có một ngữ cảnh, do container tạo khi ứng dụng khởi động và huỷ khi ứng dụng bị gỡ hoặc máy chủ tắt, nên dữ liệu đặt vào đó dùng chung cho mọi người truy cập; còn phiên có một thực thể cho mỗi người dùng, sinh ra khi lần đầu gọi lấy phiên và mất khi bị huỷ tường minh hoặc hết khoảng chờ không hoạt động, nên dữ liệu trong đó riêng của từng người. "ServletContext is created each time a user accesses, HttpSession is created each request" đảo lộn cả hai: ngữ cảnh không tạo lại theo mỗi lượt truy cập, và phiên không sinh mới theo từng yêu cầu, nếu vậy thì chẳng giữ được trạng thái nào. "ServletContext is destroyed when the session times out, while HttpSession is destroyed when the server shuts down" cũng đổi chỗ vòng đời của hai thứ, vì hết thời gian chờ là chuyện của phiên còn tắt máy chủ là chuyện của ngữ cảnh. "There is no difference" sai vì hai thứ khác nhau cả về phạm vi dữ liệu, số lượng thực thể lẫn thời điểm sinh và huỷ.
Mở trang câu hỏi này →
AsetContextAttribute()
BaddAttribute()
CsetAttribute()
DaddContextAttribute()
Lời giải
Đáp án đúng: "setAttribute()". Đặc tả Servlet dùng chung một tên phương thức nhận một chuỗi khoá cùng một đối tượng giá trị cho cả bốn phạm vi dữ liệu, nên chính đối tượng mà ta gọi nó mới quyết định tầm sống: gọi trên ngữ cảnh ứng dụng thì dữ liệu dùng chung cho mọi người tới khi ứng dụng dừng, gọi trên phiên thì riêng từng người, gọi trên yêu cầu thì chỉ sống trong một lượt phục vụ; đọc lại bằng getAttribute và xoá bằng removeAttribute. "setContextAttribute()" không tồn tại trong API, tên phương thức không lặp lại chữ ngữ cảnh vì kiểu của đối tượng đã nói điều đó rồi. "addAttribute()" cũng không có trong đặc tả Servlet; tên này quen thuộc ở thư viện khác chứ không phải ở đây. "addContextAttribute()" là tên bịa gộp cả hai lỗi trên, vừa sai động từ vừa thêm chữ ngữ cảnh thừa.
Mở trang câu hỏi này →
Đề bài
class="model.Book" scope="page"> <jsp:setProperty name="e1" property="id" value="1"/> <jsp:setProperty name="e1" property="name" value="han va yeu"/> <jsp:setProperty name="e1" property="price" value="100"/> </jsp:useBean> <jsp:useBean id="e2" class="model.Book" scope="page"> <jsp:setProperty name="e2" property="id" value="2"/> <jsp:setProperty name="e2" property="name" value="ngon ngu cua tinh yeu"/> <jsp:setProperty name="e2" property="price" value="120"/> </jsp:useBean> <c:set var="total" value="${e1.price+e2.price}" /> Result= ${
  total
}
AThrow an exception because the code can not use EL in this sitution.
BThere is a syntax-error because missing the JSTL library.
CResult=220
DResult=0
EResult=null
FResult="" ( a empty string)
Lời giải
Đáp án đúng: "There is a syntax-error because missing the JSTL library.". Trang có dùng thẻ đặt biến của thư viện thẻ chuẩn nhưng không hề có chỉ thị taglib khai địa chỉ thư viện lõi cùng tiền tố c, nên ở pha dịch container không biết tiền tố đó thuộc thư viện nào và trang không dịch nổi; lỗi xảy ra trước khi có bất cứ dòng kết quả nào. "Throw an exception because the code can not use EL in this sitution." sai vì bản thân biểu thức cộng hai thuộc tính giá của hai bean phạm vi trang là biểu thức hợp lệ, EL dùng được bình thường ở đây. "Result=220" là con số sẽ hiện ra nếu trang khai đủ thư viện, bởi hai giá trị đặt vào là 100 và 120. "Result=0" không thể xảy ra vì không có phép gán nào cho tổng bằng không. "Result=null" cũng không, bởi EL in một giá trị không tìm thấy thành chuỗi rỗng chứ không in ra chữ null. "Result="" ( a empty string)" thì gần với cách EL ứng xử khi biến chưa có, nhưng ở đây trang dừng ngay tại pha dịch nên không có đầu ra nào để bàn.
Mở trang câu hỏi này →
AChecks if the username parameter has a value
BReturns true if username is empty
CReturns the value of username
DAlways returns username
EChecks if the username parameter has a value then return its value
Lời giải
Đáp án đúng: "Checks if the username parameter has a value". Trong EL, param là một map ẩn ánh xạ tên tham số của yêu cầu sang giá trị đầu tiên của nó; toán tử empty trả về true khi giá trị là null, chuỗi rỗng hoặc tập rỗng, còn toán tử not đảo kết quả lại, nên cả biểu thức cho ra một giá trị luận lý: true khi tham số có mặt và không rỗng. Vì vậy nó hay nằm trong thuộc tính điều kiện của thẻ kiểm tra để quyết định có hiển thị khối bên trong hay không. "Returns true if username is empty" là nghĩa của biểu thức khi bỏ mất toán tử not, tức đúng ngược lại. "Returns the value of username" là việc của biểu thức chỉ gồm map param và tên tham số, không có hai toán tử kia. "Always returns username" sai vì kết quả luôn là true hoặc false, không bao giờ là tên hay giá trị của tham số. Lựa chọn nói rằng biểu thức kiểm tra xem tham số "has a value then return its value" cũng sai: EL không có nhánh ngầm vừa kiểm vừa trả, muốn thế phải viết thêm toán tử ba ngôi.
Mở trang câu hỏi này →
ABy using the dot operator directly on the collection
BBy iterating over the collection using a loop in EL
CBy accessing elements using square brackets with the index
DBy converting the collection to a string and then accessing elements
Lời giải
Đáp án đúng: "By accessing elements using square brackets with the index". EL quy định toán tử ngoặc vuông là cách lấy phần tử của một tập có thứ tự hay của một map: viết tên biến rồi ngoặc vuông kèm chỉ số thì EL lấy phần tử ở vị trí đó của danh sách hoặc mảng, còn kèm một chuỗi khoá thì nó tra map; chỉ số có thể là biểu thức nên dùng được ngay trong biến đếm của thẻ lặp. "By using the dot operator directly on the collection" sai với tập có chỉ số vì dấu chấm được hiểu là đọc thuộc tính theo quy ước bean, nó đi tìm phương thức đọc mang tên đứng sau dấu chấm chứ không nhận một số làm vị trí. "By iterating over the collection using a loop in EL" sai vì EL là ngôn ngữ biểu thức, nó không có câu lệnh lặp; việc duyệt tập phải nhờ thẻ lặp của thư viện thẻ chuẩn hoặc vòng lặp trong mã Java. "By converting the collection to a string and then accessing elements" sai vì đổi tập thành chuỗi chỉ cho ra phần mô tả văn bản của đối tượng, mất luôn khả năng lấy đúng phần tử và sai cả kiểu dữ liệu trả về.
Mở trang câu hỏi này →
A${myList[0]}
B${myList.getFirst()}
C${myList.first}
D${myList.getFirst}
Lời giải

Đáp án đúng: "${myList[0]}". Cách duy nhất EL định nghĩa để lấy phần tử theo vị trí là toán tử ngoặc vuông kèm chỉ số, nên biểu thức này trả về phần tử đầu của danh sách; EL còn tự ép chuỗi số viết trong ngoặc về số nguyên khi tập là danh sách hay mảng. "${

Lời giải
myList.getFirst()
}
"

dựa vào việc gọi một phương thức mang tên đó trên danh sách, trong khi thứ cần ở đây là chỉ số, và danh sách dùng trong JSP không được lấy phần tử đầu theo kiểu gọi phương thức như vậy. "${myList.first}" dùng dấu chấm nên EL hiểu là đọc một thuộc tính tên first theo quy ước bean, tức đi tìm phương thức đọc tương ứng; danh sách không có thuộc tính như thế nên biểu thức báo không tìm thấy thuộc tính. "${myList.getFirst}" còn xa hơn: viết sau dấu chấm nên nó bị hiểu là tên một thuộc tính bắt đầu bằng get, EL sẽ tìm phương thức đọc của chính thuộc tính ấy và cũng không có.

Mở trang câu hỏi này →
AA component responsible for handling HTTP requests in application
BA mechanism for managing database connections
CAn interface for intercepting events that occur in a web application
DA tool for compressing and decompressing web resources
Lời giải
Đáp án đúng: "An interface for intercepting events that occur in a web application". Listener là nhóm giao diện do đặc tả Servlet định nghĩa để chặn các sự kiện trong vòng đời ứng dụng: khai bằng thẻ listener trong web.xml hoặc bằng annotation tương ứng, rồi container gọi phương thức của ta khi ứng dụng khởi động và khi bị gỡ, khi một phiên được tạo hay bị huỷ, khi một thuộc tính trong phạm vi nào đó được đặt, thay hoặc xoá; nhờ đó ta có chỗ mở sẵn tài nguyên lúc bật và đóng gọn lúc dừng, hay đếm số người đang trực tuyến. "A component responsible for handling HTTP requests in application" là mô tả của servlet, thứ nhận và trả lời yêu cầu HTTP, còn listener không nằm trên đường đi của một yêu cầu cụ thể. "A mechanism for managing database connections" sai vì việc quản lý kết nối thuộc về nguồn dữ liệu và pool; listener nhiều lắm chỉ là nơi khởi tạo chúng lúc ứng dụng bật, bản thân nó không phải cơ chế quản lý. "A tool for compressing and decompressing web resources" sai vì nén hay giải nén nội dung trả về là việc của filter hoặc của cấu hình máy chủ.
Mở trang câu hỏi này →
AA component responsible for managing database connections.
BA mechanism for intercepting and reacting to lifecycle events of a web application.
CA module for handling HTTP requests and generating responses.
DA tool for optimizing server performance and resource utilization.
Lời giải
Đáp án đúng: "A mechanism for intercepting and reacting to lifecycle events of a web application.". Server listener là lớp do ta viết, cài một giao diện listener của đặc tả servlet rồi khai báo bằng annotation listener hoặc bằng khối listener trong mô tả triển khai; container tự gọi các phương thức callback đúng lúc sự kiện vòng đời xảy ra, chẳng hạn ServletContextListener nhận contextInitialized khi ứng dụng vừa nạp xong và contextDestroyed khi ứng dụng bị tháo, HttpSessionListener nhận mốc tạo và huỷ phiên, ServletRequestListener nhận mốc request bắt đầu và kết thúc. Lựa chọn "A component responsible for managing database connections." mô tả một nguồn dữ liệu hay bể kết nối; listener chỉ là nơi thuận tiện để khởi tạo bể đó chứ bản thân nó không quản lý kết nối. Lựa chọn "A module for handling HTTP requests and generating responses." chính là định nghĩa của servlet, vì servlet mới nằm trên đường xử lý request và sinh nội dung trả về. Lựa chọn "A tool for optimizing server performance and resource utilization." nói về công cụ tinh chỉnh hiệu năng, không phải cơ chế bắt sự kiện vòng đời.
Mở trang câu hỏi này →
AServletContextAttributeListener
BServletRequestListener
CHttpSessionListener
DServletContextListener
Lời giải
Đáp án đúng: "ServletContextListener". Nạp JDBC driver là việc chỉ cần làm một lần cho cả ứng dụng và phải xong trước khi có request đầu tiên, nên đúng chỗ là contextInitialized của giao diện này: container gọi phương thức đó ngay sau khi ngữ cảnh ứng dụng được tạo và trước khi bất kỳ servlet nào phục vụ, còn contextDestroyed là nơi dọn dẹp khi ứng dụng dừng. Lựa chọn "ServletContextAttributeListener" chỉ được gọi khi có thuộc tính của ngữ cảnh ứng dụng bị thêm, thay hoặc xoá; nếu không ai đặt thuộc tính thì nó không chạy lần nào. Lựa chọn "ServletRequestListener" chạy theo từng request, nên driver bị nạp lặp lại vô ích và vẫn muộn hơn thời điểm khởi động ứng dụng. Lựa chọn "HttpSessionListener" gắn với vòng đời phiên người dùng, mà ứng dụng có thể phục vụ nhiều request không tạo phiên nào, khi đó driver có thể không bao giờ được nạp.
Mở trang câu hỏi này →
AContext initialization
BSession creation
CSession destruction
DRequest handling
Lời giải
Đáp án đúng: "Session destruction". Phương thức sessionDestroyed là callback container gọi khi một phiên hết hiệu lực, do mã gọi huỷ phiên hoặc do quá thời gian chờ không hoạt động; đây là chỗ hợp lý để giải phóng tài nguyên gắn với phiên hay giảm bộ đếm người đang đăng nhập. Lựa chọn "Context initialization" thuộc contextInitialized của ServletContextListener, xảy ra một lần ở mức ứng dụng và không liên quan phiên nào. Lựa chọn "Session creation" do phương thức còn lại của chính giao diện này là sessionCreated xử lý, tức là mốc đối lập trong vòng đời phiên. Lựa chọn "Request handling" là việc của servlet, hoặc của ServletRequestListener nếu chỉ cần bắt mốc một request bắt đầu và kết thúc, chứ không phải việc của sessionDestroyed.
Mở trang câu hỏi này →
Đề bài
var="item" value="5"/> <c:forEach var="item" begin="1" end="1"> <c:out value="${item}"/> </c:forEach>
A1
B5
CNo output
DError
Lời giải
Đáp án đúng: "1". Thẻ set tạo biến item ở phạm vi trang với giá trị 5, nhưng thẻ forEach lại khai biến vòng lặp cũng mang tên item, và trong thân vòng lặp biến vòng lặp che mất biến cũ; vòng lặp đếm từ giá trị begin đến giá trị end là từ 1 đến 1 nên chạy đúng một lượt với item bằng 1, vì vậy thẻ out in ra 1. Lựa chọn "5" chỉ đúng nếu đọc biến item ở ngoài vòng lặp, còn thẻ out ở đây nằm trong thân nên luôn thấy giá trị của biến vòng lặp. Lựa chọn "No output" sai vì begin và end đều bằng 1 nên khoảng lặp không rỗng và thân vẫn chạy một lượt. Lựa chọn "Error" sai vì chỉ thị taglib của thư viện core đã có mặt với tiền tố c, mọi thẻ đều dùng đúng tiền tố đó, và việc trùng tên biến giữa set với forEach không bị coi là lỗi ở pha dịch trang.
Mở trang câu hỏi này →
Đề bài
    <p>${user.name}</p>
</c:forEach>
<p>End of list</p>
AIt will display all user names followed by "End of list".
BIt will throw a NullPointerException because userList is empty.
CIt will only print "End of list".
DThe page will crash due to an iteration error.
Lời giải
Đáp án đúng: "It will only print "End of list".". Thẻ forEach lặp theo số phần tử của tập được truyền vào thuộc tính items, nên danh sách rỗng nghĩa là không có lượt nào và thân thẻ không sinh ra đoạn văn bản nào; dòng nằm sau vòng lặp không phụ thuộc vòng lặp nên vẫn được in bình thường. Lựa chọn "It will display all user names followed by "End of list"." chỉ đúng khi danh sách có phần tử, còn ở đây không có tên nào để hiển thị. Lựa chọn "It will throw a NullPointerException because userList is empty." sai ở hai mức: danh sách rỗng khác với null, và ngay cả khi biến không tồn tại thì biểu thức trả về null còn forEach coi null là tập rỗng nên cũng không ném ngoại lệ. Lựa chọn "The page will crash due to an iteration error." sai vì lặp không phần tử là trạng thái hợp lệ của forEach, trang vẫn dịch được và chạy trọn tới cuối.
Mở trang câu hỏi này →