Câu hỏi: PRJ301 Phát triển ứng dụng Java web – Bộ ôn tập cuối kỳ số 1
49 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
doGetdoPostdoFilterserviceinitinit()service()destroy()doGet()doPost()protected void doPost(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
String user = req.getParameter("username");
res.getWriter().println("User: " + user);
}Which of the following statements is the most incorrect?
<context-param> tag in the web.xml file?
<web-app>
<context-param>
<param-name>studentName</param-name>
<param-value>abcJhn</param-value>
</context-param></web-app>
Đáp án đúng: "ServletContext sc = getServletContext();
String serverName = sc.getInitParameter("studentName"); ". Khai báo tham số nằm trực tiếp trong phần tử gốc của mô tả triển khai, không lồng trong khai báo của một servlet nào, nên nó là tham số khởi tạo của cả ứng dụng và chỉ vật thể ngữ cảnh ứng dụng đọc được, lấy bằng lời gọi trong servlet rồi hỏi theo tên. Dòng "request.getParameter("studentName"); " đọc tham số của lượt yêu cầu, tức dữ liệu từ chuỗi truy vấn hay biểu mẫu, nên luôn trả về giá trị rỗng với tham số khai trong tệp cấu hình. Đoạn "ServletConfig sc = getServletConfig()." sai hai lẽ: vật thể cấu hình chỉ thấy tham số khởi tạo khai riêng bên trong khai báo của chính servlet đó, và dòng lại kết thúc bằng dấu chấm nên mã không biên dịch được. Dòng "response.getParameter("studentName"); " sai vì đối tượng phản hồi chỉ dùng để ghi kết quả trả về, nó không có hàm đọc tham số nào.
Đá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ả.
<a href="logoutServlet">Logout</a>When the client clicks the logout link, the following code in the logoutServlet runs:
HttpSession session = request.getSession();
//TODO
response.sendRedirect("login.jsp");What is the best code to write in the TODO section to complete the logout function?
Đáp án đúng: "session.invalidate(); ". Lời gọi này huỷ cả phiên phía máy chủ: mọi thuộc tính bị bỏ và mã định danh cũ không còn hiệu lực, nên sau khi chuyển hướng về trang đăng nhập thì các trang như trang hồ sơ hay trang lịch sử đơn không đọc lại được dữ liệu người dùng cũ, kể cả khi người dùng bấm nút lùi. Lời gọi "session.removeAll(); " không biên dịch được vì giao diện phiên không có phương thức tên đó. Lời gọi "session.getAttribute(“USER”).remove(); " sai hai lẽ: thứ trả về là một vật thể chung không có phương thức này, và khi chưa đăng nhập thì giá trị rỗng sẽ gây ngoại lệ con trỏ rỗng. Lời gọi "session.removeAttribute(“USER”); " chạy được nhưng chỉ bỏ một thuộc tính, phiên vẫn sống cùng các thuộc tính khác nên chưa phải đăng xuất dứt điểm. Dòng "
if(session.getAtriibute(“USER”)!=null) session.remove(“USER”);" dùng hai tên hàm không có trong giao diện phiên, lại viết sai chính tả, nên không biên dịch được. Lời gọi "session.remove(); " cũng vậy, không tồn tại trong giao diện phiên.
Đáp án đúng: "By
using annotations like @WebServlet(urlPatterns = {
"/example"
}) in the servlet.". Từ Servlet 3.0, container quét các lớp của ứng dụng lúc khởi động và đọc annotation để tự đăng ký servlet cùng mẫu URL, nên deployment descriptor chỉ còn là tuỳ chọn; đặt annotation ngay trên lớp kế thừa HttpServlet là đủ để yêu cầu tới đường dẫn đó được định tuyến vào servlet. "By configuring servlet mapping in a separate properties file." sai vì không có tệp properties nào được container đọc để dựng ánh xạ, tệp properties chỉ là dữ liệu mà mã nguồn tự đọc lấy. "By defining servlet mappings in the servlet class using the setMapping() method." sai vì HttpServlet không có phương thức nào tên như vậy, hơn nữa ánh xạ phải được container biết trước khi servlet được khởi tạo nên mã trong lớp không thể tự khai lúc chạy. "Servlet mapping without web.xml is not supported." sai vì annotation chính là cách làm được việc đó. "None of the others" sai vì đã tồn tại một cách đúng.
contextInitialized()contextCreated()initContext()initializeContext()