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 thi lại số 1

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

Danh sách câu hỏi

20/50 câuCòn 30
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 request requires HTTP authentication.". Mã 401 thuộc nhóm 4xx, tức lỗi phía người gọi: máy chủ hiểu yêu cầu nhưng tài nguyên đòi xác thực, nên phản hồi kèm header yêu cầu khai danh tính để trình duyệt hỏi tên và mật khẩu; trong Java web thường gặp mã này khi servlet gọi sendError với hằng số báo chưa xác thực, hoặc khi một ràng buộc bảo mật khai trong web.xml chặn tài nguyên mà người dùng chưa đăng nhập. "Indicates that the requested resource is not available." mô tả mã 404, nghĩa là đường dẫn yêu cầu không tồn tại trên máy chủ, khác hẳn chuyện thiếu danh tính. "Indicates an error inside the HTTP server which prevented it from fulfilling the request." mô tả mã 500, lỗi nội tại của máy chủ, thường do servlet ném ngoại lệ không bắt được nên không soạn nổi phản hồi. "Indicates that the HTTP server is temporarily overloaded, and unable to handle the request." mô tả mã 503, máy chủ quá tải hoặc đang bảo trì nên tạm thời không nhận yêu cầu, và lỗi này không liên quan tới quyền truy cập.
Mở trang câu hỏi này →
APOST
BGET
CDELETE
DPATCH
Lời giải
Đáp án đúng: "POST". Theo đặc tả HTTP, đây là phương thức mang dữ liệu trong thân yêu cầu để máy chủ tạo ra một tài nguyên mới, và nó không idempotent: gửi hai lần thì sinh hai bản ghi, nên biểu mẫu đăng ký hay thêm bản ghi đều khai method này và servlet xử lý trong doPost. "GET" là phương thức an toàn và idempotent, chỉ để đọc: tham số nằm lộ trên URL, bị lưu vào lịch sử trình duyệt và bị cache, lại giới hạn độ dài, nên không dùng để tạo dữ liệu. "DELETE" dùng để xoá tài nguyên đang tồn tại ở địa chỉ được trỏ tới, tức ngược hẳn với việc tạo. "PATCH" dùng để sửa một phần tài nguyên đã có, nên tiền đề của nó là tài nguyên tồn tại sẵn rồi, không phải tạo mới.
Mở trang câu hỏi này →
AIt is faster than RequestDispatcher.forward()
BIt keeps the original request and response objects
CIt changes the URL in the browser
DIt does not involve client-side communication
Lời giải
Đáp án đúng: "It changes the URL in the browser". Phương thức này trả cho trình duyệt một phản hồi chuyển hướng mang mã 302 cùng header Location, rồi chính trình duyệt phát yêu cầu thứ hai tới địa chỉ mới, vì vậy thanh địa chỉ đổi theo và đích đến thậm chí có thể nằm ở ứng dụng hay máy chủ khác. "It is faster than RequestDispatcher.forward()" sai vì nó thêm hẳn một vòng đi về qua mạng, trong khi forward được xử lý nội bộ ngay trong máy chủ nên nhanh hơn. "It keeps the original request and response objects" sai vì yêu cầu thứ hai đi kèm một cặp request và response hoàn toàn mới: mọi thứ đặt bằng setAttribute trước đó biến mất, chỉ còn dữ liệu nào được gắn trên URL hoặc lưu trong phiên. "It does not involve client-side communication" sai vì cơ chế này dựa hoàn toàn vào việc trình duyệt tự đi lại; thứ không cần phía client tham gia mới chính là forward của RequestDispatcher.
Mở trang câu hỏi này →
AHttpServlet
BServletConfig
CServletContext
DServlet
Lời giải
Đáp án đúng: "Servlet". Trình chứa chỉ làm việc với servlet qua đúng kiểu này: giao diện Servlet khai báo init, service, destroy cùng hai phương thức đọc cấu hình và thông tin, nên mọi lớp muốn được container nạp rồi gọi theo vòng đời đều phải hiện thực nó, dù trực tiếp hay gián tiếp qua lớp cha. "HttpServlet" không phải giao diện mà là lớp trừu tượng dành riêng cho giao thức HTTP; nó tiện vì đã cài sẵn service để phân phối sang doGet hay doPost, nhưng kế thừa nó là lựa chọn chứ không phải điều kiện bắt buộc. "ServletConfig" là giao diện mang tham số khởi tạo và tên của một servlet; lớp cha tổng quát có hiện thực nó, song đó không phải điều kiện để một lớp được coi là servlet. "ServletContext" là giao diện mô tả cả ứng dụng web, do container cung cấp cho servlet dùng để chia sẻ dữ liệu toàn ứng dụng, không phải thứ servlet đi hiện thực.
Mở trang câu hỏi này →
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 →
AHttpServlet
BJavaServlet
CWebServlet
DServletClass
Lời giải
Đáp án đúng: "HttpServlet". Khi viết servlet cho một máy chủ web Java, ta tạo lớp kế thừa lớp trừu tượng này rồi ghi đè doGet hoặc doPost: phương thức service có sẵn trong nó đọc phương thức HTTP của yêu cầu rồi gọi đúng phương thức xử lý tương ứng, đồng thời lo sẵn các việc phụ như trả lời yêu cầu chỉ lấy header. "JavaServlet" không có trong đặc tả Servlet, đây chỉ là một cái tên nghe giống thật. "WebServlet" là tên của annotation dùng để khai url-pattern ngay trên lớp thay cho khai báo trong web.xml, nó không phải lớp để kế thừa. "ServletClass" cũng không tồn tại; lớp trừu tượng tổng quát hơn, không phụ thuộc giao thức HTTP, mang tên GenericServlet.
Mở trang câu hỏi này →
A/src/main/java
B/WEB-INF/classes
C/META-INF
D/WEB-INF
Lời giải
Đáp án đúng: "/WEB-INF". Bộ mô tả triển khai phải nằm ngay trong thư mục này, cạnh hai thư mục classes và lib, vì đó đúng là chỗ container tìm đọc khi triển khai ứng dụng; thư mục này còn được bảo vệ đặc biệt, client không thể gõ địa chỉ để tải trực tiếp bất cứ tệp nào bên trong, nhờ vậy cấu hình và lớp đã biên dịch không bị lộ. "/src/main/java" là thư mục mã nguồn theo quy ước của công cụ xây dựng; nội dung trong đó được biên dịch rồi mới đóng gói, không phải vị trí tệp cấu hình lúc chạy. "/WEB-INF/classes" chỉ chứa các lớp đã biên dịch cùng tệp tài nguyên đi kèm của ứng dụng. "/META-INF" là nơi đặt tệp kê khai của gói và tệp context.xml khai tài nguyên cho Tomcat, không phải nơi container tìm bộ mô tả triển khai.
Mở trang câu hỏi này →
ACookies
BHttpSession
CURL Rewriting
DBoth A, B and C
Lời giải
Đáp án đúng: "Both A, B and C". Câu hỏi hỏi công nghệ nào giúp quản lý phiên trong Java web, và cả ba thứ được liệt kê đều là mảnh của cùng một cơ chế: máy chủ giữ dữ liệu phiên theo một mã phiên, còn mã phiên ấy phải được chuyển qua lại giữa hai bên, bằng cookie hoặc bằng cách nhúng vào đường dẫn. "Cookies" đúng là phương tiện mang mã phiên, nhưng nêu riêng nó thì thiếu: nó chỉ là chỗ chứa mã chứ không phải nơi lưu dữ liệu phiên, và khi trình duyệt chặn nó thì vẫn còn đường khác. "HttpSession" là API phía máy chủ giữ dữ liệu theo từng người dùng, song nó vẫn phải dựa vào mã phiên do client gửi lên mới biết lấy đúng phiên nào, nên một mình nó cũng chưa trả lời đủ. "URL Rewriting" là cách dự phòng khi không có cookie, làm bằng phương thức mã hoá URL để nối mã phiên vào đường dẫn, và bản thân nó không phải toàn bộ cách quản lý phiên.
Mở trang câu hỏi này →
AThey are treated differently in the Servlet API.
BQuery parameters are only supported in GET requests.
CBoth are accessed using the same parameter methods.
DPost variables must always have unique names.
Lời giải
Đáp án đúng: "Both are accessed using the same parameter methods.". Trong Servlet API, dữ liệu gửi kèm trên query string và dữ liệu gửi trong thân yêu cầu theo kiểu biểu mẫu mã hoá URL được container trộn vào cùng một tập tham số, nên lập trình viên đọc cả hai bằng cùng nhóm phương thức getParameter, getParameterValues và getParameterMap mà không cần biết chúng đến từ đâu. "They are treated differently in the Servlet API." sai chính vì điều đó: API không tách riêng hai nguồn, khác biệt chỉ nằm ở cách trình duyệt đóng gói lúc gửi. "Query parameters are only supported in GET requests." sai vì một yêu cầu POST vẫn có thể mang query string ngay trên địa chỉ khai trong thuộc tính action, khi đó servlet đọc được cả tham số trên URL lẫn trường của biểu mẫu. "Post variables must always have unique names." sai vì nhiều trường trùng tên là hợp lệ và rất phổ biến với hộp kiểm hay danh sách chọn nhiều giá trị; lúc đó getParameterValues trả về mảng, còn getParameter chỉ trả giá trị đầu tiên.
Mở trang câu hỏi này →
Ainit(), destroy(), service()
Bservice(), init(), destroy()
Cinit(), service(), destroy()
Ddestroy(), init(), service()
Lời giải
Đáp án đúng: "init(), service(), destroy()". Vòng đời do container điều khiển theo đúng ba chặng: nạp lớp và tạo đúng một thực thể, gọi init một lần duy nhất để cấp cấu hình và làm việc chuẩn bị; sau đó mỗi yêu cầu đi vào service, nơi lớp cha HTTP đọc phương thức của yêu cầu rồi chuyển sang doGet hay doPost, và nhiều luồng có thể chạy đồng thời trên cùng thực thể ấy; cuối cùng destroy được gọi một lần khi ứng dụng bị gỡ hoặc máy chủ tắt. "init(), destroy(), service()" sai vì đặt việc huỷ trước việc phục vụ: sau destroy thì thực thể đã bị loại, không còn gì để chạy service nữa. "service(), init(), destroy()" sai vì không thể phục vụ yêu cầu trước khi init chạy xong, lúc đó servlet chưa có cấu hình và chưa sẵn sàng. "destroy(), init(), service()" sai ngay ở bước mở màn: destroy không bao giờ đứng đầu, nó chỉ xuất hiện ở cuối đời servlet.
Mở trang câu hỏi này →
Đề bài
<html>
  <body>
    <form action="Record" >
      User:<input type="text" id="txtname1"  name="txtname2">
      <br>
        Address:<input type="text" id="txtadd1"  name="txtadd2">
        <br>
          <input type="submit" value="GotoZone">
          </form>
        </body>
      </html>

Which of the Servlet code takes input from an html form and displays it on the browser?

Apublic class RecordServlet extends HttpServlet { protected void doPost(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException { PrintWriter pw=res.getWriter(); res.setContentType("text/html"); String account=req.getParameter("txtname1"); String Addr=req.getParameter("txtadd1"); pw.println("Hello " + account + " from" + Addr); pw.close(); } }
Bpublic class RecordServlet extends HttpServlet { protected void doPost(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException { PrintWriter pw=res.getWriter(); res.setContentType("text/html"); String account=req.getParameter("txtname2"); String Addr=req.getParameter("txtadd2"); pw.println("Hello " + account + " from" + Addr); pw.close(); } }
Cpublic class RecordServlet extends HttpServlet { protected void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException { PrintWriter pw=res.getWriter(); res.setContentType("text/html"); String account=req.getParameter("txtname1"); String Addr=req.getParameter("txtadd1"); pw.println("Hello " + account + " from" + Addr); pw.close(); } }
Dpublic class RecordServlet extends HttpServlet { protected void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException { PrintWriter pw=res.getWriter(); res.setContentType("text/html"); String account=req.getParameter("txtname2"); String Addr=req.getParameter("txtadd2"); pw.println("Hello " + account + " from" + Addr); pw.close(); } }
Lời giải

Đáp án đúng: "public class RecordServlet extends HttpServlet

Lời giải
{
    protected void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
        {
                PrintWriter pw=res.getWriter();
                res.setContentType("text/html");
                String account=req.getParameter("txtname2");
                String Addr=req.getParameter("txtadd2");
                pw.println("Hello " + account + " from" + Addr);
                pw.close();

        }

}". Biểu mẫu khai thuộc tính action trỏ tới Record mà không ghi method, nên trình duyệt gửi theo mặc định là GET, vì vậy lớp servlet phải cài phương thức doGet; đồng thời tên tham số gửi đi là giá trị của thuộc tính name chứ không phải id, tức txtname2 và txtadd2. Lựa chọn dùng "doPost(HttpServletRequest req,HttpServletResponse res)" cùng "req.getParameter("txtname1")" sai cả hai chỗ: không cài doGet nên yêu cầu từ biểu mẫu bị báo không hỗ trợ phương thức, mà tên id cũng không bao giờ được gửi lên. Lựa chọn đọc đúng "req.getParameter("txtname2")" nhưng lại đặt mã trong "doPost(HttpServletRequest req,HttpServletResponse res)" thì vẫn không chạy với yêu cầu GET. Lựa chọn có đúng "doGet(HttpServletRequest req,HttpServletResponse res)" lại lấy "req.getParameter("txtadd1")" theo id, nên hai biến nhận về null và trang chỉ in ra chữ Hello kèm null.

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 →
Đề bài
<servlet-mapping>
  <servlet-name>ServletA</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>ServletB</servlet-name>
  <url-pattern>/bservlet.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>ServletC</servlet-name>
  <url-pattern>*.servletC</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>ServletD</servlet-name>
  <url-pattern>/dservlet/*</url-pattern>
</servlet-mapping>

Given that a user enters the following into thier browser, which (if any) of the mapped servlets will execute? (Choose one.) http://mywebserver:8081/mywebapp

AServletA
BServletB
CServletC
DServletD
Lời giải
Đáp án đúng: "ServletA". Địa chỉ người dùng gõ chỉ tới đúng gốc ứng dụng mywebapp, nên phần đường dẫn bên trong ứng dụng là rỗng và được container quy về gốc. Khi so khớp, container thử lần lượt theo thứ tự: khớp chính xác, rồi khớp theo tiền tố, rồi khớp theo đuôi mở rộng, cuối cùng mới tới servlet mặc định được khai bằng một dấu gạch chéo đơn; ở đây không khai báo nào khớp chính xác nên servlet mặc định nhận yêu cầu. "ServletB" chỉ chạy khi đường dẫn đúng bằng chuỗi bservlet.html, trong khi yêu cầu này không hề có phần đó. "ServletC" chỉ chạy khi đường dẫn kết thúc bằng đuôi servletC, nhưng đường dẫn ở đây rỗng nên không có đuôi nào. "ServletD" chỉ nhận những đường dẫn bắt đầu bằng đoạn dservlet, cũng không khớp với một đường dẫn rỗng.
Mở trang câu hỏi này →
14All JSP pages is translated into____4 lựa chọn
AJavaBean
BServlet class
CJava Class
DXML Document
Lời giải
Đáp án đúng: "Servlet class". Ở pha dịch, container đọc trang JSP rồi sinh ra mã nguồn Java của một lớp kế thừa lớp cơ sở của JSP, lớp cơ sở đó lại hiện thực giao diện Servlet; mọi đoạn HTML tĩnh biến thành lệnh ghi ra luồng xuất và mọi scriptlet hay biểu thức nằm trong thân phương thức phục vụ. Lớp ấy được biên dịch rồi nạp, từ đó trang có đúng vòng đời của một servlet và được container gọi qua service. "JavaBean" là lớp dữ liệu thuần với các phương thức đọc ghi thuộc tính; JSP dùng bean để lấy dữ liệu chứ không biến thành bean. "Java Class" đúng ở mức thô vì kết quả cuối cũng là một lớp Java, nhưng nó bỏ mất chi tiết quyết định mà câu hỏi nhắm tới: lớp sinh ra thuộc loại servlet, có khởi tạo, phục vụ theo yêu cầu rồi bị huỷ. "XML Document" sai vì tuy JSP có thể viết theo cú pháp XML, kết quả của pha dịch là mã Java chứ không phải một tài liệu XML.
Mở trang câu hỏi này →
AUsing the <import> tag.
BUsing the <%@ include > directive.
CUsing the <link> tag.
DUsing the <external> tag.
Lời giải

Đáp án đúng: "Using the <%@ include > directive.". Chỉ thị này chèn nội dung tệp khác vào trang ngay ở pha dịch: hai tệp hợp thành một lớp servlet duy nhất, nên biến khai ở tệp cha dùng được trong phần được chèn và ngược lại, nhưng đổi tệp con thì phải dịch lại trang cha. Khi cần chèn ở thời điểm chạy thì có thẻ hành động include, nó gọi tài nguyên đích rồi ghép kết quả vào phản hồi. "Using the <import> tag." không tồn tại trong JSP; việc khai lớp Java cần dùng thì làm bằng thuộc tính import của chỉ thị page. "Using the <link> tag." là thẻ HTML do trình duyệt xử lý để nạp tài nguyên như bảng kiểu, hoàn toàn không phải cơ chế ghép trang phía máy chủ. "Using the <external> tag." không có trong đặc tả JSP lẫn trong HTML, đây chỉ là tên bịa.

Mở trang câu hỏi này →
Arequest.getParameter()
Bresponse.getParameter()
Crequest.getValue()
Dresponse.getValue()
Lời giải
Đáp án đúng: "request.getParameter()". Dữ liệu biểu mẫu do client gửi lên nằm trong đối tượng yêu cầu, nên trong JSP ta đọc qua đối tượng ẩn request kiểu HttpServletRequest: phương thức này nhận tên trường theo thuộc tính name và trả về một chuỗi, hoặc null nếu trường đó không được gửi. "response.getParameter()" không tồn tại vì đối tượng phản hồi chỉ dùng để tạo dữ liệu trả về client, qua luồng ghi hay việc đặt kiểu nội dung, nó không mang tham số đi vào. "request.getValue()" cũng không có trong API; thứ gần với cái tên đó trong đối tượng yêu cầu là getAttribute, nhưng attribute là dữ liệu do chính máy chủ đặt vào để chuyển giữa servlet và trang, không phải dữ liệu biểu mẫu. "response.getValue()" sai cả hai điểm: vừa gọi trên đối tượng phản hồi, vừa gọi một phương thức không hề tồn tại.
Mở trang câu hỏi này →
Aresponse
Brequest
Csession
Dapplication
Lời giải
Đáp án đúng: "request". Đối tượng ẩn này có kiểu HttpServletRequest, do container tạo riêng cho từng yêu cầu rồi truyền vào phương thức phục vụ của servlet sinh ra từ trang; qua nó ta đọc tham số biểu mẫu, header, phương thức HTTP, địa chỉ được yêu cầu, cookie gửi lên và địa chỉ máy khách, tức toàn bộ thông tin về lần gọi hiện tại. "response" là phía ngược lại, dùng để tạo nội dung trả về, đặt mã trạng thái, header và chuyển hướng. "session" giữ dữ liệu bền hơn một yêu cầu cho cùng một người dùng, nên nó nói về trạng thái tích luỹ chứ không mô tả chi tiết của yêu cầu đang xử lý. "application" là đối tượng ẩn kiểu ServletContext, phạm vi toàn ứng dụng và dùng chung cho mọi người truy cập, càng không gắn với một yêu cầu cụ thể nào.
Mở trang câu hỏi này →
ATo declare custom error pages for specific HTTP error codes
BTo handle exceptions thrown by Java code in the JSP
CTo define global error handling for the entire web application
DTo include additional resources in the JSP page
Lời giải
Đáp án đúng: "To handle exceptions thrown by Java code in the JSP". Khi mã Java trong trang JSP ném một ngoại lệ không được bắt, ngoại lệ ấy thoát khỏi phương thức phục vụ và container tra khai báo trang lỗi để biết đưa người dùng tới đâu: khai theo loại ngoại lệ kèm vị trí trang xử lý, còn trang xử lý thường bật thuộc tính báo mình là trang lỗi để dùng được đối tượng ẩn exception mà in thông điệp hay ghi log. "To declare custom error pages for specific HTTP error codes" nói về nhánh khai theo mã trạng thái HTTP, tức lo các mã do container sinh ra như 404 hay 500; đó là một công dụng khác của cùng khai báo, không phải điều câu hỏi đang nhắm tới. "To define global error handling for the entire web application" chỉ nói về phạm vi khai báo chứ không nói việc gì được xử lý, hơn nữa từng trang JSP vẫn có thể tự trỏ trang lỗi riêng bằng thuộc tính trong chỉ thị page. "To include additional resources in the JSP page" sai hẳn vì việc nhúng thêm tài nguyên vào trang thuộc chỉ thị include hoặc thẻ hành động include.
Mở trang câu hỏi này →
ABetter performance with repeated queries
BAvoid SQL Injection errors
CAutomatically commit transactions
DBoth A and B are correct
Lời giải
Đáp án đúng: "Both A and B are correct". Câu lệnh tham số hoá được gửi tới hệ quản trị dưới dạng khuôn có dấu hỏi làm chỗ trống, nên kế hoạch thực thi được chuẩn bị một lần rồi dùng lại cho nhiều lượt chạy; đồng thời giá trị truyền qua các phương thức đặt tham số được driver chuyển đi như dữ liệu chứ không ghép vào chuỗi SQL, nên kẻ tấn công không chèn thêm được mệnh đề nào. Hai lợi ích vì vậy cùng xuất hiện. "Better performance with repeated queries" đúng nhưng chỉ nêu một nửa, nó bỏ qua lợi ích an toàn, trong khi đó mới là lý do quan trọng nhất khiến người ta rời Statement. "Avoid SQL Injection errors" cũng chỉ nêu nửa còn lại và bỏ qua phần hiệu năng khi chạy lặp. "Automatically commit transactions" sai hẳn vì việc chốt giao dịch do đối tượng kết nối quyết định qua cờ tự commit cùng hai lệnh commit và rollback; loại câu lệnh dùng để chạy SQL không can thiệp vào đó.
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 →