Thứ Hai, 29 tháng 6, 2020

Bài 1: Cấu hình Netbeans và Web Project ứng dụng Spring MVC

Xây dựng ứng dụng CRUD với Spring 5

Bài 1: Cấu hình Netbeans và Web Project ứng dụng Spring MVC

Mã Hoàng Nhật Phi

 

-         Mục đích: Bài viết này tập trung vào cách cấu hình và tạo ứng dụng web sử dụng Spring MVC theo hướng tiếp cận truyền thống (legacy - không sử dụng Spring Boot). Việc xây dựng cấu hình đòi hòi sử dụng build tool là maven để quản lý môi trường.

-         Yêu cầu kiến thức cơ bản:

o      Nắm vững và sử dụng các kỹ năng để về việc xây dựng hoàn tất ứng dụng với mô hình MVC2

o      Nắm vững các khái niệm về ngôn ngữ lập trình Java, lập trình thao

o      Nắm vững các khái niệm về lập trình web sử dụng J2EE hay JavaEE với các kiến thức về Servlet, JSP. (tham khảo bài viết tại địa chỉ http://www.kieutrongkhanh.net/search/label/Servlet%26JSP)

-         Tool sử dụng:

o      Netbeans 8.x (có thể sử dụng Netbeans 11.1)

o      JDK 8 update 66 (update 172)

I.              Giới thiệu

-         Spring là framework phổ biến được chọn để xây dựng các ứng dụng Java. Series bài viết này sẽ giới thiệu quí vị về cách khởi tạo, cấu hình để có một ứng dụng CRUD với Spring Framework 5 và sử dụng build tool với Maven. Với bài này chúng ta thực hiện việc tạo ứng dụng web cơ bản với Netbeans để kiểm tra tool của chúng ta có sẵn sàng để thực hiện ứng dụng với Spring hay không.

II.              Nội dung

1.    Khởi tạo project

-         Chúng ta mở Netbeans để thực hiện tạo web project sử dụng Maven

-         Chúng ta thực hiện tạo maven project mới sử dụng maven để tạo ra một project với skeleton web như sau:

§   Chọn menu File, chọn New Project

§   Trong cửa sổ New Project, trong mục Categories chọn Maven

§   Trong mục Projects, chọn Web Application.

§   Nhấn nút Next

-         Chúng ta định hướng sử dụng maven để quản lý các thư viện. Việc định hướng này sẽ giúp chúng ta có nhiều thuận lợi hơn khi build bởi vì maven sẽ hỗ trợ chung ta cấu hình ứng dụng để chúng ta không cần phải mất thời gian để quản lý các thư viện, các helper tool, version thay đổi của các thư viện.

-         Bước Name and Location xuất hiện, chúng ta thực hiện thiết lập một số tên cấu hình cần thiết như sau (chúng tôi không đề cập đến nhưng thông tin cơ bản của việc xây dựng ứng dụng web thông thường):

§   Group Id là tên đơn vị thực hiện phát triển

§   Artifact Id là tên project của chúng ta

§   Version phát sinh skeleton, chúng ta giữ nguyên như gợi ý của tool

§   Nhấn nút Next sau khi chỉnh sửa các thông số cấu hình

-         Bước Settings xuất hiện,

§   Chúng ta chọn server runtime là apache tomcat 8. Tuy nhiên, bước này không quan trọng vì chúng ta sẽ chạy ứng dụng thông qua maven build tool với server tomcat nhúng bên trong như một thư viện.

§   Chúng ta chọn JavaEE Version là Java EE 6 Web (có thể chọn Java EE 7 Web)

§   Nhấn nút Finish để khởi tạo project

§   Lưu ý:

·        Trong trường hợp tạo project có lỗi phát sinh, lỗi này đa số là do maven mặc định của netbeans có vấn đề.

·        Chúng ta giải quyết như sau

o   Download và cài đặt maven mới trên máy

o   Hay cài đặt netbeans version mới (chúng tôi ở đây thử nghiệm với netbeans 11.1)

o   Sau đó, mở Tools -> Option của Netbeans

o   Chọn Java. Tại vị trí của Maven_Home, mặc định đang chọn là Bundled, chúng ta click browse.. đến thư mục maven mới cài đặt, nhấn Apply và OK

·        Sau khi chỉnh sửa hoàn tất, chúng ta chỉ cần tạo project lại. Mọi việc sẽ ổn.

§   Tiếp theo, chúng ta thực hiện mở File từ menu Window của Netbeans để bổ sung các cấu trúc bổ sung cho việc phát triển ứng dụng

§   Chúng ta chọn tên project đang làm và mở sẽ thấy cấu trúc như hình bên dưới

 

 

-         Đây là cấu trúc thư mục cơ bản sau khi maven đã generate ra cho chúng ta.

-         pom.xml là file xml quản lý các dependencyplugin cho quá trình build và runtime cho maven. Dependency là các thư viện sẽ được maven tự động tải về theo phiên bản mà ta chỉ định.

-         Trong folder src chứa các module con bên trong. Như nội dung hiện có, chúng ta có một module con là main. Trong module main có 2 folder là:

o   java: chứa source code java mà ta sẽ phát triển

o   webapp: chứa các các file liên quan đến web như các static file: jsp, js và các thư mục chứa cấu hình như WEB-INF, META-INF

 

-         Chúng ta bổ sung hai folder là resources vào thư mục mainWEB-INF vào thư mục webapp như hình nêu trên. Folder resources chứa các static file như các file configuration, file xml configuration cho các thành phần trong project.

-         Chúng ta thêm các configuration vào file pom.xml

-         Các properties chứa các thông tin về encoding cho source code, java version của source code và version mục tiêu sẽ được build ra.

-         Ngoài ra ở đây, chúng ta có thể đăt tên biến cho version của các framework, library. Với ví dụ như hình mô tả, chúng ta có biến spring.version với stable version được nhiều ứng dụng dùng hiện tại là 5.2.0.RELEASE

o   Chúng ta có thể truy cập vào một trang maven repository để kiểm tra các version và số người sử dụng dependency mà ta thêm vào project như trang sau:

https://mvnrepository.com/

 

-         Chúng ta  bổ sung thêm các depencies bao gồm:

o   spring-core

o   spring-web

o   spring-webmvc

-         Đối với lại JavaEE 7 thì chúng ta sẽ thay đổi giá trị ${spring.version} thành ${spring-version} như sau

-         Qua việc cấu hình nêu trên, chúng ta sẽ thấy được hiệu quả của đặt biến trong properties. Việc đặt biến như trên sẽ giúp chúng ta có thể lấy các thư viện liên quan theo cấu hình cùng với version cụ thể mà chúng ta không cần phải tốn thời gian điền lại version của thư viện khi chúng ta thực hiện với dự án phần mềm vì việc cập nhật sẽ dễ dàng và nhanh chóng.

-         Chúng ta cần add các plugin sau vào trong tag build để configuration trong quá trình build của maven.

-         Đặt biệt, chúng ta cần chú ý tới plugin tomcat7-maven-plugin vì đây sẽ là plugin server được maven kích chạy khi deploy ứng dụng trong quá trình phát triển của chúng ta.

-         Lưu ý: đối với JavaEE7 thì file cấu hình pom.xml cụ thể sẽ như sau

-         Chúng ta bổ sung thêm file deployment descriptor là web.xml vào folder WEB-INF. Chúng ta thực hiện tạo mới file bằng cách chọn memu File/ new File, chọn Categories WebStandard Deployment Descriptor (web.xml)

-         Chúng ta thực hiện chạy maven install để maven tải các dependency cần thiết để có thể dễ dàng cấu hình front controller của spring framework cho ứng dụng.

-         Chúng ta click phải chuột vào tên project trong cửa sổ Project nằm bên trong Netbeans, chọn Run Maven → Goals để khởi tạo goal cho maven như sau

-         Chúng ta nhập giá trị vào các ô như hình bên dưới

-         Nhấn nút OK, chương trình sẽ download các thư viện và build ứng dụng. Kết quả, chúng ta thành Build success là đạt yêu cầu

-         Chúng ta vừa config và lưu lại lênh maven sau thao tác vừa rồi.

o   Maven sẽ chạy qua 2 goal là cleaninstall

o   Chúng ta có thể tìm hiểu thêm các goal của maven tại link sau: https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

-         Chúng ta thực hiện thêm vào file web.xml các khai báo như sau:

o   Với context param có tên là contextConfigLocation, giá trị này sẽ hỗ trợ spring framework biết location của file chứa cấu hình của ứng dụng.

o   Khai báo một ContextLoaderListener để spring framework load context tại thời điểm deploy.

o   Spring framework sử dụng servlet làm front controller cụ thể là DispatcherServlet. DispatcherServlet là một servlet bình thường do spring cung cấp, ở đây được cấu hình để nhận tất cả các request được gửi đến.

o   Ở đây, chúng ta cũng cấu hình thêm một param contextConfigLocation cho servlet spring-dispatcher để chỉ định file xml cấu hình cho dispatcher servlet. Mặc định nếu chúng ta không khai báo param trên spring sẽ tự tìm file xml ở địa chỉ
WEB-INF/<servlet-name>-servlet.xml (cụ thể trong trường hợp trên là spring-dispatcher-servlet.xml). Do đó, chúng ta nên chỉ định đường dẫn cụ thể (ở đây chúng ta xác định file mvc-config.xml) để tường minh hơn và dễ dàng thay đổi file cấu hình khi cần thiết.

-         Chúng ta thực hiện tạo bổ sung 02 file xml config đang thiếu theo cấu hình ở trên.

o   Chúng ta chọn menu File → New File → Spring Framework trong categories

o   Chúng ta chọn Spring XML Configuration File, nhấn nút Next

o   Chúng ta điền file với tên application-config, nhấn nút Next

 

o   Chúng ta thực hiện chọn các namespace mà ta dự định sẽ sử dụng. Netbeans sẽ hỗ trợ chúng ta thêm nội dung vào file config xml.

o   Chúng ta thực hiện tương tự với file mvc-config.xml để có file như sau

o   Cấu trúc của project hiện tại như sau

-         Các đường dẫn XML Schema trong file config chúng ta vừa tạo được Netbeans phát sinh có chứa các nội dung như sau:

-         Điều này có thể kiến chúng ta phân vân trong quá trình cấu hình do đa phần các phiên bản mà netbeans generate cho ta không chắc tồn tại trên repository của spring framework. Việc này sẽ dẫn đến việc tham chiếu tới địa chỉ không có gợi ý cho việc cấu hình. Do vậy, chúng ta có thể tham khảo ở địa chỉ trên: http://www.springframework.org/schema/ để lấy các schema phù hợp thuận lợi cho quá trình cấu hình ứng dụng.

o   Chúng ta thực hiện chỉnh sửa bổ sung các cấu hình như sau:

§  Tập tin application-config.xml

-         component-scan là tag mà spring framework sẽ lấy giá trị trong đó quét trong package đó các class, interface có các annotation như @Component, @Service, @Controller, @RestController, @Repository để tạo ra spring bean cho ứng dụng.

-         mvc:annotation-driven là ta cho phép config bằng annotation trong java code.

§  Tập tin mvc-config.xml

-         Ở đây, chúng ta thực hiện khai báo một InternalResourceViewResolver bean sẽ spring lấy các file view trong thư mục /WEB-INF/view/ và kết thúc bằng .jsp để rendering. Ngoài ra InternalResourceViewResolver ta còn các template engine khác như Thymeleaf, FreeMaker, Groovy...

-         Chúng ta tiếp tục tạo một java class như sau:

o   Constructor ModelAndView nhận vào hai tham số là tên view sẽ được trả vềmodel để rendering lên view.

o   Như vậy, chúng ta đã đưa vào model một key là message và value là “Spring Framework!!!” trả về cho một view là index.

-         Chúng ta thực hiện tạo trang jsp như sau:

o   Cấu trúc thư mục project khi xem bằng file explorer trong netbeans như sau:

-         Chúng ta tạo là lưu một lệnh maven mới là tomcat như sau:

-         Khi đó maven sẽ chạy ứng dụng và gọi các class cần thiết trong gói thư viện tomcat. Việc này ngược lại với concept bình thường khi deploy ứng dụng là container sẽ gọi ứng dụng, việc này tạo ra sự đơn giản hơn khi phát triển ứng dụng.

-         Chúng ta có thể dùng goal tomcat:run hoặc tomcat7:run để chạy ứng dụng. Quí vị có thể tham khảo thêm phần lưu ý bên dưới để biết cách triển khai ứng dụng spring web bằng gói war trên tomcat.

-         Kết quả thể hiện khi quí vị thực hiện chạy lệnh run như sau

-         Chúng ta truy cập vào đường dẫn được deploy trên trình duyệt vào để xem kết quả.

-         Lưu ý:

o   Trong trường hợp quí vị có một server tomcat sẵn và quí vị mong muốn deploy ứng dụng trên server đó và không chạy và run một server embedded riêng biệt như các bước đã nêu trên. Maven sẽ hỗ trợ quí vị điều đó

o   Ở đây là mặc định Netbeans đã hỗ trợ sẵn một Tomcat trong đó, cụ thể là apache tomcat 8.0.27. Do vậy, chúng ta sẽ bổ sung cấu hình vào file pom.xml như sau

§  Vấn đề là username và password sẽ lấy như thế nào. Chúng ta truy cập vào đường dẫn tomcat-base của server tomcat (hay có tên gọi là cache server của tomcat được cấu hình trong netbeans). Chúng ta thực hiện tìm đường dẫn này như sau:

·        Tại cửa sổ Services trong Netbeans, chúng ta chọn Servers, và click phải chuột trên Apache Tomcat 8.0.27.0, chọn Properites

·        Cửa sổ properties xuất hiện

·        Chúng ta đi đến đường dẫn của Catalina Base. Sau đó, đi đến thư mục conf, tìm tập tin tomcat-users.xml mở nó lên

·        Chúng ta sẽ lấy được username và password của manager-script, ở đây ví dụ sẽ là

§  Chúng ta thực hiện thiết lập goal để deploy ứng dụng với giá trị là tomcat7:deploy hay tomcat7:redeploy

§  Chúng ta thực hiện start server mà chúng ta mong muốn deploy, ở đây sẽ là Apache tomcat 8.0.27.0

§  Thực hiện chạy goal deploy hay redeploy vừa thiết lập, chúng ta sẽ nhận thấy kết quả

§  Kết quả test sẽ tương tự không gì thay đổi. Với ứng dụng được deploy thành công, chúng ta nhìn thấy trong server tomcat có xuất hiện context path của ứng dụng như hình bên dưới

o   Trong trường hợp chúng ta chạy ra lỗi 404 khi ứng dụng được thực thi thì chúng ta sẽ kiếm tra giá trị trong tập tin application-config.xml, cụ thể ở giá trị của base-package="khanhkt.spring5.spring.mvc.controller"

§  Chúng ta sẽ thử với giá trị điền sau như sau base-package="com.phimhn.springmvc"

§  Chúng ta thực hiện clean-install (không có lỗi), và deploy chạy ứng dụng. Kết quả của chúng ta như sau

o   Khi thực hiện deploy và test lại ứng dụng khi có lỗi xảy ra sau khi chúng ta đã khắc phục. Chúng tôi khuyến cáo quí vị nên làm theo các bước như sau để đảm bảo ứng dụng sẽ chạy ổn định và không bị lưu cached hay deploy phát sinh lỗi không rõ

§  Undeploy ứng dụng đang chạy hay đã có lỗi ra khỏi server

§  Sử dụng clean-install để build lại ứng dụng

§  Thực hiện deploy lên server – container lần nữa (có thể là deploy, redeploy hay run tùy theo goal quí vị đã cấu hình)

-         Một ứng dụng spring web hoạt động theo mô hình sau với front controller là DispatcherServlet:

o   Chúng ta sẽ tiếp tục triển khai ứng dụng theo mô hình nêu trên trong loạt bài series tiếp theo về Spring MVC 5.0. Loạt bài viết cung cấp những khái niệm cơ bản trong spring framework để xây dựng một ứng dụng Spring web theo hướng tiếp cận truyền thống. Đồng thời thông qua loạt bài viết sắp tới, chúng ta có thể tường minh hơn về các cấu hình đã được làm tự động của Spring Boot để chúng ta dễ dàng thay đổi cấu hình của ứng dụng khi cần thiết.

 

Chúng ta vừa hoàn tất việc cấu hình tool hỗ trợ xây dựng ứng dụng theo Spring Framework và khung ứng dụng cơ bản để phát triển phần mềm. Rất mong nội dung này sẽ hỗ trợ quí vị trong xây dựng phần mềm và tiếp tục theo dõi loạt bài về xây dựng ứng dụng sử dụng Spring MVC.

 

Rất mong quí vị góp ý về nội dung bài viết này vì bài viết chúng tôi sẽ cung cấp cho quí vị các nội dung về cách làm và chia sẽ các tình huống lỗi thường xuất hiện trong quá trình phát triển. Chúng tôi mong muốn quí vị cùng chia sẻ những lỗi và cách khắc phục khi quí vị phát triển ứng dụng hay thực hiện theo các hướng dẫn của bài viết như là một sự chia sẽ chung cho người đọc khác. Hẹn gặp lại quí vị ở các bài viết sau.

Không có nhận xét nào:

Đăng nhận xét