Xây dựng ứng dụng Web theo khung kiến trúc MVC bằng XQuery và cơ sở

Một phần của tài liệu Chuẩn QTI trong các hệ thống sát hạch trắc nghiệm bằng máy tính và triển khai thử nghiệm (Trang 39 - 43)

và cơ sở dữ liệu XML

Giả sử ta phát triển một ứng dụng XQuery đơn giản quản lý dữ liệu liên hệ với ngƣời sử dụng (user contact). Mỗi mối liên hệ gồm có họ tên và địa chỉ thƣ điện tử. Toàn bộ dữ liệu chứa trong một tệp XML tên là contacts.xml, gồm nhiều phần tử user nhƣ dƣới đây:

<user id=“1”>

<fname>Eric</fname>

<lname>Palmitesta</lname>

<email>eric.palmitesta@...</email </user>

Mô hình (Model)

Mô hình chứa mã lệnh thực hiện các chức năng xử lý. Ví dụ dƣới đây cho thấy các hàm xử lý sau:

db-exists(): Hàm kiểm tra xem có tồn tại CSDL (ở đây là tệp contacts.xml) hay không.

Trình duyệt Web Sự kiện vào Yêu cầu

HTTP

Trang HTML

Controller View

Các công cụ xử lý bài thi

(lựa chọn môn thi, xử lý bài làm, tính điểm) (Model) Luồng ra Tầng trình bày Tầng model

list(): Hàm lấy ra tất cả các phần tử user có trong tệp dữ liệu contacts.xml.

create(): Hàm tạo một phần tử user mới và chèn thêm vào tệp dữ liệu. Dữ liệu đầu vào nhận từ trình điều khiển. Trình điều khiển lấy dữ liệu này từ yêu cầu HTTP, do ngƣời sử dụng nhập.

xquery version "1.0-ml";

module namespace contacts = "contacts"; declare variable $db := '/contacts.xml'; declare function db-exists() {

fn:doc-available($db)};

declare function list()as element(user)* {

fn:doc($db)/users/user};

declare function create($email as xs:string,

$first-name as xs:string,

$last-name as xs:string){

if (everything checks out...) then ( xdmp:node-insert-child(...),

fn:true() )

else fn:false()};

Khung nhìn (View)

Để minh họa việc duy trì song song cùng một lúc nhiều cách trình bày hiển thị dữ liệu, ở đây xây dựng hai khung nhìn: trang web HTML thông thƣờng và tài liệu XML

Khung nhìn HTML

xquery version "1.0-ml";

import module namespace contacts = "contacts" at "contacts-model.xqy";

<table><tr><th>Email</th> <th>First</th> <th>Last</th> </tr> {

for $contact in contacts:list() return <tr>

<td>{ $contact/email/text()}</td> <td>{ $contact/fname/text() }</td>

<td>{ $contact/lname/text() }</td> </tr>

</table>

Khung nhìn XML

xquery version "1.0-ml";

import module namespace contacts = "contacts" at "contacts-model.xqy";

<contacts>{

for $contact in contacts:list() return

<email> { $contact/email/text() }</email> }</contacts>

Trình điều khiển (Controller)

Theo quy ƣớc, tệp trình điều khiển XQuery có tên là controller.xql. Trong bản phân phối chuẩn của eXist, trình điều khiển chính nằm trong webapp/controller.xql. Các trình điều khiển khác nằm trong thƣ mục con webapp/sandbox hay webapp/admin. Các tệp trình điều khiển đặt trong các thƣ mục khác nhau, tạo thành một hệ phân cấp các trình điều khiển của ứng dụng đang xét.

Một vài chú ý khi xây dựng ứng dụng Web theo khung MVC

- Mô hình và trình điều khiển không nên chứa mã lệnh xhtml.

- Trình điều khiển và khung nhìn không nên chứa mã lệnh truy cập CSDL.

- Trình điều khiển không nên trực tiếp đọc các biến yêu cầu.

- Về cấu trúc thƣ mục: Thƣ mục gốc của ứng dụng chia làm một số thƣ mục con, ví dụ:

1. Thƣ mục application: chứa toàn bộ các mã lệnh riêng cho ứng dụng. Bên trong thƣ mục application tiếp tục chia ra các thƣ mục con, ví dụ:

+ 3 thƣ mục Controllers, Models, Views chứa các tệp triển khai các lớp thực hiện trình điều khiển, mô hình, và khung nhìn tƣơng ứng.

+ Thƣ mục config: chứa các tệp định nghĩa tham số cấu hình + Thƣ mục libraries: chứa các tệp tin thƣ viện

+ Thƣ mục resources: chứa các tài nguyên khác cần thiết cho ứng dụng. 2. Thƣ mục plugins: chứa các trình cắm thêm (plug-in)

3. Thƣ mục system: chứa các tệp thuộc khung xây dựng tức là các mã lệnh chứa những chức năng chung nhất của các ứng dụng.

- Có một lối vào duy nhất, ví dụ index.xql chọn trình điều khiển sẽ đƣợc thi hành.

Những khuyến cáo này nhằm tuân thủ nguyên tắc tách biệt các mối quan tâm, là mục đích của kiến trúc MVC.

Một phần của tài liệu Chuẩn QTI trong các hệ thống sát hạch trắc nghiệm bằng máy tính và triển khai thử nghiệm (Trang 39 - 43)