Mô hình MVC Java Web JSP Servlet
MVC Pattern trên Web – Mô hình thiết kế ứng dụng theo dạng Model – View – Controller
Mục đích: Chủ đề của bài này đề cập đến khái niệm của việc thiết kế web sử dụng mô hình MVC. Chúng tôi sẽ đi vào từng phần trong mô hình, các ưu điểm, khuyết điểm của mô hình này, từ đó chúng ta sẽ áp dụng mô hình này trong phần phân tích và thiết kế ứng dụng web cụ thể áp dụng mô hình này để thấy rõ cách thức thiết kế, cách cài đặt một ứng dụng theo đúng tính mô tả của mô hình
Khái niệm về mô hình MVC
Ý niệm chính của mô hình này là tách biệt phần ánh xạ, lưu trữ và xử lý dữ liệu (model) tách biệt hoàn toàn với thành phần trình bày giao diện kết quả cho người dùng hay phần giao diện giúp đón nhập nhập xuất cho người dùng (View)
Ý niệm trên cho phép người lập trình có thể tách biệt công việc trong quá trình xây dựng chức năng cho ứng dụng và quá trình xây dựng giao diện cho người dùng.
Bên cạnh đó, ý niệm trên cho phép việc thay đổi thành phần của dữ liệu (model) sẽ không ảnh hưởng nhiều đến giao diện của người dùng vì mô hình đưa ra Model để không cho người dùng thao tác trực tiếp vào dữ liệu vật lý (Cơ sở dữ liệu hay là tập tin) mà phải thông qua Model, do vậy cho dù dữ liệu vật lý thay đổi cấu trúc nhưng cấu trúc Model cho việc truy cập, xử lý, lưu trữ dữ liệu sẽ không bị ảnh hưởng. Nhìn theo khái niệm các thành phần giao tiếp trên Model là tên hàm – tham số truyền (interface) ít khi thay đổi, nội dung thay đổi chính là cách thức cài đặt bên trong hàm. Nhưng nội dung đó người sử dụng chức năng trên giao diện không quan tâm vì đa số họ chỉ quan tâm interface là gì, giá trị nhập và kết xuất ra sao. Do vậy, đây là một trong tính linh hoạt và uyển chuyển của mô hình MVC
Ngoài ra, việc tách biệt rời rạc giữa Model và View theo phân tích của chúng ta đang thể hiện tính uy việt. Tuy nhiên, một ứng dụng có rất nhiều Model và nhiều View, do vậy, mô hình cần có một thành phần lựa chọn và kết nối các thành phần này lại với nhau theo cách hiệu quả nhất. Controller là một trong những đối tượng đưa ra để đón nhận yêu cầu nhập xuất từ người dùng, xác định model tương ứng với view nhập để đưa model xử lý, kết quả xử lý của model sẽ được chuyển đến controller để controller xác định view kết xuất để đổ kết quả xử lý và hiển thị cho người dùng
Để hiểu rõ hơn về mô hình MVC này, chúng tôi chủ quan đưa ra một mô hình thực tế tiếp cận khái niệm của mô hình này như sau
Mô hình tiếp cận của chúng tôi được mô tả về việc công việc hàng ngày chúng ta thường làm để giải trí, đó là xem truyền hình. Câu chuyện được mô tả như sau
Một người A muốn xem các phim chọn lọc được lựa chọn từ các đĩa CD/DVD trên truyền hình của nhà A
Để đọc được các đĩa CD/DVD thì phải dùng đầu máy đọc đĩa trong nhà A
Đầu máy này đặc biệt không có nút điều khiển trực tiếp, đầu máy này nhận hàng loạt các đĩa – tối đa là 5 cái, do vậy muốn kích hoạt và chọn đĩa xem A bắt buộc phải sử dụng remote control – điều khiển từ xa
Như vậy, chúng ta sẽ nhận thấy cách thức A xem phim như sau
A sẽ sử dụng remote control điều khiển đầu máy để chọn đĩa mà A thích xem nhất để mở nó ra
Đĩa được chọn từ đọc máy được đọc và trình chiếu trên màn hình truyền hình
Khi dữ liệu đã hiển thị trên màn hình truyền hình thì A sẽ thấy được nội dung
Và cách thức này sẽ được lập đi lập lại khi A chọn một phim khác, đó là vẫn dùng đồ điều khiển để chọn đĩa và đầu đĩa đưa dữ liệu lên truyền hình và A thấy. …
Mô hình tiếp cận chúng tôi mô tả như hình vẽ sau
Qua hình ảnh mô tả trên, chúng ta nhận thấy rằng
Đầu máy là nơi xử lý dữ liệu, chọn lựa các thức xử lý, nội dung cần thiết nghĩa là đầu máy là Model
Truyền hình chỉ làm nhiệm vụ duy nhất để trình bày kết quả mà đầu máy – Model đã thực hiện, được lựa chọn. Truyền hình không thể lựa chọn và không có cách chọn lựa là trình bày các thành phần truyền đến đã được xử lý. Truyền hình là View
Thành phần hỗ trợ đưa dữ liệu từ Model đến View đó là đồ điều khiển, ngoài ra đồ điểu khiển cũng là nơi kết nối người dùng với đầu máy với truyền hình. Chức năng của điều khiển là chọn đúng model để đưa ra view. Đồ điều khiển – remote control là một Controller
Dựa trên một cách tiếp cận chúng ta thấy được sự tối ưu của MVC đó là
Khi chúng ta thay đổi Truyền hình đang xem thành truyền hình khác thì việc thay đổi không ảnh hưởng gì đến toàn hệ thống
Tương tự như thế nếu đầu máy hư thì thay đổi máy khác vẫn không ảnh hưởng gì lớn
Như vậy, việc tách biệt giúp chúng ta có nhiều lợi ích trong việc phân chia công việc và các xử lý công việc
Dựa trên cách tiếp cận như trên chúng ta định nghĩa các thành phần trong mô hình MVC như sau
Model
Là các thành phần hỗ trợ ánh xạ dữ liệu vật lý lên bộ nhớ, lưu trữ dữ liệu tạm thời trên bộ nhớ, hỗ trợ các cách thức xử lý dữ liệu, hỗ trợ khả năng giao tiếp và trao đổi dữ liệu giữa các đối tượng khác trong bộ nhớ và cơ sở dữ liệu
Cụ thể là một đối tượng Object trong khái niệm của lập trình hướng đối tượng OOP và mang đầy đủ khái niệm và tính chất của một Object
Trong ứng dụng Web của Java, Model sẽ là JavaBean hay Enterprise JavaBean hay Web Service
View
Là thành phần hỗ trợ trình bày dữ liệu hay kết quả ra màn hình, hỗ trợ nhập thông tin từ phía người dùng
Các thành phần này có khả năng truy cập Model, truy xuất Model thông qua những hành vi mà Model cho phép nhưng View không thể thay đổi các thành phần trong Model
Trong mô hình ứng dụng Web thì html, servlet, jsp … là những thành phần đại diện cho View
Controller
Là các thành phần hỗ trợ kết nối người dùng server, đón nhập yêu cầu người dùng, thực hiện chuyển xử lý, lựa chọn và cập nhật model và view tương ứng để trình bày về phía người dùng
Hỗ trợ kết nối giữa người model và view, giúp model xác định được view trình bày
Trong mô hình ứng dụng Web thì Servlet đóng vai trò của Controller
Mối quan hệ giữa các thành phần trong mô hình MVC
Dựa trên bản chất của MVC, khái niệm và cách tiếp cận chúng ta nhận thấy mối quan hệ giữa controller và model là như thế nào? Giữa Controller và Model, đối tượng nào phụ thuộc đối tượng nào?
Ý tưởng đó là khi chúng ta thay đổi đầu máy đọc, đồ điều khiển từ xa có thay đổi theo hay không? Hay chúng ta vẫn dùng cái điều khiển cũ (không tính khái niệm điều khiển đa năng)? Đồ điều khiển được thiết kế dựa trên đầu máy hay đầu máy được thiết kế dựa trên đồ điều khiển?
Câu trả lời chúng ta quá rõ ràng, đó là controller phụ thuộc vào model bởi vì controller được thiết kế đề kết nối với model, điều khiển, truy xuất model. Do vậy, model có sự thay đổi là controller phải thay đổi theo để có thể truy xuất và điều khiển model cho phù hợp
Giữa Model và View trên khái niệm, đối tượng nào phụ thuộc đối tượng nào?
View lệ thuộc vào Model bởi vì khi các tổ chức interface của Model thay đổi nghĩa là View phải thay đổi theo
Chúng ta tránh nhầm lẫn về khái niệm ở trên là tách biệt giữa View và Model là có lợi nhưng tại sao ở đây View lại lệ thuộc Model? Khái niệm của chúng ta ở đây đó là tách biệt dữ liệu và thành phần xử lý bên trong, hệ thống sẽ trở nên uyển chuyển khi chúng ta thành đổi thành phần cài đặt trong Model, không phải thay đổi interface Model. Và khái niệm trên đã nêu rõ giữa dữ liệu vật lý và dữ liệu được chứa trong Model
Mối quan hệ cuối cùng của chúng ta đó là giữa View và Controller,
Controller sẽ là đối tượng lựa chọn View tùy thuộc theo việc yêu cầu sử dụng của người dùng, tùy thuộc theo kết quả xử lý của Model
Quá trình phát triển của MVC được thực hiện tuần tự như sau
Không có khái niệm gì về mô hình: tất cả thiết kế đều tập trung viết code trực tiếp trên các ngôn ngữ script và ngôn ngữ tag để hỗ trợ trình bày dữ liệu trên Browser – dạng web tĩnh. Ví dụ đây chính là là các trang html có nhúng javascript, nếu người phát triển web khi làm qua nội dung này sẽ thấy sự phức tạp và rắc rối của nó khi chúng ta cần chỉnh sửa trang web khi đã hoàn tất
Mô hình MVC1:
Là mô hình tương tự như html nhưng các trang web ở dạng động có thể đón nhận và trình bày dữ liệu từ server nhưng tất cả các trang liên kết đều là các đường dẫn tĩnh và các cách thức xử lý đều thực hiện trực tiếp trên trang. Ngoài ra, các trang thực hiện gọi trực tiếp lẫn nhau.
Ví dụ:
Mô hình này chỉ phù hợp với ứng dụng nhỏ vì các đưởng dẫn rất khó để tìm kiếm và sửa đổi, đặc biệt trên trang đang trộn lẫn giữa code html, javascript, xml, javacode …
Mô hình MVC2:
Đây là mô hình thực tế áp dụng tiếp cận theo đúng khái niệm đã nêu ra ở trên, tách biệt riêng biệt thành từng thành phần, tạo nên sự uyển chuyển khi vận dụng và cài đặt, đặc biệt là bảo trì nâng cấp
Khái niệm về mô hình MVC2
Cơ chế thực hiện
Web Browser gửi request đến server thông qua các control trên form HTML hay JSP, hay query string url hay qua cookies.
Servlet – Controller đón nhận request và xác định Model tương ứng để tạo ra instance của JavaBean để đón nhận các giá trị nhập từ request để lưu trữ và xử lý
Model thực hiện xử lý, kết nối dữ liệu vật lý dưới DBMS (nếu có) và trả kết quả trả về cho Controller
Kết quả xử lý được chuyển vào Servlet – Controller, Servlet Controller thực hiện tạo hay lựa chọn View để từ đó đưa kết quả xử lý hay dữ liệu lấy từ Model để cập nhật lại trang kết quả View.
Controller gửi View qua response cho người dùng để browser có thể trình bày dữ liệu trong Web Browser
Cơ chế thực hiện trên cho thấy mọi tập trung xử lý và kết xuất đều hướng vào Controller
Do vậy, đây cũng là một phần khiếm khuyết khi Controller là nơi tập trung xử lý dữ liệu
Do vậy, một trong những khái niệm để giảm bớt tải của Controller chính là Filter (chúng tôi sẽ trình bày trong một chủ đề khác)
Ưu điểm
Tính tin cậy (reliability): việc chia từng phần riêng biệt giúp chúng ta sửa đổi từng thành phần riêng biệt, không ảnh hưởng, có thể thay thế thành từng phần tương đương, có thể chia công việc theo nhóm, biên dịch độc lập, tăng cường khả năng tích hợp với khả năng đúng đắn cao
Tính tương thích cao (compatibility): có khả năng sử dụng các loại công nghệ khác nhau không lệ thuộc vì chúng ta đã được tách biệt và khái niệm cho từng loại thành phần riêng biệt
Tính tái sử dụng (reusable): chúng ta có thể sử dụng các thành phần chia cắt lại trong các ứng dụng khác hay sử dụng lại nhiều lần trong cùng một ứng dụng, tăng tính hiệu quả trong lập trình
Khả năng triền khai nhanh chóng và bảo trì nhanh chóng (quick deploy and easy maintenance): vì các thành phần độc lập với nhau
Chúng ta tiếp tục mô tả thành phần Controller, ở đây chúng tôi mô tả khái niệm về Servlet
Servlet là đoạn chương trình java thực thi trên Web Server hỗ trợ người lập trình Java xây dựng trang web động mà không cần học ngôn ngữ lập trình web mới
Servlets nhận request – yêu cầu từ client, sao đó thực hiện các yêu cầu xử lý để gửi response – phản hồi đến người dùng sử dụng HTTP
Servlet được load sẵn ở Web Server duy nhất lần đầu tiên khi ứng dụng được deploy và đáp ứng tức thời yêu cầu của người dùng thông qua Web Container. Người dùng không lo lắng đến chuyện khởi tạo servlet (như cách chúng ta phải dùng lệnh new đối với việc tạo ra một instance mới cho một object).
Servlet được server hỗ trợ cơ chế multithread giúp giảm tài nguyên và quá tải trong việc xử lý của server hay container
Khuyết điểm
Không thích hợp cho việc trình bày và xử lý giao diện vì code html được viết trong chuỗi String của các câu lệnh Java, rất khó trong việc checking và kiểm tra lỗi về tính đúng đắn của văn bản xml (well-form)
Không hỗ trợ đầy đủ các thành phần liên quan đến session
Về phía người dùng có thể nói tương tác chỉ là single thread vì người dùng không thể xác định instance servlet phục vụ cho mình mà container và server tự động xác định instance tương ứng và yêu cầu nó xử lý. Chúng ta chỉ biết được xử lý khi thấy kết quả được hiển thị ở browser. Nghĩa là mọi thứ xử lý phải lệ thuộc container
Cơ chế hoạt động
Khi có request từ client gửi đến Server hay Web Container
Container sẽ lựa chọn một instance Servlet tương ứng để đáp ứng request đó (người dùng sẽ không bao giờ biết instance nào được lựa chọn, nó lựa chọn khi nào, servlet xử lý khi nào)
Servlet lựa chọn sẽ thực hiện xử lý và kết nối DB nếu cần
Sau khi servlet thực hiện xong, sẽ gửi kết quả ra container để gửi response về cho người dùng
Browser đón nhận kết quả và trình bày ra màn hình dữ liệu
Chu kỳ sống hay tồn tại của servlet trong server hay container
Khi một ứng dụng chưa được deploy vào trong server thì servlet chưa được khởi tạo (uninstantiated)
Khi ứng dụng được deploy vào server thì container sẽ thực hiện khởi tạo instance cho servlet, trong lúc khới tạo kích hoạt hàm init. Lưu ý, hàm init chỉ được kích hoạt lần duy nhất khi deploy
Khi có một request đến servlet của người dùng, container đón nhận request và chọn instance bean bất kỳ tương ứng với yêu cầu để đáp ứng.
Sau khi chọn được bean, container sẽ kích hoạt hàm service tương ứng. Lưu ý ở đây, ở lần yêu cầu thứ 2 thì container cũng sẽ chọn bean và kích hoạt hàm service tương ứng, do vậy, hàm service sẽ được gọi rất nhiều lần
Khi servlet được cập nhật mới hay server bị crash hay undeploy ứng dụng ra khỏi server – container, thì hàm destroy của servlet được kích hoạt. Nghĩa là servlet chỉ kích hoạt phương thức destroy lần cuối cùng duy nhất
Lưu ý: các giá trị chỉ số ‘ trong hình trên thể hiện khi lỗi xảy ra thì server sẽ báo lỗi
Để tạo một servlet chúng ta phải implements HttpServlet
HttpServlet được kế thừa từ GenericServlet
GenericServlet được kế thừa từ phần chính yếu là Servlet, đây là interface cho tất cả servlet và định nghĩa một trong ba phương thức đã được định nghĩa trong chu kỳ sống (init, services, destroy).
GenericServlet ngoài được kế thức từ Servlet, nó còn được kế thừa từ ServletConfig, java.io.Serializable
Lưu ý: tất cả các lớp đều thuộc package javax.servlet
Khi servlet chấp nhận lời gọi từ client, nó sẽ đón nhận 02 tham số là ServletRequest (đối tượng chứa đựng dữ liệu được truyền từ client đến server) và ServletResponse (đối tượng chứa đựng dữ liệu được truyền từ server đến client)
Khi servlet áp dụng protocol HTTP để giao tiếp thì các thành phần mở rộng từ 02 lớp trên tương ứng được cung cấp đó là HttpServletRequest và HttpServletResponse
Servlet định nghĩa 3 tầm vực thao tác: request, session, ServletContext
Đây là vùng không gian bộ nhớ (memory segment) được cung cấp cho mỗi ứng dụng web dùng để chứa các thông tin để giao tiếp với các thành phần khác trong server
Mỗi vùng không gian này tồn tại trong một khoảng thời gian nhất định tùy theo qui định
request: tồn tại từ lúc gửi request cho đến khi response
session: một khoảng thời gian từ lúc mở trình duyệt đến đóng trình duyệt, hết thời gian session, session bị hủy, …
ServletContext: có thể gọi là application tồn tại từ lúc bắt đầu ứng dụng đến khi ứng dụng bị undeploy ra khỏi server hay server bị crash
Servlet cung cấp thêm một interface RequestDispatcher để hỗ trợ việc giao tiếp và xác định view tương ứng trong xử lý
RequestDispatcher hỗ trợ container chuyển request object từ đối tượng của server từ thành phần này sang thành phần khác (đây là ưu điểm vượt trội so với response.sendRedirect hay click một link trên trang web vì 02 đối tượng này không truyền object request đi)
Đối tượng cuối cùng là đối tượng sẽ reponse kết quả trả về hay cho phép nhúng đối tượng này sang đối tượng khác
Cơ chế này còn giúp che dấu thông tin xử lý của các đối tượng xử lý trên thành url của trình duyệt – đảm bảo tính bảo mật cao
Sau khi mô tả tổng quan về Controller, chúng tôi sẽ mô tả Model
Một thành phần cấu thành object – đối tượng và chứa đây đủ đặc tính của object đó là
Một object bao gồm state – trạng thái và behaviors – các hành vi
Đảm bảo 4 tính chất
abstraction (mang tính chất chung nhất của object)
encapsulation (cho phép người dùng truy cập các trạng thái của object thông qua các behavior)
hierarchy (có tính kế thừa)
modularity (phân chia module theo từng nhóm chức năng và tách biệt các thành phần theo dạng component để có thể dễ dàng cài đặt, maintenance – bảo trì, và tái sử dụng – reusable )
JavaBeans là một đối tượng đại diện cho object và được sử dụng như Model bởi vì nó chứa đầy đủ các yêu cầu đã nêu trên
Đặc điểm của JavaBeans
JavaBeans là một java class được implements từ Serializable vì đây là một object sử dụng qua protocol và để giao tiếp với các thành phần trong và ngoài server, do vậy nó phải được chuyển đổi từ thành dạng byte stram để dễ dàng truyền đi
JavaBeans bắt buộc phải được cài đặt có package để có thể tái sử dụng thông qua lệnh import.
Các thuộc tính properties trong JavaBeans bắt buộc phải được khai báo là private và các việc khai thác các thuộc tính này phải được thông qua các hàm getTênThuộcTính hay setTênThuộcTính (encapsulate)
Hàm get sẽ được đổi thành hàm is nếu kiểu dữ liệu là kiểu boolean
Bắt buộc phải có một contrucstor không tham số để có thể khởi tạo object mà không cần khởi tạo giá trị ban đầu cho object luôn luôn ở trạng thái đảm bảo thao tác không bị lỗi kể cả khi giá trị thuộc tính của các object chưa cập nhật gì cả
Cài đặt đầy đủ các phương thức hay hành vi mà JavaBeans cần giao tiếp với thế giới bên ngoài. Lưu ý: hàm thiết kế phải tuân theo chuẩn đó là hàm chỉ truyền tham số khi các giá trị này không thể tồn tại trong các thuộc tính của chính instance JavaBeans mà chúng ta đang thao tác – thiết kế
Cuối cùng trong mô hình này, chúng tôi sẽ mô tả kiến thức tổng quan về view
Những đối tượng có khả năng trình bày dữ liệu ra màn hình như html, jsp … Ở đây chúng tôi trình bày kiến thức sơ lược về jsp
JSP viết tắt của Java Server Pages
Đây là ngôn ngữ scripting được dùng ở server để hỗ trợ ứng dụng trong việc trình bày trang web động – cập nhật dữ liệu
JSP tích hợp bao gồm HTML, XML, Java Code, và kể cả Servlet nghĩa là
Nó tạo thuận lợi cho người dùng trong việc xây dựng giao diện – khắc phục nhược điểm của servlet về giao diện.
Ngoài ra, nó cho người dùng mở rộng khả năng sử dụng JSP qua việc định nghĩa các tag mới như XML – khắc phục nhược điểm của HTML
Đặc biệt cho phép người dùng sử dụng nhúng trưc tiếp code Java vào trong JSP thông qua Declaration – khai báo biến và hàm, Scriptlets – chứa code trực tiếp của Java và Expression – tính toán biểu thức và in kết quả ra màn hình. Những điều này tạo điều kiện cho người lập trình Java không cần học các ngôn ngữ script mới khi lập trình
Bản chất của JSP là Servlet, do vậy các thành phần của Servlet sẽ có tồn tại hết trên JSP
Ngoài ra, JSP không cần phải biên dịch mà nó được biên dịch khi có request lần đầu tiên yêu cầu đến server, do vậy JSP khắc phục nhược điểm chỉnh sửa phải cần có source code và biên dịch lại khi deploy sau khi chỉnh sửa của Servlet
JSP cung cấp các thành phần implicit Object để người dùng có thể sử dụng các thành phần tương tác trên server mà không cần khai báo và khởi tạo
Kết xuất của JSP thực chất là HTML. File JSP có phần mở rộng là .jsp
Chu kỳ sống của JSP
Khi có một yêu cầu từ client đến server, container xác định trang jsp được yêu cầu
Trang JSP được đưa qua JSP Engine để xử lý. JSP Engine thực hiện các bước sau
Đọc cấu trúc file của JSP File từ trên xuống dưới, từ trái qua phải để chuyên đổi (Parsing) sang Java code tương ứng
Phát sinh Servlet từ nội dung parsing ở bước trên để cấu tạo thành servlet
Thực hiện biên dịch code Servlet
Sau khi biên dịch thành công thì quá trình hoạt động sẽ thực hiện đúng theo chu kỳ sống của Servlet như đã nêu trong các phần trên
Tương tự 03 phương thức init, services, destroy của Servlet thì JSP sẽ có 03 phương thức tương ứng là jspInit, jspService và jspDestroy
JSP định nghĩa ra 4 tầm vực thao tác đó là page – tồn tại trong page, request – tồn tại từ lúc bắt đầu gửi request cho đến khi response thành cồng, session, application (từ khi deploy đến khi kết thúc ứng dụng) – ServletContext
Để trang JSP mang tính chất đặc thù của View thì Java Sun đưa ra các thành phần cải tiến để tránh việc trộn lẫn code và xử lý giao diện và tạo tính đặc thù của giao diện. Chúng đó là
EL expression language
Cách viết tắt ngắn gọn trên trang JSP và che dấu một phần code java được xử lý truy cập
Định nghĩa các tầm vực truy cập là requestScope, pageScope, sessionScope, applicationScope
Cú pháp: ${trị hay biểu thức hay hằng số}
JSTL: JSP Standard Tag Library định nghĩa ra các tag hỗ trợ chức năng xử lý trên trang JSP một cách đơn giản và rõ ràng. Chúng gồm các tag như core, sql, fmt – format, xml, function
Chúng ta đã nắm được cách sử dụng EL và JSTL qua các bài tutorial cụ thể như EJB (xem phần giao diện trình bày của EJB)
Vận dụng MVC vào việc phân tích và cài đặt một ứng dụng cụ thể
Ứng dụng ở đây mô tả việc xây dựng một ứng dụng cung cấp chức năng như sau
Ngưởi dùng muốn truy cập vào hệ thống phải thực hiện login để kiểm tra username và password có hợp lệ hay không
Hệ thống thông qua DB kiểm tra tính xác thực của dữ liệu
Nếu username và password không chính xác hay không tồn tại ứng dụng thông báo cho người dùng thông tin “Invalid username and password” và cho người dùng trở về trang Login thông qua một Link có tên là try again và cung cấp một Link Register cho phép người dùng đăng ký một account mới
Nếu user tồn tại thì chương trình bày form Search. Đặc biệt, trên đầu trang phải sử dụng session để lưu trữ user và tất cả các trang phải có câu “Welcome, tênUser”
Form Search cho phép người dùng tìm kiếm một user bất kỳ khi biết một phần tên của họ
Kết quả Search sẽ trình bày trên lưới dữ liệu
Nếu tìm không thấy sẽ in ra câu “No Result is matched!”
Kết quả trên lưới dữ liệu cho phép người dùng xóa một hàng bất kỳ bằng cách click vào link hay update thông tin về lastname hay roles bằng click nút update trên hàng được lựa chọn
Khi các thao tác update, delete được thực hiện thành công thì lưới dữ liệu sẽ được cập nhật lại và trình bày kết quả cho người dùng
Mô tả yêu cầu của bài trên thể hiện đầy đủ chức năng cơ bản của một ứng dụng thực tế và kết nối DB. Chúng tôi sẽ phân tích và làm bài theo từng chức năng và áp dụng mô hình MVC từng chức năng một từng bước từng bước một.
DB chúng tôi thao tác có dạng như sau
Yêu cầu
Nắm vững các khái niệm về MVC
Nắm vững về ngôn ngữ lập trình Java, lập trình thao tác hướng đối tượng
Cách thức sử dụng JSTL, EL, HTML
Tools sử dụng ở đây là Netbeans 6.9.1
JDK 6 update 22
Server: Tomcat 6.0.26
DBMS: SQL Server 2005
Thư viện hỗ trợ: JSTL 1.1, Driver kết nối database SQLServer (sqljdbc.jar hay sqljdbc4.jar)
Các bước thực hiện
Tạo Web Application tương tư như kết hợp JavaFX với JSP và JDBC
Tên project: MVCDemo
Server: Apache Tomcat 6.0.26
J2EE version: 1.4
Cấu trúc project trên Netbeans như sau
Chúng ta thực hiện chức năng Login
Dựa mô hình phân tích trên chúng ta thấy cần phải tạo ra LoginBean chứa đựng hành vi kiểm tra login của user để có thể sử dụng nhiều lần và rút ngọn code trình bày trên servlet
Cập nhật trang index để đón nhận username và password
Tạo LoginBean cho xử lý với phương thức checkLogin
Lưu ý: add thư viện driver hỗ trợ kết nối SQLServer (sqljdbc.jar, sqljdbc4.jar) vào library
Tạo Bean như sau: click phải chuột trên Source Package, chọn New, chọn Other
Chọn Java trong Categories, chọn Java Class trong File Types
Đặt tên class và đặt package (ở đây tôi đặt sample.mvc)
Click Finish, và cập nhật code như sau
Các thư viện import là java.sql
Tạo Servlet – Controller thực hiện code như sau
Lấy tham số truyền từ client, gọi bean, gọi hàm checkLogin và đưa trang trả về
Tạo trang fail.jsp như sau
Tạo trang welcome.jsp như sau
Dùng EL để lấy giá trị session và trình bày form
Cấu trúc project chúng ta như sau
Start Server Tomcat, Build Project, Deploy và Test
Nếu check sai
Lưu ý: chúng ta thấy trên Address bar không có tên file vì đang áp dụng RequestDispathcher như đã đề cập trong phần Servlet – Controller
Chúng ta thực hiện chức năng Try again và Register khi Login sai
Cập nhật trang fail.jsp như sau
Cập nhật lại Controller như sau
…
Tạo trang register.jsp như sau
Build, Deploy and Test Project
Thực hiện chức năng đăng ký một account mới
Cập nhật thành phần của LoginBean – Model với chức năng insert
Cập nhật lại Controller như sau
Build, Deploy và Testing Project
DB trước khi thao tác
Test
DB sau khi Register
Thực hiện chức năng Search
Kết quả trả về có thể là tập hợp Object, do vậy LoginBean phải được cập nhật thuộc tính để chứa đựng giá trị dữ liệu trả về bao gồm username, lastname, roles
Khai báo các biến properties trong LoginBean
Phát sinh get và set cho các thuộc tính này
Click phải chuột trên code, chọn Refactor, chọn Encapsulate Fields
Nhấn Select All, click chọn Refactor, code sẽ phát sinh các hàm get và set tương ứng
Cập nhật Constructor có 3 tham số và hàm SearchLikeLastName vào LoginBean
Cập nhật Controller để xử lý
Bổ sung định nghĩa về trang show.jsp
Cập nhật nội dung xử lý tương ứng với Search
…
Tạo trang show để lấy dữ liệu từ requestScope để trình bày ra màn hình
Sử dụng JSTL kết hợp với EL, HTML để trình bày dữ liệu ra màn hình
Import thư viện JSTL 1.1 vào library
Gõ JSTL, chọn JSTL 1.1, nhấn Add Library
Tạo trang show.jsp (cấu trúc như hình vẽ trên), cập nhật trang show như sau
Import taglib vào trang, và trình bày dữ liệu
Lưu ý:
Giá trị điền trong EL language ${rows.<tên thuộc tính trong bean Class>} (ví dụ ${rows.username}) đây là field chúng ta lấy từ các thuộc tính có trong LoginBean và nó được tạo ra các get/set method trong tập tin LoginBean class (ở đây là tập tin LoginBean.java)
Các thành phần trong khung xanh là EL expression
Các thành phần trong khung đỏ là JSTL
Build, Deploy và Test Project
Tạo chức năng Delete để delete một hàng dữ liệu chọn bất kỳ trên trang show
Dựa trên mô hình phân tích như trên, chúng ta cần cập nhật trang show như sau
Chúng ta cần phải áp dụng kỹ thuật URL Writing để cập nhật chuỗi query String truyền về server
Chuỗi này cần chứa 03 tham số, tham số thứ nhất chứa hành động thể hiện chúng ta đang thực hiện chức năng delete, tham số thứ 2 chứa giá trị khóa để thực hiện tìm kiếm record cần xóa (username) để đem dữ liệu về server, tham số còn lại chứa tham số đang search trong trang trước để truyền đến phần xử lý của kết quả trang delete để tạo cảm giác lưới được cập nhật. Thực chất của vấn đề này trong bước 6 là chúng ta gọi lại toàn bộ chức năng Search như bước trước đó nhưng gọi trực tiếp bằng code không sử dụng form thông qua controller
Link Delete phải thông qua controller để điều khiển, do vậy chúng ta phải áp dụng JSTL để tạo link với đầy đủ chuỗi query string
Chúng ta cập nhật trang show.jsp như sau
Chúng ta thêm mới chức năng delete cho Login Bean
Chúng ta tiếp tục cập nhật Controller như sau
Build, deploy và test project
DB được cập nhật tương ứng
Chúng ta thực hiện tiếp tục với chức năng Update lastname và roles
Chúng ta cần phải áp dụng kỹ thuật hidden form field để tạo control textbox ẩn chứa giá trị username cần update để đem dữ liệu về server tìm kiếm user tương ứng
Lần nữa chúng ta phải tạo textbox ẩn thứ 2 để chứa tham số đang search trong trang trước để truyền đến phần xử lý của kết quả trang update để tạo cảm giác lưới được cập nhật. Thực chất của vấn đề này trong bước 6 là chúng ta gọi lại toàn bộ chức năng Search như bước trước đó nhưng gọi trực tiếp bằng code không sử dụng form thông qua controller
Chúng ta cần biến giá trị của lastname và roles trở thành 02 control textbox và checkbox để người dùng có thể cập nhật giá trị
Để dữ liệu truyền về server xử lý, chúng ta cần phải có form, và ở đây mỗi hàng là một form – nghĩa là có nhiều form. Nếu chúng ta dùng một form thì giá trị tham số trả về luôn là control đầu tiên – dẫn đến kết quả sai lệch – ở đây chúng ta đang muốn cập nhật đúng hàng đang chọn lựa
Chúng ta cập nhật trang show.jsp như sau
Bổ sung chức năng Update cho LoginBean
Cập nhật chức năng xử lý cho Controller
Build, Deploy và test Project
Nhập liệu chỉnh sửa
Nhấn nút Update
DB được cập nhật
Chúng ta cập nhật bổ sung một tính chất để trang web từ trang trình bày có thể trở về trang trước đó bằng Link Back. Cái này dùng để hoàn thiện đầy đủ ứng dụng web
Chúng ta sẽ áp dụng kỹ thuật JSTL và URL Writing nhưng dựa trên MVC để chúng thấy như các bước trên.
Thanh Address bar trên Browser không bao giờ trình bày trang cụ thể mà chỉ trình bày tham số với Controller thể hiện bản chất của mô hình MVC
Chúng ta cập nhật phần cuối của trang show.jsp
Cập nhật Controller
Build, Deploy và Test project
Chúc mừng các bạn đã hoàn tất và nắm tổng quát khái niệm về MVC, cách thức thiết kế, mô hình ứng dụng và cài đặt ứng dụng web theo mô hình MVC. Qua đó chúng ta thấy được các ưu điểm và khuyết điểm của mô hình này.
Chúng tôi hy vọng nội dung của bài này giúp ích các bạn trong việc cài đặt mô hình ứng dụng web áp dụng MVC
Rất mong sự góp ý chân thành và chia sẻ của quí vị về vấn đề này. Hẹn gặp lại quý vị ở chủ đề khác