Câu hỏi: PRJ301 Phát triển ứng dụng Java web – Bộ ôn tập cuối kỳ số 3
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
HttpSessionListenerSessionEventHandlerServletContextListenerSessionHandlercontext.setAttribute("key", value);request.setAttribute("key", value);session.setAttribute("key", value);response.setAttribute("key", value);Đáp án đúng: "context.setAttribute("key", value); ". ServletContext là vùng dữ liệu dùng chung cho toàn ứng dụng: lấy nó bằng getServletContext() rồi ghi bằng setAttribute, giá trị đó mọi servlet và mọi người dùng đều đọc được và sống tới khi ứng dụng bị dỡ. "request.setAttribute("key", value); " sai vì phạm vi request chỉ sống trong một lần xử lý yêu cầu, hết lượt forward là mất, không dùng để chia sẻ toàn ứng dụng. "session.setAttribute("key", value); " sai vì dữ liệu khi đó chỉ thuộc về một người dùng và biến mất khi phiên hết thời gian chờ hoặc bị invalidate. "response.setAttribute("key", value); " sai vì HttpServletResponse không có phương thức setAttribute; phản hồi chỉ dùng để đặt tiêu đề, mã trạng thái và ghi nội dung trả về.
Đáp án đúng: "<c:
if test="${empty myVar}">".Toán tử empty của EL trả về true cho cả bốn trường hợp: giá trị null, chuỗi rỗng, mảng hay Collection không có phần tử và Map không có khoá, nên ghép nó với thẻ điều kiện của thư viện lõi là cách gọn nhất để xét một biến hoặc thuộc tính có dữ liệu hay không. "<c:when test="${myVar == null}">" hụt hai mặt: thẻ chỉ hợp lệ khi nằm trong c:choose, và phép so sánh với null bỏ qua trường hợp chuỗi rỗng hay danh sách rỗng. "<c:check value="${myVar}">" không tồn tại trong thư viện lõi nên trang sẽ lỗi ngay ở pha dịch vì bộ mô tả thư viện không khai thẻ nào như vậy. "<c:validate test="${empty myVar}">" dùng đúng biểu thức nhưng cũng là thẻ tự đặt; JSTL không có thẻ đó, việc kiểm tra dữ liệu nhập thuộc thư viện khác hoặc do mã tự viết.
Đáp án đúng: "${product.stockPerStore["store101"]}". Trong EL, toán tử ngoặc vuông là cách tổng quát để tra một bản đồ: giá trị trong ngoặc được coi là khoá, nên biểu thức này lấy đúng phần tử ứng với khoá đã nêu rồi in ra số lượng tồn. Cách viết "${product.stockPerStore.store101}" cũng tra được bản đồ, nhưng chỉ khi tên khoá là một định danh hợp lệ, nên nó phụ thuộc hình dạng khoá chứ không phải lối truy cập chung cho mọi khoá, ví dụ khoá có dấu cách hoặc mở đầu bằng chữ số. Cách viết "${
product.stockPerStore.get("store101")
}
"gọi thẳng phương thức Java, chỉ chạy trên bản EL có hỗ trợ gọi phương thức, lại đi đường vòng qua chính toán tử tra khoá đã có sẵn. Cách viết "${product.stockPerStore["store101"].value}" thêm một bước đọc thuộc tính trên giá trị trả về, mà giá trị đó là một số nguyên bọc, không có hàm đọc thuộc tính mang tên ấy, nên biểu thức không ra kết quả.
HttpSessionListenerHttpSessionAttributeListenerServletContextListenerServletRequestListenerĐáp án đúng: "<c:out value="${userEmail}" default="No email provided" />". Thẻ c:out vừa thoát các ký tự đặc biệt của HTML trước khi in, vừa có thuộc tính default dùng khi biểu thức cho null hoặc chuỗi rỗng, nên một thẻ duy nhất làm trọn cả hai yêu cầu của đề mà không cần thêm điều kiện nào. "<c:out value="${
if (userEmail != null) {
'No email provided'
}}" />" sai từ nền tảng: EL là ngôn ngữ biểu thức, không có câu lệnh điều kiện lẫn khối ngoặc nhọn, nên chuỗi đó không dịch được. "<c:out value="${userEmail}" ifNull="No email provided" />" đặt đúng ý nhưng tên thuộc tính không có trong bộ mô tả thư viện, mà thẻ JSTL thì báo lỗi ngay ở pha dịch khi gặp thuộc tính lạ. "<c:out value="${userEmail}" nullVal="No email provided" />" cũng là tên tự nghĩ ra, không thuộc thư viện lõi. "<c:out value="${userEmail}" null="No email provided" />" ngoài việc sai tên thuộc tính còn lấy một từ khoá của EL làm tên, càng không thể hợp lệ.
var="item" value="5"/> <c:forEach var="item" begin="1" end="1"> <c:out value="${item}"/> </c:forEach>