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 cuối kỳ số 4

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 3/3 — câu 41–50.

Danh sách câu hỏi

50/50 câuHết danh sách
Apublic void attributeDeleted(HttpSessionBindingEvent event)
Bpublic void removeAttribute(HttpSessionBindingEvent event)
Cpublic void attributeRemoved(HttpSessionBindingEvent event)
Dpublic void sessionInvalidate(HttpSessionEvent event)
Lời giải
Đáp án đúng: "public void attributeRemoved(HttpSessionBindingEvent event)". Giao diện HttpSessionAttributeListener định nghĩa ba móc cho thuộc tính của phiên là attributeAdded, attributeReplaced và attributeRemoved; cả ba nhận một HttpSessionBindingEvent, nhờ đó mã lắng nghe lấy được phiên, tên thuộc tính và giá trị vừa bị tháo khỏi phiên. "public void attributeDeleted(HttpSessionBindingEvent event)" dùng đúng kiểu sự kiện nhưng sai tên móc, nên container không bao giờ gọi tới. "public void removeAttribute(HttpSessionBindingEvent event)" lấy tên của hành động trên HttpSession, tức phương thức mà mã ứng dụng gọi để xoá thuộc tính, chứ không phải tên móc báo lại sự việc đó. "public void sessionInvalidate(HttpSessionEvent event)" sai cả tên lẫn kiểu đối số: móc theo vòng đời phiên nằm ở giao diện lắng nghe phiên với cặp sessionCreated và sessionDestroyed.
Mở trang câu hỏi này →
AScriptlet
BExpression
CDeclaration
DDirective
Lời giải
Đáp án đúng gồm hai ý: "Declaration" và "Directive". Trang JSP được bộ dịch của container biến thành một lớp servlet, và phần nào nằm trong thân phương thức _jspService() thì chạy lại mỗi lần có yêu cầu, phần nào nằm ngoài thì không. Khối khai báo "Declaration" viết bằng <%! %> trở thành trường và phương thức của chính lớp servlet sinh ra, tức nằm ngoài _jspService(), nên nó được nạp cùng lớp hoặc chỉ chạy khi có chỗ nào gọi tới. Còn "Directive" như chỉ thị page, include hay taglib là mệnh lệnh dành riêng cho pha dịch trang, nó chi phối cách sinh mã rồi biến mất, không để lại câu lệnh nào trong service. Ngược lại "Scriptlet" viết bằng <% %> được chép nguyên vào thân _jspService() nên thực thi theo từng yêu cầu, và "Expression" viết bằng <%= %> được dịch thành lệnh in giá trị ra luồng xuất cũng đặt trong _jspService(), vì vậy cả hai đều chạy ở pha phục vụ chứ không bị loại.
Mở trang câu hỏi này →
AexecuteUpdate()
BexecuteQuery()
CexecuteStatement()
DexecuteSQL()
Lời giải
Đáp án đúng: "executeQuery()". Với một câu SELECT, phương thức này của Statement hoặc PreparedStatement gửi câu lệnh xuống hệ quản trị rồi trả về một ResultSet, tức con trỏ cuộn qua các dòng kết quả để chương trình gọi next() và các getter lấy giá trị từng cột. Lựa chọn "executeUpdate()" tồn tại thật nhưng dành cho các câu làm thay đổi dữ liệu hay cấu trúc như INSERT, UPDATE, DELETE và DDL; nó trả về một số nguyên là số dòng bị ảnh hưởng, nên không có chỗ nào nhận được tập kết quả. Lựa chọn "executeStatement()" không hề có trong giao diện java.sql.Statement, gọi tới thì mã không biên dịch được. Lựa chọn "executeSQL()" cũng là tên tự đặt, không thuộc JDBC. Trong JDBC còn một phương thức thứ ba là execute(), nhưng nó chỉ trả về boolean cho biết kết quả đầu tiên có phải tập dòng hay không, rồi phải gọi thêm getResultSet() mới lấy được dữ liệu.
Mở trang câu hỏi này →
Đề bài
var="x" value="10" /> <c:set var="y" value="5" /> ${
  x + y
}

What is the incorrect output produced by the JSP page above?

A15
B10+5
C510
D105
Lời giải
Đáp án đúng: "15". Chỉ thị taglib đã nạp thư viện lõi nên hai thẻ đặt biến tạo ra hai biến phạm vi page mang chuỗi mười và năm; khi gặp biểu thức có toán tử cộng, Expression Language không nối chuỗi mà ép cả hai toán hạng về kiểu số rồi mới tính, vì vậy con số mà trang thực sự in ra là 15 và ba giá trị còn lại là những kết quả trang này không bao giờ sinh ra. "10+5" chỉ xuất hiện nếu biểu thức bị viết thành văn bản thuần, chẳng hạn thiếu cú pháp mở biểu thức, khi đó container in nguyên văn chứ không tính. "510" là kết quả của phép ghép chuỗi với thứ tự đảo lại, điều mà toán tử cộng của Expression Language không làm. "105" là kết quả ghép chuỗi theo đúng thứ tự hai biến, cũng chỉ xảy ra nếu dùng toán tử nối chuỗi của Java trong một đoạn mã nhúng thay vì toán tử cộng của Expression Language.
Mở trang câu hỏi này →
Aweb.xml
Bcontext.xml
Cindex.html
DMETA-INF/MANIFEST.MF
Lời giải
Đáp án đúng: "context.xml". Khi triển khai, tham số kết nối cơ sở dữ liệu thường được khai thành một tài nguyên trong tệp này: thẻ mô tả ngữ cảnh của ứng dụng chứa khai báo tài nguyên kiểu DataSource với địa chỉ, tên người dùng, mật khẩu và thông số pool, rồi mã Java tra tài nguyên đó qua JNDI; nhờ vậy đổi máy chủ hay đổi mật khẩu chỉ cần sửa tệp cấu hình chứ không biên dịch lại ứng dụng. "web.xml" là bộ mô tả triển khai, nơi khai servlet, filter, listener và trang chào; nó có thể khai một tham chiếu tới tài nguyên, nhưng giá trị kết nối thật của từng môi trường không nằm ở đây. "index.html" chỉ là một trang tĩnh, không mang cấu hình nào. "META-INF/MANIFEST.MF" là tệp kê khai siêu dữ liệu của gói, dùng khai phiên bản hay classpath, không phải nơi đặt thông tin kết nối.
Mở trang câu hỏi này →
Arequest
Bresponse
Csession
Dapplication
Lời giải
Đáp án đúng: "request". Đối tượng ẩn này do container truyền vào mỗi lượt gọi trang, đại diện cho chính lượt yêu cầu của máy khách, nhờ đó trang đọc được tham số, tiêu đề, phương thức HTTP và cả những thuộc tính mà servlet đặt vào trước khi chuyển tiếp sang trang. Đối tượng "response" đi cùng nhưng ở chiều ngược lại: nó dùng để đặt kiểu nội dung, tiêu đề và ghi dữ liệu trả về cho máy khách. Đối tượng "session" đại diện cho phiên làm việc của một người dùng, sống qua nhiều lượt yêu cầu, nên không phải hình ảnh của một lượt gọi cụ thể. Đối tượng "application" ứng với ngữ cảnh của cả ứng dụng, dùng chung cho mọi người dùng và mọi lượt gọi, là phạm vi rộng nhất trong các đối tượng ẩn của trang.
Mở trang câu hỏi này →
A${user.name}
B${user:getName()}
C${user->name}
D${user.["name"]}
Lời giải
Đáp án đúng: "${user.name}". Trong Expression Language, dấu chấm là toán tử truy cập thuộc tính theo quy ước JavaBean: bộ xử lý EL thấy tên name thì tự tìm và gọi phương thức getName() của đối tượng user, nên viết ngắn mà vẫn đọc đúng trường private. Lựa chọn "${user:getName()}" dùng dấu hai chấm, nhưng trong EL dấu này chỉ đứng giữa tiền tố thư viện thẻ và tên hàm đã khai báo ở tệp mô tả thẻ, không dùng để gọi phương thức của một bean. Lựa chọn "${user->name}" đưa mũi tên vào, trong khi EL không có toán tử ấy cho việc truy cập thuộc tính, nên trang báo lỗi cú pháp ngay khi dịch. Lựa chọn "${user.["name"]}" trộn hai cách viết: muốn dùng ngoặc vuông thì phải viết ${user["name"]} không có dấu chấm ở giữa, còn đã có dấu chấm thì phải nêu tên thuộc tính trực tiếp chứ không bọc trong ngoặc vuông.
Mở trang câu hỏi này →
ATo redirect the client to another web page
BTo forward the request to another resource
CTo handle HTTP POST requests
DTo handle form submissions
Lời giải
Đáp án đúng: "To forward the request to another resource". Cơ chế này chuyển quyền xử lý sang một tài nguyên khác ngay trong cùng một chu trình phục vụ: lấy đối tượng điều phối theo đường dẫn đích rồi gọi forward, trang đích nhận đúng cặp request và response đang có, nên địa chỉ trên trình duyệt không đổi và mọi dữ liệu gắn bằng setAttribute vẫn đọc được bên kia; đó chính là mối nối giữa servlet và JSP trong kiến trúc MVC, và giao diện này còn có include để nhúng kết quả của tài nguyên khác vào phản hồi đang soạn. "To redirect the client to another web page" là việc của sendRedirect: nó trả mã chuyển hướng để trình duyệt tự đi tới địa chỉ mới bằng một yêu cầu khác, không phải chuyển tiếp trong máy chủ. "To handle HTTP POST requests" là nhiệm vụ của doPost trong lớp servlet. "To handle form submissions" là việc servlet đọc dữ liệu biểu mẫu bằng getParameter rồi xử lý, không liên quan tới việc điều phối giữa các tài nguyên.
Mở trang câu hỏi này →
AString getInitializedParameter(String name)
BString getInitParameter(String name)
CString getContextParameter(String name)
DString getBoolParameter(String name)
Lời giải
Đáp án đúng: "String getInitParameter(String name)". Cả ServletConfig và ServletContext đều khai getInitParameter(String) trả về String, đọc giá trị khai trong phần tử init-param của một servlet hoặc trong context-param dùng chung cho toàn ứng dụng; mọi tham số khởi tạo đều là văn bản nên kiểu trả về luôn là String, muốn số thì phải tự chuyển kiểu, và phương thức đi kèm để liệt kê tên là getInitParameterNames(). "String getInitializedParameter(String name)" sai tên vì đặc tả dùng dạng viết tắt Init, container không có phương thức nào tên như vậy nên lời gọi sẽ không biên dịch được. "String getContextParameter(String name)" sai vì đổi phạm vi không đổi tên phương thức, tham số của toàn ứng dụng vẫn đọc bằng getInitParameter() nhưng gọi trên ServletContext. "String getBoolParameter(String name)" sai hai chỗ: không có phương thức này và tham số khởi tạo không hề có biến thể theo kiểu dữ liệu.
Mở trang câu hỏi này →
Aapplication
Bsession
Cresponse
Drequest
Epage
Lời giải
Đáp án đúng: "response". JSP chỉ có bốn phạm vi lưu thuộc tính, xếp từ hẹp tới rộng là page, request, session và application; mỗi phạm vi ứng với một vùng nhớ có cặp setAttribute cùng getAttribute để các trang chia sẻ dữ liệu. Đối tượng response kiểu HttpServletResponse là đối tượng ẩn dùng để ghi nội dung trả về, đặt tiêu đề và mã trạng thái, chứ không phải vùng nhớ thuộc tính, nên nó không nằm trong danh sách phạm vi. Lựa chọn "application" chính là phạm vi rộng nhất, gắn với ServletContext và sống suốt thời gian ứng dụng được triển khai. Lựa chọn "session" là phạm vi theo phiên của từng người dùng, tồn tại qua nhiều yêu cầu. Lựa chọn "request" là phạm vi một lượt yêu cầu, vẫn còn giá trị sau khi forward sang trang khác. Lựa chọn "page" hẹp nhất, do pageContext giữ và mất ngay khi trang kết thúc.
Mở trang câu hỏi này →