Trong bài viết này hướng dẫn tích hợp Apache Wicket với Spring Framework để tạo website
Thư viện sẽ sử dụng trong bài viết này:
- Wicket phiên bản: 1.4.17
- Wicket-Spring phiên bản: 1.4.17
- Spring Framework phiên bản 3.05 RELEASE
- Project Structure:
Cấu trúc thư mục dự án không có gì đặc biệt, chỉ là 1 dự án theo cấu trúc Maven chuẩn
- Project Dependency
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<span class="hljs-tag"><<span class="hljs-name">dependencies</span>></span> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.apache.wicket<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>wicket<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>1.4.17<span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.apache.wicket<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>wicket-spring<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>1.4.17<span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-core<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>3.0.5.RELEASE<span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-context<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>3.0.5.RELEASE<span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-web<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>3.0.5.RELEASE<span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.slf4j<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>slf4j-log4j12<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>1.5.6<span class="hljs-tag"></<span class="hljs-name">version</span>></span> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span> <span class="hljs-tag"></<span class="hljs-name">dependencies</span>></span> |
- Spring Bean
Tạo Spring bean, sử dụng annotate @Service
1 2 3 4 5 6 7 8 |
<span class="hljs-keyword">package</span> vn.framgia.user; <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">HelloService</span> </span>{ <span class="hljs-function">String <span class="hljs-title">getHelloWorldMsg</span><span class="hljs-params">()</span></span>; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="hljs-keyword">package</span> vn.framgia.user; <span class="hljs-keyword">import</span> org.springframework.stereotype.Service; <span class="hljs-meta">@Service</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloServiceImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">HelloService</span> </span>{ <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getHelloWorldMsg</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">return</span> <span class="hljs-string">"Spring : hello world!!!!"</span>; } } |
- Tiêm khởi tạo service trong Spring container
Tạo file applicationContext.xml, thêm tính năng tự động tìm kiếm khởi tạo các component của spring
File : applicationContext.xml
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="hljs-tag"><<span class="hljs-name">beans</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.springframework.org/schema/beans"</span> <span class="hljs-attr">xmlns:xsi</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"</span> <span class="hljs-attr">xmlns:context</span>=<span class="hljs-string">"http://www.springframework.org/schema/context"</span> <span class="hljs-attr">xsi:schemaLocation</span>=<span class="hljs-string">"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"</span>></span> <span class="hljs-comment"><!-- Điền package vào đây để tự động được khởi tạo --></span> <span class="hljs-tag"><<span class="hljs-name">context:component-scan</span> <span class="hljs-attr">base-package</span>=<span class="hljs-string">"vn.framgia.user"</span> /></span> <span class="hljs-tag"></<span class="hljs-name">beans</span>></span> |
- Tích hợp giữa wicket và Spring
Viết lại phương thức init() của WebApplicaion
Và thêm phương thức lắng nghe SpringComponent
1 2 |
addComponentInstantiationListener(<span class="hljs-keyword">new</span> SpringComponentInjector(<span class="hljs-keyword">this</span>)); |
1 2 |
Tạo file WicketApplication.java: |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<span class="hljs-keyword">package</span> vn.framgia; <span class="hljs-keyword">import</span> org.apache.wicket.protocol.http.WebApplication; <span class="hljs-keyword">import</span> org.apache.wicket.spring.injection.annot.SpringComponentInjector; <span class="hljs-keyword">import</span> vn.framgia.user.HelloPage; <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">WicketApplication</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">WebApplication</span> </span>{ <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> Class<HelloPage> <span class="hljs-title">getHomePage</span><span class="hljs-params">()</span> </span>{ <span class="hljs-comment">// return default page</span> <span class="hljs-keyword">return</span> HelloPage.class; } <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">init</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">super</span>.init(); addComponentInstantiationListener(<span class="hljs-keyword">new</span> SpringComponentInjector(<span class="hljs-keyword">this</span>)); } } |
- Tạo một page wicket: một page wicket sẽ bao gồm 1 file java và 1 file html trùng tên
Tạo file HelloPage.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="hljs-keyword">package</span> vn.framgia.user; <span class="hljs-keyword">import</span> org.apache.wicket.PageParameters; <span class="hljs-keyword">import</span> org.apache.wicket.markup.html.basic.Label; <span class="hljs-keyword">import</span> org.apache.wicket.markup.html.WebPage; <span class="hljs-keyword">import</span> org.apache.wicket.spring.injection.annot.SpringBean; <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HelloPage</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">WebPage</span> </span>{ <span class="hljs-comment">// Sử dụng spring jnject.</span> <span class="hljs-meta">@SpringBean</span> <span class="hljs-keyword">private</span> HelloService helloService; <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">SimplePage</span><span class="hljs-params">(<span class="hljs-keyword">final</span> PageParameters parameters)</span> </span>{ add(<span class="hljs-keyword">new</span> Label(<span class="hljs-string">"msg"</span>, helloService.getHelloWorldMsg())); } } |
1 2 |
Tạo file HelloPage.html |
1 2 3 4 5 6 7 8 9 |
<span class="hljs-tag"><<span class="hljs-name">html</span>></span> <span class="hljs-tag"><<span class="hljs-name">body</span>></span> <span class="hljs-tag"><<span class="hljs-name">h1</span>></span>Wicket + Spring integration example<span class="hljs-tag"></<span class="hljs-name">h1</span>></span> <span class="hljs-tag"><<span class="hljs-name">h2</span> <span class="hljs-attr">wicket:id</span>=<span class="hljs-string">"msg"</span>></span><span class="hljs-tag"></<span class="hljs-name">h2</span>></span> <span class="hljs-tag"></<span class="hljs-name">body</span>></span> <span class="hljs-tag"></<span class="hljs-name">html</span>></span> |
- web.xml : Bước cuối cùng cần phải định nghĩa wicket và spring trong file web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<span class="php"><span class="hljs-meta"><?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"ISO-8859-1"</span><span class="hljs-meta">?></span></span> <span class="hljs-tag"><<span class="hljs-name">web-app</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://java.sun.com/xml/ns/j2ee"</span> <span class="hljs-attr">xmlns:xsi</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"</span> <span class="hljs-attr">xsi:schemaLocation</span>=<span class="hljs-string">"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span> <span class="hljs-attr">version</span>=<span class="hljs-string">"2.4"</span>></span> <span class="hljs-tag"><<span class="hljs-name">display-name</span>></span>Wicket Web Application<span class="hljs-tag"></<span class="hljs-name">display-name</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter-name</span>></span>wicket.wicketTest<span class="hljs-tag"></<span class="hljs-name">filter-name</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter-class</span>></span>org.apache.wicket.protocol.http.WicketFilter<span class="hljs-tag"></<span class="hljs-name">filter-class</span>></span> <span class="hljs-tag"><<span class="hljs-name">init-param</span>></span> <span class="hljs-tag"><<span class="hljs-name">param-name</span>></span>applicationClassName<span class="hljs-tag"></<span class="hljs-name">param-name</span>></span> <span class="hljs-tag"><<span class="hljs-name">param-value</span>></span>vn.framgia.WicketApplication<span class="hljs-tag"></<span class="hljs-name">param-value</span>></span> <span class="hljs-tag"></<span class="hljs-name">init-param</span>></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter-mapping</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter-name</span>></span>wicket.wicketTest<span class="hljs-tag"></<span class="hljs-name">filter-name</span>></span> <span class="hljs-tag"><<span class="hljs-name">url-pattern</span>></span>/*<span class="hljs-tag"></<span class="hljs-name">url-pattern</span>></span> <span class="hljs-tag"></<span class="hljs-name">filter-mapping</span>></span> <span class="hljs-tag"><<span class="hljs-name">listener</span>></span> <span class="hljs-tag"><<span class="hljs-name">listener-class</span>></span>org.springframework.web.context.ContextLoaderListener<span class="hljs-tag"></<span class="hljs-name">listener-class</span>></span> <span class="hljs-tag"></<span class="hljs-name">listener</span>></span> <span class="hljs-tag"></<span class="hljs-name">web-app</span>></span> |
- Thực hiện deploy lên server Tomcat
- vào thư mục chứa source code
- Dùng lệnh maven sau để tạo file war:
-
123mvn install -DskipTests
1 2 3 4 5 6 7 8 |
<span class="hljs-number">4</span>. Copy file WicketSpringEx<span class="hljs-selector-class">.war</span> vào thư mục webapp củ<span class="hljs-selector-tag">a</span> Tomcat <span class="hljs-number">5</span>. Vào thư bin củ<span class="hljs-selector-tag">a</span> tomcat khở<span class="hljs-selector-tag">i</span> động tomcat - window: run file startup<span class="hljs-selector-class">.bat</span> - linux or mac: run file startup<span class="hljs-selector-class">.sh</span> <span class="hljs-number">9</span>. Vào trình duyệt start web: http:<span class="hljs-comment">//localhost:8080/WicketSpringEx/</span>  |