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 2/3 — câu 21–40.

Danh sách câu hỏi

40/50 câuCòn 10
Ajava.sql
Bjavax.jdbc
Corg.jdbc
Dcom.db.jdbc
Lời giải
Đáp án đúng: "java.sql". Toàn bộ lõi JDBC nằm trong gói này: lớp quản lý driver để mở kết nối, cùng các giao diện Connection, Statement, PreparedStatement, CallableStatement, ResultSet và lớp ngoại lệ SQLException; phần mở rộng phía máy chủ như DataSource và pool kết nối nằm ở gói javax.sql, nhưng câu hỏi nhắm vào gói cung cấp API JDBC thì đó chính là gói trong Java SE này. "javax.jdbc" không tồn tại; tiền tố javax chỉ đi với javax.sql cho phần mở rộng, không có gói nào mang tên như vậy. "org.jdbc" cũng không có trong thư viện chuẩn, tiền tố org thường thuộc các tổ chức bên thứ ba. "com.db.jdbc" là tên dựng theo kiểu gói riêng của một hãng; viết import như vậy thì trình biên dịch báo không tìm thấy ngay.
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 →
Areadonly
Bdisabled
Clocked
Dunchangeable
Lời giải
Đáp án đúng: "readonly". Thuộc tính này khoá việc sửa nội dung ô nhập nhưng ô vẫn nằm trong tập điều khiển được gửi đi, nên trình duyệt vẫn ghép tên và giá trị của nó vào dữ liệu biểu mẫu và phía servlet vẫn đọc được bằng getParameter; ô cũng vẫn nhận tiêu điểm và cho phép bôi đen, chép văn bản. "disabled" đạt nửa đầu yêu cầu vì ô không sửa được, nhưng ô bị loại khỏi dữ liệu gửi đi, do đó getParameter trả về null và giá trị mất hẳn, trái với điều câu hỏi đòi. "locked" không phải thuộc tính của HTML cho ô nhập, trình duyệt coi đó là thuộc tính lạ và bỏ qua, ô vẫn sửa được như thường. "unchangeable" cũng không có trong chuẩn, nó chỉ là một từ mô tả ý muốn chứ không có hiệu lực nào khi trang được dựng.
Mở trang câu hỏi này →
ATo specify the language of the formatted number
BTo define the number format pattern
CTo set the currency symbol
DTo set the time zone for the formatting
Lời giải
Đáp án đúng: "To define the number format pattern". Thuộc tính này nhận một mẫu định dạng số, chẳng hạn số chữ số thập phân, dấu phân nhóm hàng nghìn hay dạng phần trăm, và thẻ sẽ dựng bộ định dạng theo đúng mẫu đó thay cho mẫu mặc định của miền địa phương. Việc "To specify the language of the formatted number" do miền địa phương quyết định, khai bằng thẻ đặt miền hoặc thuộc tính riêng, chứ không phải bằng mẫu. Việc "To set the currency symbol" có thuộc tính riêng dành cho ký hiệu tiền tệ và chỉ có nghĩa khi kiểu định dạng là tiền tệ, nên không trùng vai với mẫu. Việc "To set the time zone for the formatting" thuộc nhóm thẻ định dạng ngày giờ, vì một con số thuần không mang thông tin múi giờ nào.
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 →
A<fmt:setTimeZone>
B<fmt:setLocale>
C<fmt:formatDate>
D<fmt:setBundle>
Lời giải
Đáp án đúng: "<fmt:formatDate>". Thẻ này nhận một đối tượng ngày giờ qua thuộc tính value rồi kết xuất thành chuỗi theo quy ước của locale đang có hiệu lực, chọn được phần nào để in và dạng dài ngắn qua type cùng dateStyle, hoặc tự ấn định khuôn qua pattern; nó là thẻ duy nhất trong nhóm thực sự sinh ra chữ trên trang. "<fmt:setTimeZone>" sai vì nó chỉ đặt múi giờ dùng cho các thẻ định dạng đứng sau, bản thân không in ra ngày nào. "<fmt:setLocale>" sai vì nó chỉ ấn định ngôn ngữ và quốc gia, tức chuẩn bị điều kiện cho thẻ định dạng chứ không kết xuất giá trị. "<fmt:setBundle>" sai vì nó nạp gói tài nguyên cho các thẻ lấy chuỗi đã dịch, không liên quan tới việc dựng chuỗi ngày giờ.
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 →
28Consider the code:4 lựa chọncó code
Đề bài
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
      response.getWriter().println("Hello, World!");      (*)
  }
}

Choose the correct statement.

AAfter line (*), you needs to close the resource to not throw an exception, because you created it on the response object.
BThe code (*) has a syntax error, because it does not use java.io.PrintWriter
CThe web container created this resource at line (*), so it is responsible for closing it.
DThe code (*) cannot print the plain text to the response body if you don't copy this code to the doPost() method.
Lời giải
Đáp án đúng: "The web container created this resource at line (*), so it is responsible for closing it.". Dòng in văn bản lấy bộ ghi từ chính đối tượng phản hồi, tức một tài nguyên do container cấp và gắn với vòng đời của phản hồi đó. Khi phương thức phục vụ kết thúc, container tự đẩy hết bộ nhớ đệm rồi chốt dòng ra, nên mã ứng dụng không cần và không nên tự đóng; đóng sớm còn chặn các mắt xử lý sau ghi thêm nội dung. Lựa chọn nói "you needs to close the resource to not throw an exception" vì thế sai hai chỗ: tài nguyên không do servlet tạo, và việc không đóng cũng chẳng sinh ngoại lệ. Lựa chọn cho rằng đoạn mã "has a syntax error, because it does not use" một tên lớp bộ ghi cụ thể cũng sai, bởi phương thức đã trả về đúng kiểu bộ ghi ký tự nên không cần khai thêm gì để biên dịch. Lựa chọn nói mã "cannot print the plain text to the response body" nếu không chép sang phương thức xử lý dữ liệu gửi lên thì lẫn vai hai phương thức: trình duyệt mở trang bằng GET nên bản doGet đã đủ.
Mở trang câu hỏi này →
AGET
BPOST
CPUT
DDELETE
Lời giải
Đáp án đúng: "POST". Theo chuẩn HTTP, đây là phương thức dành cho việc nộp dữ liệu để máy chủ xử lý: dữ liệu nằm trong thân yêu cầu, không bị giới hạn thực tế như phần truy vấn, có kiểu nội dung khai trong tiêu đề, và quan trọng nhất là không được coi là an toàn hay bất biến, nên mỗi lần gửi được hiểu là một lần tạo thêm tác dụng; trong servlet, container chuyển nó vào doPost. "GET" sinh ra để lấy tài nguyên, nó không nên đổi trạng thái máy chủ và còn bị trình duyệt cùng proxy lưu đệm, nên dùng để nộp dữ liệu sẽ gây gửi lặp khi người dùng tải lại trang. "PUT" cũng mang dữ liệu trong thân nhưng mang nghĩa đặt nguyên một tài nguyên vào địa chỉ đã biết và phải bất biến khi gọi lại, không phải nộp dữ liệu cho máy chủ tự quyết cách xử lý. "DELETE" dùng để yêu cầu xoá tài nguyên, và thẻ biểu mẫu trong HTML cũng không gửi được phương thức này.
Mở trang câu hỏi này →
ASession creation
BRequest handling
CContext initialization
DForm submission
ENone of the others
Lời giải
Đáp án đúng: "Context initialization". ServletContextListener là listener của phạm vi ứng dụng: contextInitialized() chạy một lần sau khi container dựng xong ServletContext và trước khi yêu cầu đầu tiên được phục vụ, contextDestroyed() chạy khi ứng dụng bị tháo, nên các việc như nạp cấu hình chung hay mở pool kết nối được đặt ở đây. "Session creation" là sự kiện của phạm vi phiên, do HttpSessionListener nghe qua sessionCreated(). "Request handling" thuộc phạm vi một yêu cầu, do ServletRequestListener hoặc chính servlet và filter xử lý, không phải việc của listener ứng dụng. "Form submission" là hành vi phía trình duyệt, tới server nó chỉ là một yêu cầu GET hay POST bình thường và không sinh ra sự kiện listener riêng nào. "None of the others" sai vì khởi tạo ngữ cảnh đúng là sự kiện mà giao diện này nghe.
Mở trang câu hỏi này →
AGenerating HTML code
BProcessing and responding to client requests
CManaging client-side scripts
DStoring user session data
Lời giải
Đáp án đúng: "Processing and responding to client requests". Trong mô hình khách và chủ, máy chủ web mở cổng chờ, nhận thông điệp yêu cầu HTTP, phân giải đường dẫn, chọn tài nguyên hoặc chuyển cho container xử lý, rồi dựng thông điệp phản hồi gồm dòng trạng thái, tiêu đề và thân để gửi lại; chu trình nhận rồi đáp đó là vai cốt lõi, các việc khác chỉ là biểu hiện của nó. "Generating HTML code" chỉ là một kết quả có thể có, vì máy chủ cũng trả ảnh, tệp kiểu dáng, dữ liệu JSON hay tệp tải về, và với trang tĩnh thì nó chỉ đọc tệp sẵn có chứ không sinh gì. "Managing client-side scripts" sai phía thực thi: mã kịch bản chỉ được gửi về như văn bản rồi do trình duyệt chạy, máy chủ không điều khiển nó. "Storing user session data" là việc của container servlet hoặc kho lưu trữ phía sau, và chỉ cần cho một số ứng dụng, không phải chức năng định nghĩa nên máy chủ web.
Mở trang câu hỏi này →
A<filter> and <filter-mapping>
B<filter-definition> and <filter-mapping>
C<filter> and <application-filter>
D<servlet-filter> and <filter-mapping>
Lời giải

Đáp án đúng: "<filter> and <filter-mapping> ". Khai một bộ lọc cần hai phần: phần tử đầu đặt tên bộ lọc rồi chỉ ra lớp hiện thực cùng tham số khởi tạo, phần tử sau nối tên đó với mẫu đường dẫn hoặc tên servlet mà bộ lọc phải chặn, và thứ tự các phần tử nối chính là thứ tự chuỗi bộ lọc chạy. Cặp "<filter-definition> and <filter-mapping> " dùng một tên phần tử không có trong lược đồ của mô tả triển khai, nên máy chủ báo lỗi ngay khi đọc tệp. Cặp "<filter> and <application-filter> " đúng nửa đầu nhưng nửa sau là tên tự đặt, không tồn tại, nên bộ lọc được khai mà chẳng gắn vào đường dẫn nào. Cặp "<servlet-filter> and <filter-mapping> " cũng vậy: phần tử khai báo bộ lọc không mang tiền tố servlet, lược đồ không nhận tên này.

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 →
34Which is true about JDBC?4 lựa chọn
AThe JDBC API is an extension of the ODBC API
BAll JDBC drivers are pure Java.
CJDBC is used to connect to MOM (Message-Oriented Middleware Product)
DThe JDBC API is included in J2SE
Lời giải
Đáp án đúng: "The JDBC API is included in J2SE". Các gói java.sql và javax.sql là thành phần của thư viện chuẩn Java bản nền, nên chỉ cần máy ảo Java là đã có Connection, Statement, ResultSet và DataSource; thứ phải thêm vào là driver của hệ quản trị cụ thể. Lựa chọn "The JDBC API is an extension of the ODBC API" nhầm quan hệ giữa hai bên: JDBC là API Java độc lập, chỉ vay cách tổ chức từ ODBC, còn cầu nối giữa chúng là một loại driver chứ không phải sự mở rộng. Lựa chọn "All JDBC drivers are pure Java." quá rộng: có những driver gọi xuống thư viện gốc của hệ quản trị hoặc đi qua cầu ODBC, chúng cần phần mềm cài kèm trên máy nên không thuần Java. Lựa chọn "JDBC is used to connect to MOM (Message-Oriented Middleware Product)" sai miền ứng dụng: trao đổi thông điệp qua hàng đợi là việc của API nhắn tin, còn JDBC nói chuyện với cơ sở dữ liệu quan hệ bằng SQL.
Mở trang câu hỏi này →
ATo include external JavaScript files.
BTo import Java packages and set page attributes.
CTo define the layout of the web page.
DTo include external CSS stylesheets.
Lời giải
Đáp án đúng: "To import Java packages and set page attributes.". Chỉ thị này nói chuyện với bộ dịch trang chứ không in ra gì cho máy khách: thuộc tính import thêm lệnh nhập gói vào lớp servlet được sinh ra, còn các thuộc tính khác đặt tính chất của trang như contentType, pageEncoding, session, errorPage, isELIgnored; tất cả có hiệu lực ở pha dịch, nên sửa xong phải để container dịch lại trang mới thấy thay đổi. "To include external JavaScript files." là việc của thẻ script trong phần đánh dấu HTML, chỉ thị trang không sinh thẻ nào. "To define the layout of the web page." thuộc phần HTML, hoặc thuộc kỹ thuật ghép trang bằng include và thẻ tuỳ biến, chứ không phải nhiệm vụ của chỉ thị này. "To include external CSS stylesheets." cũng là chuyện của thẻ link trong phần đầu tài liệu, nằm ngoài danh sách thuộc tính mà chỉ thị trang nhận.
Mở trang câu hỏi này →
AIt defines the servlet's initialization parameters
BIt maps a servlet to a URL pattern
CIt sets the servlet's session timeout
DIt specifies the servlet's version
Lời giải
Đáp án đúng: "It maps a servlet to a URL pattern". Trong bản mô tả triển khai, phần khai báo servlet gắn một tên logic với lớp xử lý, còn phần ghép servlet-mapping nối chính tên logic đó với một hay nhiều mẫu đường dẫn; khi request tới, container so đường dẫn với các mẫu theo luật khớp của đặc tả rồi chuyển cho servlet tương ứng. Thiếu phần ghép này thì lớp servlet vẫn tồn tại nhưng không có địa chỉ nào gọi tới nó. Lựa chọn "It defines the servlet's initialization parameters" nói về init-param nằm bên trong khai báo servlet, đọc bằng getInitParameter và không liên quan tới định tuyến. Lựa chọn "It sets the servlet's session timeout" thuộc phần cấu hình phiên, khai báo một lần cho cả ứng dụng. Lựa chọn "It specifies the servlet's version" không có trong phần tử này; con số phiên bản chỉ nằm ở thuộc tính của thẻ gốc web-app, cho biết đặc tả mà bản mô tả tuân theo.
Mở trang câu hỏi này →
ACookies
BWeb server
CApplication server
DDatabase server
Lời giải
Đáp án đúng: "Cookies". Dữ liệu phiên thật sự nằm phía máy chủ, nhưng thứ được giữ trên máy khách là mẩu dữ liệu nhỏ mà máy chủ gửi về rồi trình duyệt lưu lại và gửi kèm mỗi lượt yêu cầu sau đó, điển hình là mã định danh phiên; trong các lựa chọn, đây là thứ duy nhất nằm ở phía người dùng. Lựa chọn "Web server" nói về phía máy chủ: đối tượng phiên nằm trong bộ nhớ của tiến trình máy chủ web, người dùng không giữ bản nào. Lựa chọn "Application server" cũng ở phía máy chủ, là nơi container quản lý vòng đời và thời gian chờ của phiên. Lựa chọn "Database server" có thể được dùng để lưu bền hoặc nhân bản phiên trong hệ thống nhiều máy, nhưng đó vẫn là lưu trữ phía máy chủ, hoàn toàn không phải phía máy khách.
Mở trang câu hỏi này →
AdoGet
BdoPost
CdoFilter
Dservice
Einit
Lời giải
Đáp án đúng: "doFilter". Mọi bộ lọc đều phải hiện thực phương thức này vì đó là chỗ container trao cặp yêu cầu, phản hồi cùng tham chiếu chuỗi bộ lọc; cho chuỗi đi tiếp thì lượt yêu cầu đi sâu vào bộ lọc sau rồi tới servlet, còn không gọi thì bộ lọc chặn lại ngay. Phương thức "doGet" nằm trong servlet HTTP và chỉ chạy cho lượt yêu cầu dùng phương thức đọc, nó không có trong giao diện bộ lọc. Phương thức "doPost" cũng của servlet HTTP, dành riêng cho lượt gửi dữ liệu lên. Phương thức "service" là điểm vào của servlet, nơi phân nhánh theo phương thức HTTP, đứng sau toàn bộ chuỗi bộ lọc. Phương thức "init" có trong vòng đời bộ lọc nhưng mang thân mặc định nên không buộc phải viết lại, và nó chỉ chạy một lần lúc khởi tạo chứ không xử lý yêu cầu.
Mở trang câu hỏi này →
ATo define the structure of a web page.
BTo handle HTTP requests and responses.
CTo specify the default error page for the entire web application.
DTo map a specific HTTP error code to a designated error page.
Lời giải
Đáp án đúng: "To map a specific HTTP error code to a designated error page.". Trong mô tả triển khai, một khai báo trang lỗi nhận diện tình huống theo một trong hai lối: theo mã trạng thái hoặc theo kiểu ngoại lệ; phần tử được hỏi chính là lối thứ nhất, nó ghi một mã cụ thể rồi gắn mã đó với đường dẫn trang mà container sẽ chuyển tới khi phản hồi mang mã ấy. Mô tả "To define the structure of a web page." thuộc việc của HTML và trang hiển thị, không phải của cấu hình triển khai. Mô tả "To handle HTTP requests and responses." là việc của servlet; cấu hình chỉ nói cho container biết phải làm gì khi có lỗi, bản thân nó không xử lý lượt gọi nào. Mô tả "To specify the default error page for the entire web application." lại bỏ mất chính vai của mã lỗi: khai bao trùm cho cả ứng dụng thì phải nhận diện theo kiểu ngoại lệ chung, còn khai theo mã thì chỉ áp cho đúng mã đã ghi.
Mở trang câu hỏi này →
A<c:out>
B<c:display>
C<c:print>
D<c:value>
Lời giải
Đáp án đúng: "<c:out>". Thẻ này thuộc thư viện lõi của JSTL, lấy giá trị ở thuộc tính value, thường là một biểu thức EL, rồi ghi ra trang; điểm đáng dùng là mặc định nó thoát các ký tự đặc biệt của HTML, nên dữ liệu người dùng nhập có chứa dấu nhỏ hơn hay dấu ngoặc kép cũng không biến thành thẻ, nhờ đó chặn được lỗi chèn mã; ngoài ra còn thuộc tính default để in giá trị thay thế khi biểu thức rỗng hoặc null. "<c:display>" không có trong thư viện lõi, container tra bộ mô tả thư viện không thấy tên này nên trang lỗi ngay ở pha dịch. "<c:print>" nghe giống lệnh in của nhiều ngôn ngữ khác nhưng cũng không phải thẻ của JSTL. "<c:value>" trùng tên với thuộc tính value của thẻ hợp lệ, song bản thân nó không tồn tại như một thẻ; muốn in giá trị thì vẫn phải dùng thẻ kia hoặc viết thẳng biểu thức trong trang.
Mở trang câu hỏi này →