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ố 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 đề.

Danh sách câu hỏi

20/49 câuCòn 29
1How would you use this custom tag in a JSP page?4 lựa chọncó code
Đề bài
public class MyCustomTagHandler extends SimpleTagSupport {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public void doTag() throws JspException, IOException {
        JspWriter out = getJspContext().getOut();
        out.println(message);
    }
}
A<my:customTag message="Hello World" />
B<custom:MyCustomTag message="Hello World" />
C<my:MyCustomTag message="Hello World" />
D<c:MyCustomTag message="Hello World" />
Lời giải
Đáp án đúng: "<my:MyCustomTag message="Hello World" />". Lớp kế thừa SimpleTagSupport chỉ là trình xử lý thẻ; cú pháp gọi thẻ trên trang JSP do hai thứ quyết định là tiền tố khai trong chỉ thị taglib và tên thẻ đăng ký trong tệp mô tả thư viện, mà tên ấy ở đây lấy theo chính lớp xử lý MyCustomTagHandler, còn thuộc tính message truyền được nhờ đã có phương thức setMessage tương ứng. Cách viết "<my:customTag message="Hello World" />" không khớp vì tên thẻ phân biệt chữ hoa chữ thường, viết thường chữ đầu là một tên khác hẳn. Cách viết "<custom:MyCustomTag message="Hello World" />" dùng tiền tố custom chưa được khai báo trong trang, mà tiền tố là do người viết trang tự đặt khi nạp thư viện chứ không tự có. Cách viết "<c:MyCustomTag message="Hello World" />" lấy tiền tố quy ước của thư viện JSTL lõi, nơi không hề có thẻ nào mang tên MyCustomTag.
Mở trang câu hỏi này →
2How can Session Tracking be done?4 lựa chọn
ACookie
BURL Rewriting
CHidden Form Field
DAll of the above
Lời giải
Đáp án đúng: "All of the above". HTTP không giữ trạng thái, nên mọi cách theo dõi phiên đều phải gắn thêm một mã định danh vào từng lượt yêu cầu, và cả ba cách nêu trong câu đều làm được việc đó: container mặc định đặt cookie mang mã phiên, khi trình duyệt chặn cookie thì chuyển sang viết lại địa chỉ, còn mã của trang có thể tự mang mã định danh qua trường ẩn trong biểu mẫu. Nêu riêng "Cookie" thì chỉ kể cơ chế mặc định và bỏ mất hai cách còn lại, nên chưa trả lời trọn câu được hỏi. Nêu riêng "URL Rewriting" cũng vậy: đó là lối dự phòng khi cookie bị tắt, dùng hàm mã hoá địa chỉ để chèn mã phiên vào đường dẫn. Nêu riêng "Hidden Form Field" lại hẹp hơn nữa vì chỉ giữ được trạng thái khi người dùng gửi biểu mẫu, không áp dụng cho liên kết thường. Mỗi cách chỉ là một phần, nên lựa chọn gộp cả ba mới đúng tầm câu hỏi.
Mở trang câu hỏi này →
APresentation layer
BData access layer
CBusiness logic layer
DData storage layer
Lời giải
Đáp án đúng: "Business logic layer". Trong kiến trúc nhiều tầng, tầng nghiệp vụ là nơi đặt quy tắc và quy trình của bài toán: kiểm tra điều kiện, tính toán, quyết định luồng xử lý, rồi gọi xuống tầng truy xuất dữ liệu khi cần. Tầng "Presentation layer" chỉ lo nhận dữ liệu nhập và trình bày kết quả, tương ứng với servlet điều phối và trang JSP, nên không được chứa quy tắc nghiệp vụ. Tầng "Data access layer" đóng gói cách nói chuyện với cơ sở dữ liệu qua các lớp truy xuất và câu lệnh JDBC; nó biết lấy dữ liệu ở đâu chứ không quyết định dữ liệu đó có hợp lệ về nghiệp vụ hay không. Tầng "Data storage layer" là bản thân hệ quản trị cơ sở dữ liệu, chỉ lưu và trả dữ liệu; ràng buộc ở mức này là ràng buộc toàn vẹn của bảng, không phải quy tắc nghiệp vụ của ứng dụng.
Mở trang câu hỏi này →
AJDBC is used to create dynamic web pages.
BJDBC is a protocol for transferring data between web servers and browsers.
CJDBC is a standard Java API for interacting with databases.
DJDBC is a web server for serving Java applications.
Lời giải
Đáp án đúng: "JDBC is a standard Java API for interacting with databases.". Đây là tập giao diện chuẩn gồm kết nối, câu lệnh và tập kết quả để mã Java mở kết nối, gửi lệnh SQL rồi đọc dữ liệu trả về; phần phụ thuộc hệ quản trị được tách ra trình điều khiển, nhờ vậy đổi cơ sở dữ liệu thì đổi driver và chuỗi kết nối chứ không viết lại mã. Mệnh đề "JDBC is used to create dynamic web pages." gán cho nó việc của servlet và JSP; nó không sinh ra một dòng HTML nào. Mệnh đề "JDBC is a protocol for transferring data between web servers and browsers." nhầm sang HTTP, vốn mới là giao thức giữa trình duyệt và máy chủ web, còn thư viện này nằm hẳn phía máy chủ. Mệnh đề "JDBC is a web server for serving Java applications." lại nhầm nó với container như Tomcat: nó chỉ là thư viện bên trong ứng dụng, không lắng nghe cổng và không tiếp nhận yêu cầu nào.
Mở trang câu hỏi này →
A.jar
B.exe
C.war
D.zip
Lời giải
Đáp án đúng: ".war". Ứng dụng web Java được đóng thành gói lưu trữ web, bên trong có thư mục WEB-INF cùng mô tả triển khai, và container như Tomcat chỉ nhận dạng rồi tự bung đúng loại gói này thành một ngữ cảnh web có đường dẫn riêng. Đuôi ".jar" dùng cho thư viện hoặc ứng dụng Java thường, không mang cấu trúc WEB-INF nên máy chủ không triển khai nó như một ứng dụng web. Đuôi ".exe" là tệp thực thi của Windows, không chạy trên máy ảo Java và chẳng liên quan tới việc triển khai. Đuôi ".zip" chỉ là định dạng nén chung: gói web thực chất cũng là tệp nén, nhưng phải mang đúng đuôi quy định cùng cấu trúc bắt buộc thì máy chủ mới hiểu, đổi sang đuôi nén thường là máy chủ bỏ qua.
Mở trang câu hỏi này →
AService Layer
BModel
CView
DController
Lời giải
Đáp án đúng: "Service Layer". Khuôn mẫu MVC chỉ định nghĩa ba vai: nơi giữ dữ liệu cùng quy tắc, nơi hiển thị và nơi tiếp nhận yêu cầu rồi điều phối. Tầng dịch vụ là quy ước tổ chức mã bổ sung, rất hay gặp trong các khung lớn và có ích khi tách nghiệp vụ, nhưng không thuộc định nghĩa của khuôn mẫu, nên nó chính là thứ cần chọn cho câu hỏi tìm thành phần không thuộc. "Model" là một trong ba vai, giữ dữ liệu và trạng thái nghiệp vụ. "View" cũng là một vai, sinh giao diện trả về cho người dùng, trong Java web thường là trang JSP. "Controller" là vai thứ ba, thường do servlet đảm nhiệm: nhận yêu cầu, gọi xử lý rồi chọn khung hiển thị. Ba thứ đó có tên ngay trong tên gọi của khuôn mẫu nên không thể là đáp án.
Mở trang câu hỏi này →
AAn object representing a single servlet instance
BAn interface for interacting with the client's web browser
CAn object representing the entire web application
DA mechanism for managing session data
Lời giải
Đáp án đúng: "An object representing the entire web application". Mỗi ứng dụng web khi được triển khai có đúng một ngữ cảnh servlet, dùng chung cho mọi servlet trong ứng dụng: đọc tham số khởi tạo của toàn ứng dụng, chia sẻ thuộc tính ở phạm vi ứng dụng, tra đường dẫn thật trên đĩa và ghi log. Mô tả "An object representing a single servlet instance" ứng với vật thể cấu hình gắn riêng một servlet, vốn chỉ thấy tham số khởi tạo khai cho servlet đó. Mô tả "An interface for interacting with the client's web browser" ứng với cặp yêu cầu và phản hồi của từng lượt gọi, vì ngữ cảnh ứng dụng không biết gì về một trình duyệt cụ thể. Mô tả "A mechanism for managing session data" ứng với phiên làm việc, thứ tồn tại một bản cho mỗi người dùng chứ không phải một bản cho cả ứng dụng.
Mở trang câu hỏi này →
ATo define custom tag libraries
BTo declare variables and execute Java code
CTo include external resources like CSS and JavaScript
DTo define servlet mappings
Lời giải
Đáp án đúng: "To declare variables and execute Java code". Mã nằm trong cặp dấu scriptlet được trình dịch JSP đặt thẳng vào thân phương thức phục vụ của servlet sinh ra từ trang, nên nó khai báo biến cục bộ và chạy câu lệnh Java ngay lúc trang phục vụ một lượt yêu cầu. Việc "To define custom tag libraries" thuộc tệp mô tả thư viện thẻ cùng chỉ thị taglib, không phải việc của scriptlet. Việc "To include external resources like CSS and JavaScript" do chính phần HTML của trang làm bằng thẻ liên kết hoặc thẻ nhúng script, nằm hoàn toàn ngoài khối mã Java. Việc "To define servlet mappings" được khai trong mô tả triển khai hoặc bằng chú giải trên lớp servlet, là chuyện cấu hình lúc triển khai chứ không phải mã chạy trong trang.
Mở trang câu hỏi này →
A/WEB-INF/classes/
B/WEB-INF/lib/
C/Web-Pages/
D/META-INF/
Lời giải
Đáp án đúng: "/Web-Pages/". Thư mục này là gốc nội dung web của ứng dụng: mọi thứ đặt ở đây đều được máy chủ phục vụ trực tiếp theo đường dẫn tương ứng, nên trang JSP, trang HTML, tệp định kiểu và tệp script dùng cho giao diện đều nằm trong đó. Thư mục "/WEB-INF/classes/" chứa lớp đã biên dịch của ứng dụng và nằm trong đường nạp lớp, lại bị container che nên trình duyệt không truy cập trực tiếp được. Thư mục "/WEB-INF/lib/" chỉ dành cho thư viện đóng gói dạng jar và cũng bị che như vậy. Thư mục "/META-INF/" giữ siêu dữ liệu của gói, ví dụ tệp kê khai hay cấu hình ngữ cảnh riêng của máy chủ, nên cũng không phải nơi đặt tài nguyên hiển thị.
Mở trang câu hỏi này →
A<c:if>
B<c:choose>
C<c:when>
D<c:otherwise>
Lời giải
Đáp án đúng: "<c:if>". Thẻ này nhận một thuộc tính kiểm tra là biểu thức luận lý, EL tính ra đúng hoặc sai, rồi thân thẻ chỉ được dựng ra kết quả khi giá trị là đúng; đó là dạng rẽ nhánh một nhánh, không có phần ngược lại. Thẻ "<c:choose>" tự nó không mang biểu thức nào, chỉ làm vỏ chứa các nhánh con, nên không trực tiếp quyết định hiển thị. Thẻ "<c:when>" có mang biểu thức nhưng chỉ hợp lệ khi nằm trong thẻ vỏ rẽ nhiều nhánh, và cả nhóm chạy theo lối chọn nhánh đầu tiên khớp chứ không phải kiểm một điều kiện độc lập. Thẻ "<c:otherwise>" là nhánh dự phòng khi mọi nhánh trước đều không khớp, bản thân nó không nhận biểu thức luận lý nào.
Mở trang câu hỏi này →
ATo play a game of catch.
BTo store data in a session.
CTo deal with errors that happen when the JSP page is running.
DTo capture user input.
Lời giải
Đáp án đúng: "To deal with errors that happen when the JSP page is running.". Thẻ này bọc một đoạn trang, bắt ngoại lệ phát sinh khi đoạn đó thực thi và đặt vật thể ngoại lệ vào biến nêu ở thuộc tính lưu, nhờ vậy trang không ném lỗi ra ngoài mà tự xử lý tiếp, thường kèm một thẻ kiểm xem biến đó có giá trị hay không. Diễn giải "To play a game of catch." chỉ là lối chơi chữ theo nghĩa thông thường của từ, không có liên hệ nào với thư viện thẻ. Diễn giải "To store data in a session." là việc của thẻ gán giá trị với phạm vi phiên, không phải của thẻ bắt lỗi. Diễn giải "To capture user input." thuộc về biểu mẫu HTML cùng các tham số đọc qua EL, cũng nằm ngoài vai trò xử lý ngoại lệ.
Mở trang câu hỏi này →
Aname
Bclass
Cbody-content
Ddescription
Lời giải
Đáp án đúng: "name". Trong tệp mô tả thư viện thẻ, phần tử khai báo một thẻ dùng thuộc tính con này để đặt tên mà trang JSP sẽ gọi sau tiền tố, nên chính nó quyết định cú pháp người viết trang nhìn thấy. Thuộc tính "class" không phải phần tử dùng ở đây: lớp xử lý thẻ được chỉ bằng phần tử tag-class, và nó trả lời câu hỏi mã nào chạy, không phải thẻ tên gì. Thuộc tính "body-content" khai thân thẻ thuộc loại nào, chẳng hạn rỗng, chỉ chứa nội dung không có mã, hay do chính thẻ tự diễn giải, nên nó mô tả hình dạng thân chứ không đặt tên. Thuộc tính "description" chỉ là phần văn bản giải thích cho người đọc và công cụ sinh tài liệu, không ảnh hưởng tới cách gọi thẻ.
Mở trang câu hỏi này →
A<jsp:include>
B<jsp:plugin>
C<jsp:useBean>
D<jsp:setProperty>
Lời giải
Đáp án đúng: "<jsp:include>". Hành động chuẩn này được dịch thành lời gọi bộ điều phối ngay lúc trang đang phục vụ yêu cầu, nên tài nguyên đích được chạy và kết quả của nó mới được ghép vào phản hồi; nhờ vậy nội dung chèn luôn mới theo từng lượt gọi, khác với chỉ thị ghép mã nguồn một lần lúc dịch trang. Thẻ "<jsp:plugin>" sinh ra đoạn mã nhúng để trình duyệt nạp applet hoặc bean phía máy khách, không dùng để chèn tài nguyên của máy chủ. Thẻ "<jsp:useBean>" chỉ định vị hoặc khởi tạo một đối tượng Java trong phạm vi đã chọn, không sinh nội dung chèn. Thẻ "<jsp:setProperty>" gán giá trị cho thuộc tính của bean vừa khai báo, cũng không liên quan tới việc nạp thêm tài nguyên.
Mở trang câu hỏi này →
ARemove each attribute from the session manually
BCall session.invalidate() and then redirect to login
CSet session timeout to zero and reload the page
DDelete the session cookie only from the client side
Lời giải
Đáp án đúng: "Call session.invalidate() and then redirect to login". Huỷ phiên làm container xoá đối tượng phiên phía máy chủ và vô hiệu mã định danh, nên mã cũ còn trong trình duyệt cũng không mở lại được dữ liệu; chuyển hướng sau đó buộc trình duyệt tạo lượt yêu cầu mới tới trang đăng nhập. Cách "Remove each attribute from the session manually" chỉ dọn từng thuộc tính, phiên vẫn sống và vẫn nhận tiếp dữ liệu mới với đúng mã định danh đó. Cách "Set session timeout to zero and reload the page" không dọn phiên ngay tại lúc đăng xuất mà phụ thuộc cách container hiểu giá trị không dương. Cách "Delete the session cookie only from the client side" chỉ xoá dấu vết ở máy khách, còn phiên trên máy chủ vẫn hiệu lực cho ai giữ được mã định danh.
Mở trang câu hỏi này →
Aauto-commit on
Bauto-commit off
Cmanual-commit
DNo transaction by default
Lời giải
Đáp án đúng: "auto-commit on". Theo đặc tả JDBC, kết nối mới mở ở chế độ tự chốt: mỗi câu lệnh chạy xong là được chốt ngay thành một giao dịch riêng, nên muốn gộp nhiều câu lệnh thành một đơn vị không chia cắt thì phải tự tắt chế độ đó rồi gọi chốt hoặc hoàn tác bằng tay. Chế độ "auto-commit off" chỉ có khi mã gọi hàm đặt chế độ tự chốt với giá trị sai, tức là trạng thái do người lập trình chủ động đặt, không phải trạng thái ban đầu. Tên gọi "manual-commit" chính là cách nói khác của việc tự chốt bằng tay sau khi đã tắt chế độ mặc định, nên cũng không phải điều kết nối nhận được lúc mới mở. Nhận định "No transaction by default" không đúng vì không có câu lệnh nào chạy ngoài giao dịch: ở chế độ mặc định mỗi câu lệnh vẫn là một giao dịch, chỉ rất ngắn và được chốt tự độ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 →
ATo make the page load faster; set in the doGet() method
BTo ensure compatibility with HTTP 1.1; set in web.xml only
CTo correctly display special characters and support localization; commonly set in the JSP page directive with contentType
DTo enable white box testing of JSP pages; set in the init() method
Lời giải
Đáp án đúng: "To correctly display special characters and support localization; commonly set in the JSP page directive with contentType". Bảng mã quyết định cách chuỗi byte được diễn giải thành ký tự, nên khai UTF-8 là cách để chữ có dấu và các hệ chữ khác hiện đúng; chỗ khai quen dùng là chỉ thị page của trang, nơi vừa đặt kiểu nội dung trả về kèm bảng mã, vừa đặt bảng mã dùng lúc dịch trang. Lý do "To make the page load faster; set in the doGet() method" sai cả hai nửa: bảng mã không làm trang tải nhanh hơn, và phương thức phục vụ của servlet không phải nơi khai bảng mã cho trang JSP. Lý do "To ensure compatibility with HTTP 1.1; set in web.xml only" cũng không ổn vì giao thức không đòi một bảng mã cụ thể, còn mô tả triển khai chỉ là một nơi khai thêm, không phải nơi duy nhất. Lý do "To enable white box testing of JSP pages; set in the init() method" lạc hẳn đề: kiểm thử hộp trắng chẳng liên quan tới bảng mã ký tự.
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 →
AdoFilter
Bservice
Cexecute
DinitFilter
Lời giải
Đáp án đúng: "doFilter". Giao diện bộ lọc đặt toàn bộ phần việc chặn tại phương thức này: nó nhận cặp yêu cầu, phản hồi và tham chiếu chuỗi bộ lọc, làm việc trước khi cho chuỗi đi tiếp, rồi còn có thể làm thêm việc sau khi lượt gọi quay về; không cho chuỗi đi tiếp thì lượt yêu cầu dừng ngay tại đó. Phương thức "service" thuộc servlet, là nơi container đẩy yêu cầu vào sau khi mọi bộ lọc đã cho qua, nên không nằm trong giao diện bộ lọc. Phương thức "execute" không có trong giao diện này, đó là tên quen thuộc ở các khung khác chứ không phải phần của đặc tả servlet. Phương thức "initFilter" là tên sai: vòng đời bộ lọc dùng hàm khởi tạo nhận cấu hình và hàm dọn khi tháo, mà hai hàm đó lại có thân mặc định nên không buộc phải viết.
Mở trang câu hỏi này →
A200
B404
C500
D201
Lời giải
Đáp án đúng: "200". Mã này nghĩa là máy chủ đã nhận, hiểu và xử lý xong lượt yêu cầu, thân phản hồi chứa nội dung được yêu cầu; với servlet thì đây là mã mặc định khi mã lệnh không tự đặt mã trạng thái khác và không ném ngoại lệ ra ngoài. Mã "404" nói máy chủ chạy bình thường nhưng không có tài nguyên ứng với đường dẫn, thường do sai ánh xạ servlet hoặc sai tên trang. Mã "500" báo lỗi phát sinh phía máy chủ, trong ứng dụng Java web thường là một ngoại lệ không được bắt thoát ra khỏi servlet hay trang JSP. Mã "201" cũng thuộc nhóm thành công nhưng mang nghĩa đã tạo mới một tài nguyên, nên nó gắn với lượt gửi dữ liệu lên chứ không phải lượt đọc bằng phương thức GET.
Mở trang câu hỏi này →