Tất cả câu hỏi

Ngân hàng câu hỏi trắc nghiệm có giải thích chi tiết.

440/11.885 câuCòn 11.445
Đề bài
public class MyServlet  extends HttpServlet {
        //… code
}
AdoGet()
BdoInit()
Cinit()
Dstart()
Lời giải
Đáp án đúng: "init()". Vòng đời servlet do web container điều khiển: sau khi nạp lớp và tạo đúng một thể hiện, container gọi init() một lần duy nhất để servlet chuẩn bị tài nguyên dùng lâu dài, rồi mới chuyển các yêu cầu vào service(); muốn chạy mã khởi tạo thì phải ghi đè đúng móc này, thường là bản không tham số hoặc bản nhận ServletConfig. "doGet()" không phải móc khởi tạo mà là nơi xử lý từng yêu cầu GET, nó được gọi lại mỗi lần người dùng truy cập nên đặt mã khởi tạo ở đó sẽ chạy lặp vô ích và còn dễ sinh tranh chấp giữa các luồng. "doInit()" không tồn tại trong HttpServlet lẫn giao diện Servlet, viết tên này chỉ tạo ra một phương thức thường, container không bao giờ gọi tới. "start()" là quy ước của luồng trong Java, không thuộc hợp đồng servlet, nên ghi đè cũng không có hiệu lực nào trong vòng đời do container quản.
Mở trang câu hỏi này →
AIndicates that the requested resource is not available.
BIndicates that the request requires HTTP authentication.
CIndicates an error inside the HTTP server which prevented it from fulfilling the request.
DIndicates that the HTTP server is temporarily overloaded, and unable to handle the request.
Lời giải
Đáp án đúng: "Indicates that the requested resource is not available.". Mã 404 thuộc nhóm lỗi phía client và có nghĩa server hiểu được yêu cầu nhưng không tìm thấy tài nguyên ứng với đường dẫn đó, thường do sai đường dẫn, sai mẫu ánh xạ servlet hoặc tệp không được đóng gói vào ứng dụng khi triển khai. Lựa chọn "Indicates that the request requires HTTP authentication." mô tả mã 401, tức là tài nguyên có thật nhưng đòi xác thực trước khi phục vụ. Lựa chọn "Indicates an error inside the HTTP server which prevented it from fulfilling the request." mô tả mã 500, lỗi bên trong server, thường là ngoại lệ chưa được bắt trong servlet. Lựa chọn "Indicates that the HTTP server is temporarily overloaded, and unable to handle the request." mô tả mã 503, server tạm thời không phục vụ được; cả ba đều nói về tình huống khác với việc không tìm thấy tài nguyên.
Mở trang câu hỏi này →
AWhen you want to speed up page loading
BWhen the user's browser blocks cookies
CWhen storing login information long-term
DWhen you don't need to maintain a session
Lời giải
Đáp án đúng: "When the user's browser blocks cookies". Cơ chế phiên mặc định dựa vào một cookie chứa định danh phiên, nên khi trình duyệt chặn cookie thì định danh không quay về server và mỗi lượt gọi lại sinh một phiên mới. Viết lại URL là lối thoát: cho mọi liên kết đi qua phương thức mã hoá đường dẫn của phần trả về để container nhúng định danh phiên vào chính đường dẫn, nhờ đó phiên vẫn theo được người dùng. Lựa chọn "When you want to speed up page loading" không có cơ sở, vì cách này làm đường dẫn dài hơn và buộc mã phải bọc mọi liên kết. Lựa chọn "When storing login information long-term" nhầm vai, phiên là trạng thái ngắn hạn sẽ hết khi quá thời gian chờ; muốn giữ lâu dài cần cookie có hạn dài hoặc lưu trong cơ sở dữ liệu. Lựa chọn "When you don't need to maintain a session" tự phủ định nhu cầu: không cần giữ phiên thì chẳng dùng cookie lẫn viết lại đường dẫn.
Mở trang câu hỏi này →
AIt matches any single character in the URL
BIt matches any URL that ends with a specific extension
CIt matches any URL under the web application root
DIt matches any URL
Lời giải
Đáp án đúng: "It matches any URL under the web application root". Mẫu gồm dấu gạch chéo kèm dấu sao là mẫu bao trọn đường dẫn: nó khớp mọi đường dẫn nằm trong phạm vi ngữ cảnh của ứng dụng, kể cả trang JSP, servlet và tài nguyên tĩnh, nên thường dùng cho filter cần thấy mọi lượt gọi. Lựa chọn "It matches any single character in the URL" nhầm dấu sao ở đây với ký tự đại diện cho một ký tự trong các mẫu tìm chuỗi; trong ánh xạ của servlet, dấu sao đứng sau dấu gạch chéo bao cả phần đường dẫn còn lại. Lựa chọn "It matches any URL that ends with a specific extension" mô tả loại mẫu khác, loại chỉ nêu đuôi tệp và chỉ khớp những đường dẫn kết thúc bằng đuôi đó. Lựa chọn "It matches any URL" thiếu đúng phần giới hạn quan trọng, vì ánh xạ chỉ có hiệu lực trong ngữ cảnh của ứng dụng này, request vào ứng dụng khác trên cùng server không bị khớp.
Mở trang câu hỏi này →
ATo chain multiple filters together
BTo filter multiple requests simultaneously
CTo maintain the order of filter execution
DTo manage session data
Lời giải
Đáp án đúng: "To chain multiple filters together". Đối tượng chuỗi filter do container truyền vào doFilter chính là thứ nối các filter thành một đường đi: gọi phương thức doFilter của nó đẩy request sang filter kế tiếp, và khi không còn filter nào thì nó gọi tới servlet hay tài nguyên đích; không gọi thì chuỗi đứt ngay tại đó và request không tới đích. Lựa chọn "To filter multiple requests simultaneously" nhầm sang chuyện đồng thời: mỗi request đi qua chuỗi riêng của nó, còn việc phục vụ nhiều request cùng lúc là do container quản luồng. Lựa chọn "To maintain the order of filter execution" nói về một hệ quả thứ cấp, vì thứ tự thực thi do khai báo ánh xạ filter trong mô tả triển khai quyết định chứ không do đối tượng này đặt ra, nó chỉ đi theo thứ tự đã có. Lựa chọn "To manage session data" nhầm hẳn vai, dữ liệu phiên nằm ở đối tượng phiên và không liên quan tới chuỗi filter.
Mở trang câu hỏi này →
AServletContextAttributeListener
BServletRequestListener
CHttpSessionListener
DServletContextListener
Lời giải
Đáp án đúng: "ServletContextAttributeListener". Giao diện này có ba callback ứng với ba thao tác lên thuộc tính của ngữ cảnh ứng dụng là thêm, thay thế và xoá, nên việc đặt một thuộc tính ở phạm vi ứng dụng sẽ kích hoạt callback thêm thuộc tính. Lựa chọn "ServletRequestListener" chỉ bắt mốc một request bắt đầu và kết thúc, nó không theo dõi thuộc tính nào ở phạm vi ứng dụng. Lựa chọn "HttpSessionListener" bắt việc tạo và huỷ phiên; muốn bắt thuộc tính thì phải dùng giao diện về thuộc tính của phiên, mà phạm vi khi đó cũng là phiên chứ không phải ngữ cảnh ứng dụng. Lựa chọn "ServletContextListener" đúng phạm vi nhưng sai loại sự kiện: nó chỉ được gọi khi ngữ cảnh ứng dụng được khởi tạo và khi bị huỷ, hai mốc đó không liên quan đến việc đặt thuộc tính.
Mở trang câu hỏi này →
ApageScope → requestScope → sessionScope → applicationScope
BapplicationScope → sessionScope → requestScope → pageScope
CsessionScope → pageScope → requestScope → applicationScope
DrequestScope → pageScope → sessionScope → applicationScope
Lời giải
Đáp án đúng: "pageScope → requestScope → sessionScope → applicationScope". Khi một biểu thức EL chỉ nêu tên mà không nêu phạm vi, trình đánh giá tìm từ phạm vi hẹp nhất ra rộng nhất và lấy giá trị đầu tiên gặp được; thứ tự này cho phép biến đặt trong trang tạm che biến cùng tên ở phạm vi rộng hơn, còn muốn chỉ đích danh thì viết tên phạm vi rồi tới tên biến. Lựa chọn "applicationScope → sessionScope → requestScope → pageScope" đảo ngược hoàn toàn, khiến biến dùng chung cho cả ứng dụng luôn thắng biến cục bộ của trang. Lựa chọn "sessionScope → pageScope → requestScope → applicationScope" đặt phạm vi phiên lên đầu, trong khi phiên rộng hơn cả trang lẫn request nên không thể được tìm trước. Lựa chọn "requestScope → pageScope → sessionScope → applicationScope" chỉ đảo hai bậc đầu nhưng vẫn sai, vì biến do thẻ set tạo mà không nêu phạm vi nằm ở phạm vi trang và phải được thấy trước tiên.
Mở trang câu hỏi này →
A. (dot)
B+ (plus)
C* (asterisk)
D: (colon)
Lời giải
Đáp án đúng: ". (dot)". Trong EL, dấu chấm đọc một thuộc tính của đối tượng hoặc một khoá của bảng ánh xạ: viết ${user.name} thì EL gọi phương thức đọc thuộc tính theo quy ước JavaBean, còn nếu đối tượng là bảng ánh xạ thì phần sau dấu chấm được dùng làm khoá. Lựa chọn "+ (plus)" là phép cộng số học trong EL, nó còn cố ép chuỗi về số nên đem dùng để truy cập thuộc tính sẽ gây lỗi kiểu. Lựa chọn "* (asterisk)" là phép nhân, cũng chỉ làm việc trên giá trị số chứ không đi vào cấu trúc đối tượng. Lựa chọn ": (colon)" không phải toán tử của EL; dấu hai chấm chỉ xuất hiện khi ngăn tiền tố thư viện thẻ với tên thẻ. Ngoài dấu chấm, EL còn cho dùng cặp ngoặc vuông kèm khoá dạng chuỗi, cách này cần khi tên khoá có dấu cách hoặc được tính ra lúc chạy.
Mở trang câu hỏi này →
AIncrease network performance
BTrack user activities
CLong-term data storage
DProtect data transmitted from client to server
Lời giải
Đáp án đúng: "Track user activities". HTTP không giữ trạng thái nên mỗi request về đến server là một lượt rời rạc; quản lý phiên gắn các lượt đó vào cùng một người dùng bằng một định danh phiên, nhờ vậy mới giữ được trạng thái đăng nhập, giỏ hàng hay bước đang làm dở khi người dùng đi qua nhiều trang. Lựa chọn "Increase network performance" không phải mục đích: giữ phiên còn tốn bộ nhớ trên server và thêm dữ liệu đi kèm mỗi lượt gọi. Lựa chọn "Long-term data storage" nhầm vai với cơ sở dữ liệu, vì phiên bị xoá khi quá thời gian chờ, khi mã gọi huỷ phiên hoặc khi server khởi động lại. Lựa chọn "Protect data transmitted from client to server" là việc của kênh truyền được mã hoá; bản thân phiên không che dữ liệu trên đường đi, và định danh phiên bị lấy còn là một rủi ro phải phòng.
Mở trang câu hỏi này →
430In a servlet, what does the following line do?4 lựa chọncó code
Đề bài
session.setAttribute("user", null);
AIt causes a session invalidation
BIt sets the "user" attribute to null without removing it
CIt throws a NullPointerException
DIt deletes the "user" attribute from the session
Lời giải
Đáp án đúng: "It deletes the "user" attribute from the session". Đặc tả servlet quy định gọi đặt thuộc tính với giá trị null có cùng tác dụng như gọi xoá thuộc tính, nên khoá đó bị lấy khỏi phiên và không còn xuất hiện trong danh sách tên thuộc tính; listener về thuộc tính của phiên cũng nhận sự kiện xoá chứ không nhận sự kiện thay giá trị. Lựa chọn "It causes a session invalidation" sai vì phiên vẫn sống với cùng định danh, chỉ lời gọi huỷ phiên mới kết thúc phiên và dọn hết thuộc tính. Lựa chọn "It sets the "user" attribute to null without removing it" là cách hiểu theo trực giác nhưng trái với quy định trên, vì không có khoá nào được giữ lại với giá trị rỗng. Lựa chọn "It throws a NullPointerException" sai vì truyền null vào đây là lời gọi hợp lệ và có nghĩa rõ ràng; đọc lại bằng phương thức lấy thuộc tính sẽ ra null đúng như khi khoá không tồn tại.
Mở trang câu hỏi này →
ALoading the appropriate JDBC driver
BEstablishing a database connection
CWriting SQL queries to manipulate data
DParsing HTML forms
Lời giải
Đáp án đúng: "Parsing HTML forms". Đọc dữ liệu người dùng gửi lên là việc của tầng servlet qua phương thức lấy tham số của request, vì container đã phân tích phần thân và phần truy vấn giúp ta; chuỗi công việc của JDBC chỉ bắt đầu khi đã có dữ liệu và ta muốn nói chuyện với cơ sở dữ liệu. Lựa chọn "Loading the appropriate JDBC driver" là bước thật, nạp lớp driver để nó tự đăng ký vào bộ quản lý driver. Lựa chọn "Establishing a database connection" cũng là bước thật, mở kết nối từ chuỗi kết nối hoặc lấy từ nguồn dữ liệu dùng chung. Lựa chọn "Writing SQL queries to manipulate data" là bước thật kế tiếp, phát câu lệnh qua đối tượng câu lệnh rồi đọc tập kết quả, nên cả ba đều nằm trong luồng JDBC.
Mở trang câu hỏi này →
Arequest
Bresponse
Csession
Dapplication
Lời giải
Đáp án đúng: "request". Đối tượng request đại diện cho lượt gọi của trình duyệt nên nó mang theo mọi thứ do trình duyệt gửi lên: các phương thức đọc header và danh sách tên header, phương thức lấy mảng cookie đi kèm, cùng tham số, phương thức HTTP và đường dẫn. Lựa chọn "response" đi chiều ngược lại, nó đặt header và thêm cookie để gửi về chứ không đọc được thứ trình duyệt gửi đến. Lựa chọn "session" chỉ giữ dữ liệu phía server gắn với một người dùng qua nhiều lượt gọi; nó dựa vào cookie định danh phiên nhưng không cho đọc header hay danh sách cookie. Lựa chọn "application" là phạm vi ngữ cảnh ứng dụng dùng để chia sẻ dữ liệu cho mọi người dùng, hoàn toàn không gắn với một lượt gọi HTTP cụ thể nào.
Mở trang câu hỏi này →
ADirect SQL commands
BJavaScript code
CArbitrary Java code
DHTML tags only
Lời giải
Đáp án đúng: "Arbitrary Java code". Scriptlet là khối mã mà pha dịch trang chép thẳng vào thân phương thức phục vụ của servlet sinh ra từ trang JSP, nên bên trong viết được câu lệnh Java tuỳ ý, dùng luôn các đối tượng ẩn như request hay luồng xuất, và cũng chính vì vậy nó trộn logic vào trang hiển thị. Lựa chọn "Direct SQL commands" sai vì câu lệnh SQL không tự chạy trong trang: muốn truy vấn vẫn phải viết mã Java gọi JDBC, nên SQL chỉ là chuỗi truyền cho tầng khác. Lựa chọn "JavaScript code" nhầm bên thực thi, vì mã đó nằm trong phần HTML gửi về và chạy ở trình duyệt, không phải nội dung của scriptlet chạy trên server. Lựa chọn "HTML tags only" nhầm sang phần khuôn trang vốn nằm ngoài scriptlet; nếu scriptlet chỉ chứa thẻ HTML thì nó chẳng để làm gì.
Mở trang câu hỏi này →
A<%@ page language="java" %>
B<%! private int count = 0; %>
C<%= "Hello World" %>
D<% int x = 10; %>
Lời giải

Đáp án đúng: "<%! private int count = 0; %>". Khối mở đầu bằng dấu chấm than là khai báo: nội dung của nó được đặt thành thành viên của lớp servlet sinh ra từ trang, nằm ngoài phương thức phục vụ, nên biến count tồn tại suốt đời thể hiện servlet và mọi lượt request dùng chung nó. Lựa chọn "<%@ page language="java" %>" là chỉ thị trang, nó cấu hình pha dịch trang chứ không khai báo thành viên nào. Lựa chọn "<%= "Hello World" %>" là biểu thức, giá trị của nó được tính rồi ghi thẳng ra luồng xuất, và đặt dấu chấm phẩy vào đó còn gây lỗi lúc dịch. Lựa chọn "<% int x = 10; %>" là scriptlet, mã bên trong rơi vào thân phương thức phục vụ nên biến ở đó chỉ là biến cục bộ, sinh lại ở mỗi request và không phải một khai báo.

Mở trang câu hỏi này →
AYou can freely call getWriter() or getOutputStream() without issues.
BYou should avoid setting content type, flushing, or resetting the buffer directly in JSP.
CIt cannot be used to send headers because JSPs block response modification.
DIt is a Tomcat-specific object, not part of the JSP specification.
Lời giải
Đáp án đúng: "You should avoid setting content type, flushing, or resetting the buffer directly in JSP.". Trang JSP được dịch thành servlet ghi nội dung qua luồng xuất có bộ đệm riêng do container quản, còn kiểu nội dung thì nên khai bằng chỉ thị trang; tự đặt kiểu nội dung, tự đẩy đệm hay xoá đệm giữa trang sẽ đụng với cơ chế đó, chẳng hạn đã đẩy đệm đi rồi mới chuyển tiếp hay xoá đệm thì gặp lỗi trạng thái không hợp lệ. Lựa chọn "You can freely call getWriter() or getOutputStream() without issues." sai vì trang đang dùng luồng ghi ký tự của JSP, xin thêm luồng ghi nhị phân là xung đột và bị báo lỗi trạng thái. Lựa chọn "It cannot be used to send headers because JSPs block response modification." sai vì vẫn đặt được header hay thêm cookie, miễn là phần đầu của phản hồi chưa bị gửi đi. Lựa chọn "It is a Tomcat-specific object, not part of the JSP specification." sai vì đây là một trong các đối tượng ẩn chuẩn của JSP, có trên mọi container.
Mở trang câu hỏi này →
Đề bài
public class HelloServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        response.getWriter().println("<h1>Hello from @WebServlet!</h1>");
    }
}
AIt configures cookies and sessions
BIt replaces the XML servlet declaration in web.xml
CIt disables servlet loading at startup
DIt defines the servlet’s security policy
Lời giải
Đáp án đúng: "It replaces the XML servlet declaration in web.xml". Annotation này mang đúng những thông tin mà trước đây phải viết thành khối khai báo servlet cộng khối ánh xạ servlet trong mô tả triển khai: thuộc tính name đặt tên servlet, thuộc tính mẫu URL nêu đường dẫn mà container sẽ gọi tới lớp này, nhờ vậy lớp trong ví dụ phục vụ được đường dẫn của nó mà không cần thêm dòng nào vào tệp cấu hình. Lựa chọn "It configures cookies and sessions" không thuộc phần việc của annotation này; cookie và phiên được tạo cùng đọc trong mã, còn thời gian chờ phiên khai ở mô tả triển khai. Lựa chọn "It disables servlet loading at startup" hiểu sai: việc nạp sớm do một thuộc tính riêng quyết định, ở ví dụ này thuộc tính đó không xuất hiện, và mặc định là nạp khi có request đầu tiên chứ không phải bị tắt. Lựa chọn "It defines the servlet’s security policy" là việc của annotation bảo mật riêng hoặc của khối ràng buộc bảo mật.
Mở trang câu hỏi này →
AOnly during the initialization phase.
BOnly during the destruction phase.
CWhenever a client sends a request to the servlet.
DAfter the init() method and before the destroy() method.
Lời giải
Đáp án đúng: "Whenever a client sends a request to the servlet.". Vòng đời servlet có ba mốc: container nạp lớp rồi gọi init một lần, gọi service cho từng request đến, và gọi destroy một lần trước khi tháo servlet. Chính service là điểm vào của mỗi lượt phục vụ, nó đọc phương thức HTTP của request rồi điều tới doGet, doPost hay phương thức tương ứng. Lựa chọn "Only during the initialization phase." nhầm service với init, mà init chạy một lần và không nhận request nào. Lựa chọn "Only during the destruction phase." nhầm sang destroy, thời điểm servlet đã ngừng phục vụ. Lựa chọn "After the init() method and before the destroy() method." nêu đúng khoảng thời gian mà service có thể được gọi, nhưng đó là điều kiện khung chứ không trả lời điều câu hỏi cần biết là cái gì kích hoạt lời gọi; trong khoảng ấy service chỉ chạy khi thực sự có request tới.
Mở trang câu hỏi này →
Amanifest.txt
Bsettings.xml
Cweb.xml
Dconfig.properties
Lời giải
Đáp án đúng: "web.xml". Tệp này nằm trong WEB-INF và là chỗ container tìm đến để lấy thông tin cấu hình cùng thông tin triển khai của ứng dụng: khai báo servlet và mẫu URL tương ứng, filter cùng thứ tự ánh xạ, listener, tham số ngữ cảnh, trang chào và thời gian chờ phiên. Lựa chọn "manifest.txt" không phải tệp cấu hình của ứng dụng web; siêu dữ liệu của một gói thư viện nằm trong tệp khác và cũng không khai báo servlet. Lựa chọn "settings.xml" là cấu hình của công cụ xây dựng trên máy lập trình viên, container không đọc nó lúc chạy. Lựa chọn "config.properties" chỉ là tệp tham số dạng khoá và giá trị do chính mã ứng dụng tự đọc, container không hiểu nó là mô tả triển khai nên không nạp servlet nào từ đó.
Mở trang câu hỏi này →
Aapplication.xml
Bweb.xml
Cconfig.xml
Dserver.xml
Lời giải
Đáp án đúng: "web.xml". Mô tả triển khai của một ứng dụng web được quy định mang tên web.xml và nằm trong thư mục WEB-INF; container đọc tệp này khi nạp ứng dụng để biết các servlet, filter, listener, trang lỗi và thời gian chờ phiên. Lựa chọn "application.xml" là mô tả triển khai ở mức gói ứng dụng doanh nghiệp gồm nhiều module, không phải tệp cấu hình của một ứng dụng web đơn lẻ. Lựa chọn "config.xml" không phải tên tệp nào được quy định, nên container không tìm đến nó và nội dung trong đó không có tác dụng. Lựa chọn "server.xml" là tệp cấu hình riêng của máy chủ ở mức toàn server, chứa khai báo cổng và vùng chứa ứng dụng, nên sửa nó là sửa cho mọi ứng dụng đang chạy chứ không phải sửa mô tả triển khai của một ứng dụng.
Mở trang câu hỏi này →
AMoves to first row
BReturns null
CThrows exception
DCloses the connection
Lời giải
Đáp án đúng: "Moves to first row". Ngay sau khi truy vấn trả về, con trỏ của tập kết quả nằm trước dòng đầu tiên, nên lần gọi next đầu tiên đẩy con trỏ xuống dòng đầu và trả về true nếu có dữ liệu, false nếu kết quả rỗng; đó là lý do mã đọc dữ liệu luôn mở bằng một lần gọi next hoặc một vòng lặp lấy next làm điều kiện. Lựa chọn "Returns null" sai kiểu: next trả về giá trị luận lý chứ không trả về đối tượng, còn giá trị từng cột mới lấy bằng các phương thức đọc theo tên hoặc số thứ tự cột. Lựa chọn "Throws exception" chỉ xảy ra khi tập kết quả hay câu lệnh đã bị đóng, không phải hành vi thường của lần gọi đầu. Lựa chọn "Closes the connection" nhầm hẳn vai: đóng kết nối là việc của lời gọi đóng, và chính vì next không đóng gì nên ta phải tự giải phóng tài nguyên sau khi đọc xong.
Mở trang câu hỏi này →