Tóm Tắt
Giới thiệu nội dung bài viết
Chào bạn, bạn đang học Spring MVC nhưng chưa hiểu luồng đi của ứng dụng nó chạy như thế nào. Ví dụ như khi người dùng gõ một url như sau vào trình duyệt
http://localhost8080 thì ứng dụng mình sẽ chạy qua các tầng nào của springmvc để trả kết quả là trang home cho người dùng thấy được ?
Trong bài này anh sẽ hướng dẫn mọi người các bước mà spring mvc xử lý một request (yêu cầu) từ người dùng. Anh sẽ đi qua các chủ đề sau
- Luồng đi của ứng dụng Spring MVC
- Video tạo một dự án bằng Spring MVC
1. Luồng đi của ứng dụng MVC qua các tầng
Trước hết mình đi qua hình ảnh về luồng đi của ứng dụng spring mvc gồm có các thành phần nào.
-
Người dùng điền vào tên website mình cần truy cập trên browser sau đó bấm enter. Lúc này mình gửi 1 request lên server nơi mà mình triển khai ứng dụng Spring.
-
Thành phần DispatcherServlet của Spring MVC sẽ nhận được request (yêu cầu) của người dùng ở bước 1. Dispatcher là thành phần quan trọng nhất trong springmvc. Nó sẽ là nơi đầu tiên nhận request từ client sau đó sẽ chuyển request đó tới các controller tương ứng, đồng thời sẽ là chốt chặn cuối cùng trả về kết quả cho client.
-
Sau khi nhận được request(yêu cầu) DispatcherServlet sẽ chuyển yêu cầu đó tới Controller bằng các cơ chế mapping mà ta khai báo trong Handler Mapping. Có 4 cách chúng ta có thể dùng để mapping một request vào controller tương ứng
1- Cách 1 : Dùng BeanNameUrlHandlerMapping
Đây là cơ chế mapping mặc định. Dựa vào tên của URL mà nó sẽ mapping tới controller tương ứng. Anh lấy ví dụ http://localhost/hello thì nó sẽ mapping vào đúng controller HelloController vì nó trùng tên là Hello.
Sử dụng Java configure
1 2 3 4 5 6 7 8 9 10 11 12@Configuration
public
class
BeanNameUrlHandlerMappingConfig
{
@Bean
BeanNameUrlHandlerMappingConfig
beanNameUrlHandlerMapping
()
{
return
new
BeanNameUrlHandlerMapping
();
}
@Bean
(
"/HelloUrl"
)
public
WelcomeController
hello
()
{
return
new
HelloController
();
}
}
Sử dụng XML Configure
1 2<
bean
class
="
org
.
springframework
.
web
.
servlet
.
handler
.
BeanNameUrlHandlerMapping
" /> <bean name="
/
hello
" class="
com
.
levuguyen
.
HelloController
"
/>
2- Cách 2 : Dùng SimpleUrlHandlerMapping
SimpleUrlHandlerMapping thì uyển chuyển hơn BeanNameUrlHandlerMapping. Chúng ta có thể name hoặc url để mapping tới controller tương ứng.
Ví dụ sử dụng Java Confiure.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18@Configuration
public
class
SimpleUrlHandlerMappingConfig
{
@Bean
public
SimpleUrlHandlerMapping
simpleUrlHandlerMapping
()
{
SimpleUrlHandlerMapping
simpleUrlHandlerMapping
=
new
SimpleUrlHandlerMapping
();
Map
<
String
,
Object
>
urlMap
=
new
HashMap
<>();
urlMap
.
put
(
"/simpleUrlWelcome"
,
hello
());
simpleUrlHandlerMapping
.
setUrlMap
(
urlMap
);
return
simpleUrlHandlerMapping
;
}
@Bean
public
HelloController
hello
()
{
return
new
HelloController
();
}
}
- Ví dụ sử dụng XML Configure
1 2 3 4 5 6 7 8 9<
bean
class
="
org
.
springframework
.
web
.
servlet
.
handler
.
SimpleUrlHandlerMapping
"> <property name="
mappings
"> <value> /simpleUrlWelcome=hello /*/simpleUrlWelcome=hello </value> </property> </bean> <bean id="
hello
" class="
com
.
levunguyen
.
HelloController
"
/>
3- Cách 3 : ControllerClassNameHandlerMapping
ControllerClassNameHandlerMapping hiện nay không được hỗ trợ trong version Spring 5.
Chúng ta hoàn toàn có thể cấu hình cách mà URL mapping vào controller theo tên hay theo đường dẫn để mapping vào controller tương ứng.
Sau khi vào controller tương ứng thì từ controller ta gọi services, service gọi repository, repository sẽ sử dụng tầng persistent để thao tác với database lấy dữ liệu .
và chuyển hoá dữ liệu trong database thành model và trả ngược lại cho controller.Controller sẽ trả về tên view (tên trang web ) và model cho Dispatcherletter.
DispatcherServlet sẽ dựa vào tên view mà controller trả về . Nó sẽ đi tìm trang view (thymeleaf,jsp) tương ứng dựa vào việc ta cấu hình Viewresolver mà Dispatcher biết phải tìm thấy trang view ở đâu đồng thời truyền model để trang view hiểu thị dữ liệu. Kết quả cuối cùng là ta có một trang website hoàn chỉnh có HTML và dữ liệu. Chúng ta có thể cấu hình tầng view có thể trả về dạng html, jsp , hoặc xml hoặc json như sau
1 2 3 4 5 6 7 8@Bean
public
ViewResolver
internalResourceViewResolver
()
{
InternalResourceViewResolver
bean
=
new
InternalResourceViewResolver
();
bean
.
setViewClass
(
JstlView
.
class
);
bean
.
setPrefix
(
"/WEB-INF/view/"
);
bean
.
setSuffix
(
".jsp"
);
return
bean
;
}
Chúng ta sử dụng internalResourceViewResolver để cấu hình nơi nào chúng ta đặt các cái view (/WEB-INF/view/). Trang kết quả trả về là html,xml, hoạc jsp (bean.setSuffix(“.jsp”).
- Cuối cùng DispatcherServlet gửi lại kết quả trang web cho client. Như vậy chúng ta thấy trang web được sinh ra ở phía server sau đó nó mới được gửi lại cho người dùng.
2. Và bây giờ, hãy cùng xem code demo ở bên dưới để hiểu rõ hơn nhé
Mọi người hãy Subscribe kênh youtube dưới đây nhé để cập nhật các video mới nhất về kỹ thuật và kỹ năng mềm
Các khoá học lập trình MIỄN PHÍ tại đây