Với Spring bạn có thể sử dụng XML để cấu hình hoặc
annotation để cấu hình ứng dụng. Thông thường người ta sử dụng cả 2 loại này để
cấu hình ứng dụng. Khi đó annotation chỉ đóng vai trò giảm tải một số thành phần
trong file cấu hình để tránh sự phức tạp khi file cấu hình quá lớn. XML vẫn phải
được sử dụng chính để chứa các khai báo cơ bản nhất của hệ thống hoặc những
bean cũ không sử dụng annotation lúc định nghĩa.
Cầu hình bằng XML
File cấu hình ứng dụng
Trong ứng dụng đơn giản, chúng ta thường cấu hình ứng dụng
với 3 file:
- web.xml
- dispatcher-servlet.xml
- applicationContext.xml
Trong ứng dụng đơn giản, chúng ta thường cấu hình ứng dụng
với 2 file web.xml và dispatcher-servlet.xml:
- web.xml: cấu hình ứng dụng web của java, trong đó có chỉ
ra file cấu hình Spring MVC là dispatcher-servlet.xml
- dispatcher-servlet.xml: cấu hình dành riêng cho ứng dụng
Spring MVC
- applicationContext.xml định nghĩa các bean được chia sẻ
giữa tất cả các servlet. Nếu ứng dụng có nhiều hơn một servlet thì việc xác định
các tài nguyên phổ biến trong applicationContext.ml sẽ có ý nghĩa hơn.
File cấu hình web.xml
File web.xml được sử dụng để cấu hình nhiều công việc
khác nhau cho ứng dụng web nói chung (jsp, servlet, structs, spring v.v) Trong
phần này chúng ta chỉ khai thác các khai báo liên quan đến ứng dụng Spring MVC.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Trong khai báo này thì
org.springframework.web.servlet.DispatcherServlet được sử dụng để tiếp nhận tất
cả các yêu cầu có địa chỉ url (<url-pattern>/
</url-pattern>), nếu <url-pattern>*.jsp</url-pattern> được hiểu
là DispatcherServlet sẽ tiếp nhận tất cả các yêu cầu có địa chỉ url kết thúc bởi
.jsp.
DispatcherServlet sẽ phân giải để chuyển đến các action
phù hợp với các yêu cầu dựa vào định dạng của url.
Hãy lưu ý rằng, trong file cấu hình này chúng ta sử dụng
dispatcher để đặt tên cho servlet (<servlet-name>dispatcher</servlet-name>).
Theo quy ước mặc định của Spring thì file cấu hình Spring sẽ có tên là “<tên
servlet>-servlet.xml”. Và vì vậy trong trường hợp này là dispatcher-servlet.xml.
Nếu chúng ta đặt tên là
<servlet-name>my-config</servlet-name> thì file cấu hình Spring MVC
sẽ là “my-config-servlet.xml”.
File cấu hình
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="codelean.controller"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
Tập tin cấu hình này chứa đúng một thẻ <bean>, thẻ
này chứa các thuộc tính khá phức tạp như:
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"
Các namespace này được khai báo để sử dụng cho các thẻ ở
phần cấu hình. Thông thường, chúng ta dùng đến đầu thì khai báo đến đó. Tuy
nhiên, chúng ta có thể khai báo tất cả những gì cần thiết để chuẩn bị cho các
khả năng có thể sử dụng cho ứng dụng sau này.
ViewResolver
Sau khi một action trong controller hoàn thành nhiệm vụ
thì nó phải chỉ ra view nào cần được sử dụng để hiển thị giao diện kết quả cho
người dùng. Chỉ có tên view được chỉ định trong action còn vị trí đặt view hoặc
phần mở rộng của view thì giao lại cho ViewResolver giải quyết.
Ví dụ: Trong một controller có định nghĩa một action như
sau:
@RequestMapping(value = "/greeting", method = RequestMethod.GET)
public String greeting(){
return "greeting";
}
Với khai báo ViewResolver được cấu hình
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
Khi đó view /WEB-INF/views/greeting.jsp sẽ được lựa chọn
để sinh giao diện.
Cho phép sử dụng
annotation
Trong các ứng dụng Spring MVC phát triển từ 3+ gần như sử
dụng annotation để đơn giải hoá công việc phát triển ứng dụng. Để ứng dụng
Spring nhận biết điều này cần khai báo trong file cấu hình dispatcher-servlet
dòng mã sau:
<mvc:annotation-driven/>
Với khai báo này, trong Spring MVC có thể đánh dấu các
thành phần bằng các annotation:
@Controller
@RequestMapping
@Component
@PostMappling/@GetMapping
@Service
@Autowire
...
Ví trí chứa controller
Khi bạn yêu cần một action, ứng dụng Spring phải truy tìm
phương thức ánh xạ tới action đó thông qua @RequestMapping hoặc @PostMapping hoặc
@GetMapping. Như vậy cần phải biết phương thức của lớpn nào được ánh xạ để thực
hiện yêu cầu với khai báo:
<context:component-scan base-package="codelean.controller"/>
Trong trường hợp này, các lớp controller thuộc gói
codelean.controller sẽ được tham chiếu đến. Trong trường hợp có nhiều
controller thuộc nhiều gói khác nhau thì phải chỉ rõ các gói bằng dấu phẩy.
<context:component-scan base-package="codelean.controller1, codelean.controller2, "/>
Đăng nhận xét