<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Latest posts for the topic "Wicket入門: 一個Wicket+Spring+Hibernate的快速雛形Qwicket"]]></title>
		<link>https://forum.andowson.com/posts/list/5.page</link>
		<description><![CDATA[Latest messages posted in the topic "Wicket入門: 一個Wicket+Spring+Hibernate的快速雛形Qwicket"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>Wicket入門: 一個Wicket+Spring+Hibernate的快速雛形Qwicket</title>
				<description><![CDATA[ 最近想改用符合 MVC 的 Web Framework 來開發網頁應用程式，經過一番尋找後，發現前端用Wicket是個不錯的選擇，可以將HTML和Java完全分開，只要後端再整合Spring，然後透過Spring再去整合Hibernate，就可以存取資料庫。如此一來就變成了Wicket+Spring+Hibernate的架構，只是這樣子一來要學的東西一下子變多了，在看完了Wicket的Hello World範例後，心中的想法是趕快弄個Wicket+Spring+Hibernate三合一的範例來跑跑看，如果不是很複雜，才能繼續花時間下去。 
<br>
<br>
經過一番搜尋後，找到了一個[url=http://www.antwerkz.com/qwicket/app/home]Qwicket[/url]的範例，下載並解壓縮後直接用ant去編譯跟執行，卻發現不太會動，原來是build.xml裡面的maven-ant-task的版本比較舊，要更新到2.0.9才行。經過一番修正後，把一些版本都更新到最新版，再去執行，發現也不太work，原來跟maven repository上面的目錄名稱有點關係，例如hibernate的目錄名稱到了3.3.1.GA之後要改成大寫的GA，而有些軟體雖然在自己的網站上已經推出了較新的版本，但在maven repository上則沒有收錄到，就得先到maven repository上面去查一下，再回來修改。 
<br>
修改完成的build.xml內容大致如下： 
<br>
[code=xml] 
<br>
&lt;project name="Qwicket" default="war" xmlns:artifact="urn:maven-artifact-ant"&gt; 
<br>
<br>
 &lt;property name="version" value="1.0"/&gt; 
<br>
 &lt;property name="dist.file" value="Qwicket-${version}"/&gt; 
<br>
<br>
 &lt;property file="build.properties"/&gt; 
<br>
 &lt;property file="build.default.properties"/&gt; 
<br>
<br>
 &lt;property name="maven.version" value="2.0.9"/&gt; 
<br>
 &lt;property name="maven.ant.file" location="${user.home}/.m2/maven-ant-tasks-${maven.version}.jar"/&gt; 
<br>
 &lt;available file="${maven.ant.file}" property="maven.ant.available"/&gt; 
<br>
 &lt;property name="jetty.version" value="6.1.14"/&gt; 
<br>
 &lt;property name="wicket.version" value="1.3.5"/&gt; 
<br>
 &lt;property name="build.dir" value="build"/&gt; 
<br>
 &lt;property name="src.conf.dir" value="src/conf"/&gt; 
<br>
 &lt;property name="src.java.dir" value="src/java"/&gt; 
<br>
 &lt;property name="src.test.dir" value="src/test"/&gt; 
<br>
 &lt;property name="src.web.dir" value="src/web"/&gt; 
<br>
 &lt;property name="logging.directory" value="/tmp"/&gt; 
<br>
 &lt;property name="report.build.dir" value="${build.dir}/reports"/&gt; 
<br>
 &lt;property name="war.build.dir" value="${build.dir}/war"/&gt; 
<br>
 &lt;property name="javadoc.dir" value="javadoc"/&gt; 
<br>
<br>
 &lt;target name="init" depends="deps"&gt; 
<br>
 &lt;path id="project.class.path"&gt; 
<br>
 &lt;pathelement location="${war.build.dir}/WEB-INF/classes"/&gt; 
<br>
 &lt;pathelement location="${build.dir}/test"/&gt; 
<br>
 &lt;path refid="base.class.path"/&gt; 
<br>
 &lt;path refid="build.class.path"/&gt; 
<br>
 &lt;/path&gt; 
<br>
 &lt;/target&gt; 
<br>
<br>
 &lt;target name="build" depends="init" description="Compiles the source files."&gt; 
<br>
 &lt;mkdir dir="${war.build.dir}/WEB-INF/classes"/&gt; 
<br>
 &lt;mkdir dir="${build.dir}/test"/&gt; 
<br>
 &lt;javac srcdir="${src.java.dir}" classpathref="project.class.path" destdir="${war.build.dir}/WEB-INF/classes" debug="true"/&gt; 
<br>
 &lt;/target&gt; 
<br>
<br>
 &lt;target name="clean"&gt; 
<br>
 &lt;delete dir="${build.dir}"/&gt; 
<br>
 &lt;/target&gt; 
<br>
<br>
 &lt;target name="build-war-structure" depends="build"&gt; 
<br>
 &lt;filter filtersfile="build.default.properties"/&gt; 
<br>
 &lt;filter filtersfile="build.properties"/&gt; 
<br>
 &lt;copy todir="${war.build.dir}"&gt; 
<br>
 &lt;fileset dir="src/web"/&gt; 
<br>
 &lt;/copy&gt; 
<br>
 &lt;copy todir="${war.build.dir}/WEB-INF/classes" filtering="true" overwrite="true"&gt; 
<br>
 &lt;fileset dir="src/web/WEB-INF/classes"/&gt; 
<br>
 &lt;/copy&gt; 
<br>
 &lt;copy todir="${war.build.dir}/WEB-INF/classes"&gt; 
<br>
 &lt;fileset dir="src/java"&gt; 
<br>
 &lt;exclude name="**/*.java"/&gt; 
<br>
 &lt;/fileset&gt; 
<br>
 &lt;/copy&gt; 
<br>
 &lt;copy todir="${war.build.dir}/WEB-INF/lib" flatten="true"&gt; 
<br>
 &lt;fileset refid="runtime.fileset"/&gt; 
<br>
 &lt;/copy&gt; 
<br>
 &lt;delete dir="${war.build.dir}/WEB-INF/lib"&gt; 
<br>
 &lt;include name="servlet*"/&gt; 
<br>
 &lt;/delete&gt; 
<br>
 &lt;copy todir="${war.build.dir}"&gt; 
<br>
 &lt;fileset dir="src/web" includes="**/**"/&gt; 
<br>
 &lt;/copy&gt; 
<br>
 &lt;/target&gt; 
<br>
<br>
 &lt;target name="war" depends="build-war-structure"&gt; 
<br>
 &lt;jar destfile="${build.dir}/${dist.file}.war" basedir="${war.build.dir}"/&gt; 
<br>
 &lt;/target&gt; 
<br>
<br>
 &lt;target name="report-init"&gt; 
<br>
 &lt;mkdir dir="${report.build.dir}"/&gt; 
<br>
 &lt;mkdir dir="${report.build.dir}/pmd"/&gt; 
<br>
 &lt;/target&gt; 
<br>
<br>
 &lt;target name="pmd" depends="report-init"&gt; 
<br>
 &lt;taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="project.class.path"/&gt; 
<br>
 &lt;pmd rulesetfiles="imports,unusedcode,optimizations,basic,design,strictexception,strings,codesize,braces"&gt; 
<br>
 &lt;formatter type="html" toFile="${report.build.dir}/pmd/pmd.html"/&gt; 
<br>
 &lt;fileset dir="${src.java.dir}"&gt; 
<br>
 &lt;include name="**/*.java"/&gt; 
<br>
 &lt;/fileset&gt; 
<br>
 &lt;/pmd&gt; 
<br>
 &lt;/target&gt; 
<br>
<br>
 &lt;target name="javadoc" depends="init" description="Creates Javadoc."&gt; 
<br>
 &lt;delete dir="${javadoc.dir}"/&gt; 
<br>
 &lt;mkdir dir="${javadoc.dir}"/&gt; 
<br>
 &lt;javadoc sourcepath="${src.java.dir}" destdir="${javadoc.dir}" 
<br>
 noqualifier="all" author="true" private="true" version="true" 
<br>
 classpathref="project.class.path"&gt; 
<br>
 &lt;packageset dir="${src.java.dir}"&gt; 
<br>
 &lt;include name="**/**"/&gt; 
<br>
 &lt;/packageset&gt; 
<br>
 &lt;/javadoc&gt; 
<br>
 &lt;/target&gt; 
<br>
<br>
 &lt;target name="reports" depends="build, report-init, pmd, javadoc"/&gt; 
<br>
<br>
 &lt;target name="jetty" depends="build-war-structure"&gt; 
<br>
 &lt;java classname="qwicket.myapp.util.Start" classpathref="project.class.path" fork="yes" failonerror="yes"/&gt; 
<br>
 &lt;/target&gt; 
<br>
<br>
 &lt;target name="maven-ant" unless="maven.ant.available"&gt; 
<br>
 &lt;get src="http://apache.ntu.edu.tw/maven/binaries/maven-ant-tasks-${maven.version}.jar" 
<br>
 dest="${maven.ant.file}"/&gt; 
<br>
 &lt;/target&gt; 
<br>
<br>
 &lt;target name="deps" depends="maven-ant"&gt; 
<br>
 &lt;typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant"&gt; 
<br>
 &lt;classpath&gt; 
<br>
 &lt;pathelement location="${maven.ant.file}"/&gt; 
<br>
 &lt;/classpath&gt; 
<br>
 &lt;/typedef&gt; 
<br>
<br>
 &lt;artifact:remoteRepository id="main" url="http://repo1.maven.org/maven2/"/&gt; 
<br>
 &lt;artifact:remoteRepository id="java.net.repository" 
<br>
 url="https://maven-repository.dev.java.net/nonav/repository/" layout="legacy"/&gt; 
<br>
 &lt;artifact:remoteRepository id="jboss.repository" url="http://repository.jboss.com/maven2/"/&gt; 
<br>
<br>
 &lt;artifact:dependencies pathId="build.class.path" filesetId="build.fileset"&gt; 
<br>
 &lt;remoteRepository refid="jboss.repository"/&gt; 
<br>
 &lt;remoteRepository refid="java.net.repository"/&gt; 
<br>
 &lt;remoteRepository refid="main"/&gt; 
<br>
<br>
 &lt;dependency groupId="org.mortbay.jetty" artifactId="jetty" version="${jetty.version}"/&gt; 
<br>
 &lt;dependency groupId="org.mortbay.jetty" artifactId="jetty-util" version="${jetty.version}"/&gt; 
<br>
 &lt;dependency groupId="dom4j" artifactId="dom4j" version="1.6.1"/&gt; 
<br>
 &lt;dependency groupId="org.apache.ant" artifactId="ant" version="1.7.1"/&gt; 
<br>
 &lt;dependency groupId="pmd" artifactId="pmd" version="4.2.4"/&gt; 
<br>
 &lt;/artifact:dependencies&gt; 
<br>
<br>
 &lt;artifact:dependencies pathId="base.class.path" filesetId="runtime.fileset"&gt; 
<br>
 &lt;remoteRepository refid="jboss.repository"/&gt; 
<br>
 &lt;remoteRepository refid="java.net.repository"/&gt; 
<br>
 &lt;remoteRepository refid="main"/&gt; 
<br>
<br>
 &lt;dependency groupId="oswego-concurrent" artifactId="concurrent" version="1.3.4"/&gt; 
<br>
 &lt;dependency groupId="c3p0" artifactId="c3p0" version="0.9.1.2"/&gt; 
<br>
 &lt;dependency groupId="javax.mail" artifactId="mail" version="1.4.1"/&gt; 
<br>
 &lt;dependency groupId="org.springframework" artifactId="spring" version="2.5.6"/&gt; 
<br>
 &lt;dependency groupId="org.hibernate" artifactId="hibernate-annotations" version="3.4.0.GA"/&gt; 
<br>
 &lt;dependency groupId="org.hibernate" artifactId="hibernate-entitymanager" version="3.4.0.GA"/&gt; 
<br>
 &lt;dependency groupId="org.hibernate" artifactId="hibernate-core" version="3.3.1.GA"/&gt; 
<br>
 &lt;dependency groupId="org.apache.wicket" artifactId="wicket" version="${wicket.version}"/&gt; 
<br>
 &lt;dependency groupId="org.apache.wicket" artifactId="wicket-extensions" version="${wicket.version}"/&gt; 
<br>
 &lt;dependency groupId="org.apache.wicket" artifactId="wicket-spring-annot" version="${wicket.version}"/&gt; 
<br>
 &lt;dependency groupId="org.slf4j" artifactId="slf4j-api" version="1.5.6"/&gt; 
<br>
 &lt;dependency groupId="org.slf4j" artifactId="slf4j-log4j12" version="1.5.6"/&gt; 
<br>
<br>
 &lt;dependency groupId="org.apache.commons" artifactId="commons-email" version="1.1"/&gt; 
<br>
 &lt;dependency groupId="hsqldb" artifactId="hsqldb" version="1.8.0.7"/&gt; 
<br>
 &lt;dependency groupId="postgresql" artifactId="postgresql" version="8.3-603.jdbc3"/&gt; 
<br>
 &lt;/artifact:dependencies&gt; 
<br>
 &lt;/target&gt; 
<br>
<br>
 &lt;target name="update-project" depends="init"&gt; 
<br>
 &lt;taskdef name="mvnProject" classname="qwicket.myapp.util.ProjectConfigTask" classpathref="project.class.path"/&gt; 
<br>
<br>
 &lt;mvnProject idea="../../test-project-files/java.iml"&gt; 
<br>
 &lt;path refid="project.class.path"/&gt; 
<br>
 &lt;/mvnProject&gt; 
<br>
 &lt;/target&gt; 
<br>
&lt;/project&gt; 
<br>
[/code] 
<br>
如果執行完ant沒問題後，可以直接執行ant jetty來執行，然後開啟一個瀏覽器連到http://localhost:8080/來檢查看看能否加入一個會員。 
<br>
另外，要注意的一點是，如果要連到PostgreSQL等其他資料庫要先開好帳號跟密碼及資料庫，例如都叫做qwicket。這部分可以修改web/WEB-INF/classes目錄下的application.properties或application-override.properties檔案。 
<br>
另外，也可以執行ant reports來用PMD檢查看看原來的程式有沒有地方可以改善的。 
<br>
附上我修改過的版本，如果您懶得自己慢慢修改，可以直接使用這個版本來改。 
<br>
參考資料 
<br>
http://www.antwerkz.com/qwicket/app/home 
<br>
http://www.mindrot.org/projects/jBCrypt/ 
<br>
http://wicket.apache.org/examplemarkupinheritance.html]]></description>
				<guid isPermaLink="true">https://forum.andowson.com/posts/preList/286/517.page</guid>
				<link>https://forum.andowson.com/posts/preList/286/517.page</link>
				<pubDate><![CDATA[Mon, 1 Dec 2008 00:54:57]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
	</channel>
</rss>