<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jndi &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/jndi/feed/" rel="self" type="application/rss+xml" />
	<link>https://noter.tw</link>
	<description>一路上踩到的坑、遇到的問題，一點一滴記下來，希望能幫助到需要的人~</description>
	<lastBuildDate>Tue, 02 Jul 2019 05:46:46 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.3</generator>

<image>
	<url>https://noter.tw/wp-content/uploads/cropped-old-1130742_1920-1-32x32.jpg</url>
	<title>jndi &#8211; 記下來</title>
	<link>https://noter.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Struts 1.3 + Spring 3.2 + Hibernate 3.6 錯誤筆記</title>
		<link>https://noter.tw/2418/struts-1-3-spring-3-2-hibernate-3-6-%e9%8c%af%e8%aa%a4%e7%ad%86%e8%a8%98/</link>
					<comments>https://noter.tw/2418/struts-1-3-spring-3-2-hibernate-3-6-%e9%8c%af%e8%aa%a4%e7%ad%86%e8%a8%98/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Fri, 02 Nov 2012 13:58:51 +0000</pubDate>
				<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[Web Server]]></category>
		<category><![CDATA[Servlet]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Struts]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[亂碼]]></category>
		<category><![CDATA[ClassNotFoundException]]></category>
		<category><![CDATA[getDataSource]]></category>
		<category><![CDATA[jndi]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2418</guid>

					<description><![CDATA[<p>買了一本「王者歸來 Java Web 整合開發 (第二版)」，書中包含了 JSP + Servlet + Struts + Hibernate + Spring 等的教學及範例，K了一個星期後，發現最&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2418/struts-1-3-spring-3-2-hibernate-3-6-%e9%8c%af%e8%aa%a4%e7%ad%86%e8%a8%98/" data-wpel-link="internal">Struts 1.3 + Spring 3.2 + Hibernate 3.6 錯誤筆記</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>買了一本「<a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010553897" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>王者歸來 Java Web 整合開發 (第二版)</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a>」，書中包含了 JSP + Servlet + Struts + Hibernate + Spring 等的教學及範例，K了一個星期後，發現最困難的部份竟然在環境架設上，光是環境架設就花了好長的時間，再來是設定檔，小蛙的 Eclipse 有些設定檔的 auto-complete 跑不出東西，加上每個版本的套件下載下來後的 Jar 檔、設定檔都不相同，不同版本的整合方式也不同 &#8230; 花了很久的時間在環境架設及設定檔上，這篇文章不記錄完整經過(忘的差不多了)，只挑著把過程中要注意的事情及錯誤記錄下來。<br />
<span id="more-2418"></span></p>
<ol>
<li>
<h4>隱藏 .jsp 頁面，對外以 .do 為主</h4>
<p>將 jsp 頁面通通放在 <strong><span style="color: #ff0000;">WEB-INF</span></strong> 底下，可自行建立其他分類資料夾，ex. pages, pages/admin, pages/member &#8230; 等。並且在 <strong><span style="color: #ff0000;">struts-conf.xml</span></strong> 中設定</p>
<pre class="brush: xml; gutter: true">&lt;action-mappings&gt;
    &lt;action path="/index" type="org.apache.struts.actions.ForwardAction" parameter="/WEB-INF/pages/index.jsp"&gt;&lt;/action&gt;
&lt;/action-mappings&gt;</pre>
</li>
<li>
<h4>java.lang&nbsp;ClassNotFoundException 各式各樣怪怪的情況</h4>
<p>這情況太容易出現了，小蛙原本使用 Eclipse IDE 裡面自訂 <span style="color: #3366ff;">User Library</span> 的功能，卻一直報錯，最後把所有會用到的 Spring, Struts Jar 通通放在 <strong><span style="color: #ff0000;">Web/WEB-INF/lib</span></strong> 下，這些怪裡怪氣的錯誤就自己消失了 &#8230;</li>
<li>
<h4>亂碼處理</h4>
<p>這應該是最容易遇到的問題，有幾項前提要先遵守：</p>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>R1. &nbsp;必須先將每一頁 JSP 或每一個 Servelt 設定成 <span style="color: #ff0000;"><strong>UTF-8 編碼</strong></span>(小蛙直接用 UTF-8 編碼，可以省掉 BIG5 的一些麻煩)，如果是 Eclipse 專案請確定專案編碼為 UTF-8，有些文字編輯器可以看到目前檔案編碼。</p></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>R2. 設定 JSP 表頭：<br />
<span style="color: #ff0000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &lt;%@ page language=&#8221;java&#8221; contentType=&#8221;text/html; charset=UTF-8&#8243; pageEncoding=&#8221;UTF-8&#8243;%&gt;</strong></span></p></blockquote>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>R3. html meta：<br />
<span style="color: #ff0000;"><strong>&nbsp; &nbsp; &nbsp; &nbsp; &lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=UTF-8&#8243;&gt;</strong></span></p></blockquote>
<p>以上三個一定要指定同一編碼，確定之後接下來四種方法只要選一種來做就可以了：</p>
<ul>
<li>
<h5>勤勞工人法：</h5>
<p>在每個 JSP 頁面及每個 Servelt 中設定</p>
<pre class="brush: java; gutter: true">request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");</pre>
</li>
<li>
<h5>源頭搞定法：</h5>
<p>使用 tomcat 預設過濾器 (在 <span style="color: #ff0000;"><strong>Tomcat安裝目錄/conf/ web.xml</strong></span> 中解開註解)</p>
<pre class="brush: xml; gutter: true">&lt;filter&gt;
    &lt;filter-name&gt;setCharacterEncodingFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.apache.catalina.filters.SetCharacterEncodingFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;encoding&lt;/param-name&gt;
        &lt;param-value&gt;UTF-8&lt;/param-value&gt;
    &lt;/init-param&gt;
    &lt;async-supported&gt;true&lt;/async-supported&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;setCharacterEncodingFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</pre>
</li>
<li>
<h5>自我肯定法：</h5>
<p>自定義過濾器<br />
<strong>CharacterEncodingFilter.java</strong></p>
<pre class="brush: java; gutter: true">package com.hans.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {
	private String characterEncoding;
	@Override
	public void init(FilterConfig config) throws ServletException {
		characterEncoding = config.getInitParameter("encoding");
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding(characterEncoding);
		response.setCharacterEncoding(characterEncoding);
		chain.doFilter(request, response);
	}
	@Override
	public void destroy() {
		characterEncoding = null;
	}
}</pre>
<p>web 下的 <strong>web.xml</strong> 加入對應</p>
<pre class="brush: xml; gutter: true">&lt;filter&gt;
    &lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;com.hans.filter.CharacterEncodingFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;encoding&lt;/param-name&gt;
        &lt;param-value&gt;utf-8&lt;/param-value&gt;
    &lt;/init-param&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</pre>
</li>
<li>
<h5>套件嵌用法：</h5>
<p>使用 Spring 過濾器</p>
<pre class="brush: xml; gutter: true">&lt;filter&gt;
    &lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;encoding&lt;/param-name&gt;
            &lt;param-value&gt;utf-8&lt;/param-value&gt;
    &lt;/init-param&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;forceEncoding&lt;/param-name&gt;
      	&lt;param-value&gt;true&lt;/param-value&gt;
    &lt;/init-param&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</pre>
<p>以上幾種方法可以挑選適用於自己的方法來用，勤勞工人法是比較累一點，每一頁都要記得檢查，不然就可能在表單傳遞的時候發生亂碼。</li>
</ul>
</li>
<li>
<h4>JNDI 錯誤</h4>
<pre>javax.servlet.ServletException: javax.servlet.jsp.JspException: Unable to get connection, DataSource invalid: "org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'"
javax.servlet.ServletException: org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: Unable to get connection, DataSource invalid: "org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'"</pre>
<p>明明設定上沒有什麼問題，卻發生以上 exception，設定檔如下(MySQL)：</p>
<pre class="brush: xml; gutter: true">&lt;Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
	   maxActive="5" maxIdle="2" maxWait="60"
	   username="your_account" password="your_password" driverClassName="com.mysql.jdbc.Driver"
	   url="jdbc:mysql://your_domain:3306/your_database?characterEncoding=UTF-8"/&gt;</pre>
<p class="brush: xml; gutter: true">不管設定在 <span style="color: #ff0000;"><strong>server.xml</strong></span> 的&nbsp;<span style="color: #ff0000;"><strong>&lt;GlobalNamingResources&gt;</strong></span> 標籤中、設定在 <span style="color: #ff0000;"><strong>&lt;Host&gt;</strong></span> 標籤下或是設定在 <span style="color: #ff0000;"><strong>localhost/context.xml</strong></span> 下都會出現上面的錯誤，如果有遇到這樣問題的網友，試試看設定在 <span style="color: #ff0000;"><strong>Tomcat安裝目錄/conf/context.xml</strong></span> 裡面就不會發生這個錯誤囉！如果用這個方法要把&nbsp;<strong>mysql-connector-java-5.1.22-bin.jar</strong> 複製到&nbsp;<span style="color: #ff0000;"><strong>Tomcat安裝目錄/conf/ </strong></span>資料夾下。</p>
<p class="brush: xml; gutter: true">在 Spring 中加入上述 DataSource，可以供其他部份使用(透過 id 指定)</p>
<pre class="brush: xml; gutter: true">&lt;!-- 吃 tomcat 內部設定的 jndi 不然就要自己設定 --&gt;
&lt;bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;
    &lt;property name="jndiName" value="java:comp/env/jdbc/TestDB"&gt;&lt;/property&gt;
&lt;/bean&gt;</pre>
</li>
<li>
<h4>Struts 標籤設定</h4>
<p>前面提到書上的範例是寫</p>
<pre class="brush: java; gutter: true">&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %&gt;
&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %&gt;</pre>
<p class="brush: java; gutter: true">Eclipse 頻頻出現錯誤訊息，後來才查到 1.3 版要改成以下才可以使用</p>
<pre class="brush: java; gutter: true">&lt;%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %&gt;
&lt;%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %&gt;</pre>
</li>
<li>
<h4>struts-conf.xml 錯誤</h4>
<p>如果使用 1.3 的表頭檔是沒辦法設定標籤的</p>
<pre class="brush: xml; gutter: true">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE struts-config
	PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
	"http://struts.apache.org/dtds/struts-config_1_3.dtd"&gt;</pre>
<p class="brush: xml; gutter: true">要把它改成 1.2 版本的，並且要<span style="color: #ff0000;"><strong>注意每個 tag 之間的順序</strong></span>，這邊出錯的時候 Eclipse 會列出順序，照著排就可以了。</p>
<pre class="brush: xml; gutter: true">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE struts-config
	PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
	"http://struts.apache.org/dtds/struts-config_1_2.dtd"&gt;</pre>
</li>
<li>
<h4>Action 中使用 getDataSource 錯誤</h4>
<p>書上的範例以及網路上查到的資料都說在 Struts Action 中，可以透過 <strong>getDataSource(request).getConnection();</strong> 的方式來取得連接池的 Connection，實際上試了之後才會發現<span style="color: #ff0000;"><strong> 1.3 根本就沒有 getDataSource 這個方法</strong></span>，繞了好久才找到必須透過以下方式取得剛剛設定在 context.xml 中的 datasource。</p>
<pre class="brush: java; gutter: true">DataSource ds = (DataSource)new InitialContext().lookup("java:comp/env/jdbc/TestDB");
Connection conn = ds.getConnection();</pre>
</li>
<li>
<h4>Spring, Struts 接合</h4>
<p><span style="color: #000000;">接著設定 </span><strong style="color: #000000;">struts-config.xml</strong><span style="color: #000000;"> 加入 </span><strong style="color: #000000;">&lt;controller&gt;</strong><span style="color: #000000;"> 及 </span><strong style="color: #000000;">&lt;plug-in&gt;</strong><span style="color: #000000;"> 標籤，這邊家玩如果有 </span><strong style="color: #000000;">ClassNotFoundException</strong><span style="color: #000000;"> 一樣參考這篇文章第 2 點說明，Eclipse 有報錯要注意 tag 間的順序。</span></p>
<pre class="brush: xml; gutter: true">&lt;controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"&gt;&lt;/controller&gt;
&lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;
    &lt;set-property value="/WEB-INF/beans-conf.xml" property="contextConfigLocation"/&gt;
&lt;/plug-in&gt;</pre>
<p class="brush: xml; gutter: true">原本 struts-config.xml 中的 action 設定如下</p>
<pre class="brush: xml; gutter: true">&lt;action-mappings&gt;
    &lt;!-- 這種是預設到特定頁面的，為了隱藏 jsp --&gt;
    &lt;action path="/index" type="org.apache.struts.actions.ForwardAction" parameter="/WEB-INF/pages/index.jsp"&gt;&lt;/action&gt;
    &lt;!-- 接合 Spring 後的寫法，注意 action path (struts) 要跟 bean name (spring) 一致--&gt;
    &lt;action path="/hello2"&gt;
        &lt;forward name="helloUser" path="/WEB-INF/pages/footer.jsp"&gt;&lt;/forward&gt;
    &lt;/action&gt;
&lt;/action-mappings&gt;</pre>
<p class="brush: xml; gutter: true">Spring 設定 beans-conf.xml 如下 (範例參考自<a href="http://caterpillar.onlyfun.net/Gossip/SpringGossip/StrutsSpring.html " target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">良葛格學習筆記<span class="wpel-icon wpel-image wpel-icon-6"></span></a>，userChecker 及 HelloAction 請參考 <a href="http://caterpillar.onlyfun.net/Gossip/SpringGossip/StrutsSpring.html " target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">良葛格學習筆記<span class="wpel-icon wpel-image wpel-icon-6"></span></a>)</p>
<pre class="brush: xml; gutter: true">&lt;bean id="userChecker" class="com.hans.pojo.UserChecker"&gt;&lt;/bean&gt;
&lt;!-- bean name 要跟 struts 裡面設定的 action path 一致 --&gt;
&lt;bean name="/hello2" class="com.hans.struts.action.HelloAction2"&gt;
    &lt;property name="userChecker" ref="userChecker" /&gt;
&lt;/bean&gt;</pre>
</li>
<li><strong>Hibernate &#8211;&nbsp;getHibernateTemplate().find() 錯誤</strong><br />
小蛙讓 MemberDao 繼承&nbsp;HibernateDaoSupport 操作資料庫上比較方便，但透過 HibernateTemplate().find() 查找資料的時候(程式碼如下)</p>
<pre class="brush: java; gutter: true">List&lt;Member&gt; list = this.getHibernateTemplate().find("from Member member");
if(list.size() &gt; 0)
    return list.get(0);</pre>
<p>出現以下錯誤</p>
<pre class="brush: actionscript3; gutter: true">javax.servlet.ServletException: org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: member near line 1, column 29 [from com.hans.entity.Member member]; nested exception is org.hibernate.hql.ast.QuerySyntaxException: unexpected token: member near line 1, column 29 [from com.hans.entity.Member member]</pre>
<p>把 <strong>from Member member</strong> 改成 <strong>from member</strong>，出現下面錯誤</p>
<pre class="brush: shell; gutter: true">javax.servlet.ServletException: org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: member near line 1, column 6 [from member]; nested exception is org.hibernate.hql.ast.QuerySyntaxException: unexpected token: member near line 1, column 6 [from member]</pre>
<p>改成&nbsp;from Member 之後才可正常執行，後來在這篇文章看到原來 &#8230; <span style="color: #ff0000;"><strong>member</strong></span> 是保留字 &#8230; 難怪怎麼試都會錯，還以為自己哪裡有問題。</li>
</ol>
<p><strong>參考資料：</strong></p>
<ol>
<li>Struts+Spring+Hibernate项目框架构建中的问题及解决方法集锦（1） @ Morecans的专栏<br />
<address><a href="http://blog.csdn.net/morecans/article/details/1686416" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://blog.csdn.net/morecans/article/details/1686416<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>Spring Gossip: 在 Struts 中整合 Spring @ 良葛格學習筆記<br />
<address><a href="http://caterpillar.onlyfun.net/Gossip/SpringGossip/StrutsSpring.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://caterpillar.onlyfun.net/Gossip/SpringGossip/StrutsSpring.html<span class="wpel-icon wpel-image wpel-icon-6"></span></a>&nbsp;</address>
</li>
<li>Hibernate 查詢數據時報錯，請問這是什麽原因呢？急死了！ @ JWorld@TW<br />
<address><a href="http://www.javaworld.com.tw/jute/post/view?bid=41&amp;id=171839" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://www.javaworld.com.tw/jute/post/view?bid=41&amp;id=171839<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
</ol>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2418/struts-1-3-spring-3-2-hibernate-3-6-%e9%8c%af%e8%aa%a4%e7%ad%86%e8%a8%98/" data-wpel-link="internal">Struts 1.3 + Spring 3.2 + Hibernate 3.6 錯誤筆記</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2418/struts-1-3-spring-3-2-hibernate-3-6-%e9%8c%af%e8%aa%a4%e7%ad%86%e8%a8%98/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Struts 1.3 + Spring 3.2 + Hibernate 3.6 安裝筆記</title>
		<link>https://noter.tw/2511/struts-1-3-spring-3-2-hibernate-3-6-%e5%ae%89%e8%a3%9d%e7%ad%86%e8%a8%98/</link>
					<comments>https://noter.tw/2511/struts-1-3-spring-3-2-hibernate-3-6-%e5%ae%89%e8%a3%9d%e7%ad%86%e8%a8%98/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Fri, 02 Nov 2012 13:58:30 +0000</pubDate>
				<category><![CDATA[資料庫]]></category>
		<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[Web Server]]></category>
		<category><![CDATA[Struts]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JSTL]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jndi]]></category>
		<category><![CDATA[Spring]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2511</guid>

					<description><![CDATA[<p>「王者歸來 Java Web 整合開發 (第二版)」小蛙以為買了這本書可以很快速的打通任督二脈，實際上也花了非常多的時間才把環境架起來，還是必須透過其他的書籍或是網路上的資料才足夠(附在本篇末的參考資&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2511/struts-1-3-spring-3-2-hibernate-3-6-%e5%ae%89%e8%a3%9d%e7%ad%86%e8%a8%98/" data-wpel-link="internal">Struts 1.3 + Spring 3.2 + Hibernate 3.6 安裝筆記</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>「<a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010553897" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>王者歸來 Java Web 整合開發 (第二版)</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a>」小蛙以為買了這本書可以很快速的打通任督二脈，實際上也花了非常多的時間才把環境架起來，還是必須透過其他的書籍或是網路上的資料才足夠(附在本篇末的參考資料中)，這邊粗略的記錄一下整個安裝流程，一直卡關鬱卒到極點，導致一些紀錄可能不那麼完整，正確性有待商榷，但至少在小蛙的環境裡是可以跑的，供參考囉！<strong></strong><br />
<span id="more-2511"></span></p>
<ol>
<li>
<h3>下載 Struts, Spring, Hibernate</h3>
<p>Struts：<a href="http://struts.apache.org/download.cgi#struts1310" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">http://struts.apache.org/download.cgi#struts1310<span class="wpel-icon wpel-image wpel-icon-6"></span></a><br />
Spring：<a href="http://www.springsource.org/node/3720" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">http://www.springsource.org/node/3720<span class="wpel-icon wpel-image wpel-icon-6"></span></a><br />
Hibernate：<a href="http://www.hibernate.org/downloads" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">http://www.hibernate.org/downloads<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li>
<h3>建立 Dynamic Web Project</h3>
<p>在 Eclipse 中的 File<br />
-&gt; New -&gt; Other&#8230;<br />
-&gt; Web -&gt; Dynamic Web Project<br />
-&gt; 輸入完專案名稱後，Next<br />
-&gt; 設定&nbsp;Default output folder: WebContent/WEB-INF/classes<br />
-&gt; Next -&gt;&nbsp;Generate web.xml deployment descriptor 打勾<br />
-&gt; Finish</li>
<li>
<h3>設定Tomcat Context</h3>
<p>在 Tomcat 安裝目錄下/conf/ Server.xml 中設定剛剛的專案，把路徑改成自己的路徑，小蛙沒有把專案建立在 Tomcat 安裝目錄下的 webapps 中</p>
<pre class="brush: xml; gutter: true">&lt;Host name="localhost"  appBase="" unpackWARs="true" autoDeploy="true"&gt;
    &lt;Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"
           pattern="%h %l %u %t &amp;quot;%r&amp;quot; %s %b" /&gt;
    &lt;Context path="/" docBase="G:\spring\mvc\WebContent" reloadable="true" /&gt;
&lt;/Host&gt;</pre>
</li>
<li>
<h3>加入JSTL 1.2</h3>
<p>把 jstl-1.2.jar 放在 專案/WebContent/WEB-INF/lib 目錄下，才可以用以下 jstl 功能，之前查到很多像是要把 tld 放在哪哩，要下載一堆有的沒的檔案，後來發現其實從 <a href="http://jstl.java.net/download.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">JSTL 1.2 <span class="wpel-icon wpel-image wpel-icon-6"></span></a>&nbsp;下載<span style="color: #ff0000;"><strong>&nbsp;javax.servlet.jsp.jstl-1.2.1.jar</strong></span> 跟&nbsp;<strong><span style="color: #ff0000;">javax.servlet.jsp.jstl-api-1.2.1.jar</span> </strong>就可以了。在有使用到 JSTL 的頁面最上方加入宣告</p>
<pre class="brush: java; gutter: true">&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %&gt;
&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %&gt;
&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %&gt;
&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %&gt;
&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="xml" %&gt;</pre>
</li>
<li>
<h3>設置JNDI</h3>
<p>在 Tomcat 安裝目錄/conf/context.xml 中加入</p>
<pre class="brush: xml; gutter: true">&lt;Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
    maxActive="5" maxIdle="2" maxWait="60"
    username="your_account" password="your_password" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://your_domain:3306/your_database?characterEncoding=UTF-8"/&gt;</pre>
<p class="brush: xml; gutter: true">小蛙之前不管設定在&nbsp;<span style="color: #ff0000;"><strong>server.xml</strong></span>&nbsp;的&nbsp;<span style="color: #ff0000;"><strong>&lt;GlobalNamingResources&gt;</strong></span>&nbsp;標籤中、設定在&nbsp;<span style="color: #ff0000;"><strong>&lt;Host&gt;</strong></span>&nbsp;標籤下或是設定在&nbsp;<span style="color: #ff0000;"><strong>localhost/context.xml</strong>&nbsp;</span>下都會出現錯誤，所以就乾脆設定在上述路徑的<span style="color: #ff0000;"><strong> context.xml</strong></span> 中。如果用這個方法要把&nbsp;<strong>mysql-connector-java-5.1.22-bin.jar</strong>&nbsp;複製到&nbsp;<strong>Tomcat安裝目錄/conf/&nbsp;</strong>資料夾下。可參考 <a href="http://wazai.net/2418/struts-1-3-spring-3-2-hibernate-3-6-錯誤筆記" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>Struts 1.3 + Spring 3.2 + Hibernate 3.6 錯誤筆記</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a>。</p>
</li>
<li>
<h3>在web.xml中加入外部資源設定</h3>
<p>網路上查到的資料是說要加入該設定，但小蛙沒加也沒有出錯，保險起見還是加上去吧！</p>
<pre class="brush: xml; gutter: true">&lt;description&gt;MySQL Test App&lt;/description&gt;
&lt;resource-ref&gt;
    &lt;description&gt;DB Connection&lt;/description&gt;
    &lt;res-ref-name&gt;jdbc/TestDB&lt;/res-ref-name&gt;
    &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
    &lt;res-auth&gt;Container&lt;/res-auth&gt;
&lt;/resource-ref&gt;</pre>
</li>
<li>
<h3>加入並檢查必須的Jar檔</h3>
<p>小蛙的 lib 資料夾下包括以下檔案(省得有時候會有少 class 的麻煩 &#8230; 小蛙直接把所有的 jar 丟進去)：</p>
<pre class="brush: text; gutter: true">antlr-2.7.2.jar                           bsf-2.3.0.jar
commons-beanutils-1.8.0.jar               commons-chain-1.2.jar
commons-digester-1.8.jar                  commons-fileupload-1.2.2.jar
commons-io-2.4.jar                        commons-lang3-3.1.jar
commons-logging-1.0.4.jar                 commons-validator-1.3.1.jar
javax.servlet.jsp.jstl-1.2.1.jar          javax.servlet.jsp.jstl-api-1.2.1.jar
mysql-connector-java-5.1.22-bin.jar       oro-2.0.8.jar
spring-aop-3.2.0.M1.jar                   spring-asm-3.2.0.M1.jar
spring-aspects-3.2.0.M1.jar               spring-beans-3.2.0.M1.jar
spring-context-3.2.0.M1.jar               spring-context-support-3.2.0.M1.jar
spring-core-3.2.0.M1.jar                  spring-expression-3.2.0.M1.jar
spring-instrument-3.2.0.M1.jar            spring-instrument-tomcat-3.2.0.M1.jar
spring-jdbc-3.2.0.M1.jar                  spring-jms-3.2.0.M1.jar
spring-orm-3.2.0.M1.jar                   spring-oxm-3.2.0.M1.jar
spring-struts-3.2.0.M1.jar                spring-test-3.2.0.M1.jar
spring-tx-3.2.0.M1.jar                    spring-web-3.2.0.M1.jar
spring-webmvc-3.2.0.M1.jar                spring-webmvc-portlet-3.2.0.M1.jar
struts-core-1.3.10.jar                    struts-el-1.3.10.jar
struts-extras-1.3.10.jar                  struts-faces-1.3.10.jar
struts-mailreader-dao-1.3.10.jar          struts-scripting-1.3.10.jar
struts-taglib-1.3.10.jar                  struts-tiles-1.3.10.jar</pre>
</li>
<li>
<h3>設定讓Struts接管*.do請求</h3>
<p>在 web.xml 加入註解的那段，其他原本的 web.xml 設定別動到。</p>
<pre class="brush: xml; gutter: true">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0"&gt;
    &lt;!-- Standard Action Servlet Configuration --&gt;
    &lt;servlet&gt;
        &lt;!-- 從這裡開始複製 --&gt;
	&lt;servlet-name&gt;action&lt;/servlet-name&gt;
	&lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;
	&lt;init-param&gt;
		&lt;param-name&gt;config&lt;/param-name&gt;
		&lt;param-value&gt;/WEB-INF/struts-conf.xml&lt;/param-value&gt;
	&lt;/init-param&gt;
	&lt;init-param&gt;
		&lt;param-name&gt;debug&lt;/param-name&gt;
		&lt;param-value&gt;3&lt;/param-value&gt;
	&lt;/init-param&gt;
	&lt;init-param&gt;
		&lt;param-name&gt;detail&lt;/param-name&gt;
		&lt;param-value&gt;3&lt;/param-value&gt;
	&lt;/init-param&gt;
	&lt;load-on-startup&gt;0&lt;/load-on-startup&gt;
    &lt;!-- Standard Action Servlet Mapping --&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;action&lt;/servlet-name&gt;
        &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;
    &lt;!-- 複製到這裡 --&gt;
    &lt;/servlet&gt;
&lt;/web-app&gt;</pre>
</li>
<li>
<h3>新增struts-conf.xml</h3>
<p>在專案/WebContent/WEB-INF/ 下新增 struts-conf.xml</p>
<pre class="brush: xml; gutter: true">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE struts-config
    PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
    "http://struts.apache.org/dtds/struts-config_1_2.dtd"&gt;
&lt;struts-config&gt;
    &lt;!-- 設定放在這邊 --&gt;
&lt;/struts-config&gt;</pre>
</li>
<li>
<h3>測試.do轉向</h3>
<p>在 WebContent 下建立 index.jsp ，測試 Struts 是否能將正常做 .do 轉向。在 struts-conf.xml 中加入</p>
<pre class="brush: xml; gutter: true">&lt;action-mappings&gt;
    &lt;action path="/index" type="org.apache.struts.actions.ForwardAction" parameter="/index.jsp"&gt;&lt;/action&gt;
&lt;/action-mappings&gt;</pre>
<p class="brush: xml; gutter: true">重新啟動 Tomcat，試試看透過 htpp://localhost:8080/index.do 能不能正確轉向到設定的 index.jsp。</p>
</li>
<li>
<h3>設定過濾器，解決中文亂碼-Tomcat預設過濾器 (跟 12. 選一個使用即可)</h3>
<p>在 tomcat 安裝目錄/conf/web.xml，找到下面這段，把它反註解(預設應該是被註解起來的)</p>
<pre class="brush: xml; gutter: true">&lt;filter&gt;
    &lt;filter-name&gt;setCharacterEncodingFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.apache.catalina.filters.SetCharacterEncodingFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;encoding&lt;/param-name&gt;
        &lt;param-value&gt;UTF-8&lt;/param-value&gt;
    &lt;/init-param&gt;
    &lt;async-supported&gt;true&lt;/async-supported&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;setCharacterEncodingFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</pre>
</li>
<li>
<h3>設定過濾器，解決中文亂碼-Spring過濾器 (跟 11. 選一個使用即可)</h3>
<p>在 專案/WebContent/WEB-INF/web.xml 中加入</p>
<pre class="brush: xml; gutter: true">&lt;filter&gt;
    &lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;encoding&lt;/param-name&gt;
        &lt;param-value&gt;utf-8&lt;/param-value&gt;
    &lt;/init-param&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;forceEncoding&lt;/param-name&gt;
        &lt;param-value&gt;true&lt;/param-value&gt;
    &lt;/init-param&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</pre>
</li>
<li>
<h3>新增spring-conf.xml</h3>
<p>在 專案/WebContent/WEB-INF/ 下新增 spring-conf.xml</p>
<pre class="brush: xml; gutter: true">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"&gt;
&lt;/beans&gt;</pre>
</li>
<li>
<h3>Spring接合Struts</h3>
<p>在 struts-conf.xml 加入 (有另外的方法是 Listener 這邊不提)</p>
<pre class="brush: xml; gutter: true">&lt;action-mappings&gt;
    &lt;action path="/hello2"&gt;
        &lt;forward name="helloUser" path="/index.jsp"&gt;&lt;/forward&gt;
    &lt;/action&gt;
&lt;/action-mappings&gt;
&lt;controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"&gt;&lt;/controller&gt;
&lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;
    &lt;set-property value="/WEB-INF/spring-conf.xml" property="contextConfigLocation"/&gt;
&lt;/plug-in&gt;</pre>
<p class="brush: xml; gutter: true">在 spring-conf.xml 加入 (bean name 要跟上面的 action path 一致)<br />
(範例參考自良葛格學習筆記，userChecker 及 HelloAction 請參考 <strong><a href="http://caterpillar.onlyfun.net/Gossip/SpringGossip/StrutsSpring.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">良葛格學習筆記<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong>)</p>
<pre class="brush: xml; gutter: true">&lt;bean id="userChecker" class="com.hans.pojo.UserChecker"&gt;&lt;/bean&gt;
&lt;bean name="/hello2" class="com.hans.struts.action.HelloAction2"&gt;
    &lt;property name="userChecker" ref="userChecker" /&gt;
&lt;/bean&gt;</pre>
</li>
<li>
<h3>測試使用代理方式與ActionForm</h3>
<p>index.jsp</p>
<pre class="brush: html; gutter: true">&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
&lt;%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %&gt;
&lt;%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %&gt;
&lt;!DOCTYPE html&gt;
&lt;html lang="zh-TW"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
&lt;title&gt;Login&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;html:form action="/login"&gt;
		&lt;html:text property="username"&gt;&lt;/html:text&gt;&lt;br /&gt;
		&lt;html:password property="password"&gt;&lt;/html:password&gt;&lt;br /&gt;
		&lt;html:submit&gt;送出&lt;/html:submit&gt; &lt;html:reset&gt;清除&lt;/html:reset&gt;
	&lt;/html:form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p class="brush: html; gutter: true">LoginForm.java</p>
<pre class="brush: java; gutter: true">import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class LoginForm extends ActionForm {
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public void reset(ActionMapping mapping, HttpServletRequest request) {
		username = null;
		password = null;
	}
}</pre>
<p class="brush: java; gutter: true">LoginAction.java</p>
<pre class="brush: java; gutter: true">import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.hans.struts.action.form.LoginForm;
public class LoginAction extends Action {
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		LoginForm loginForm = (LoginForm)form;
		if("hans".equals(loginForm.getUsername()) &amp;&amp; "123456".equals(loginForm.getPassword())){
			return mapping.findForward("success");
		}
		return mapping.findForward("error");
	}
}</pre>
<p class="brush: java; gutter: true">struts-conf.xml 加上</p>
<pre class="brush: xml; gutter: true">&lt;!-- 這行沒加會一直提醒找不到 /login --&gt;
&lt;form-beans&gt;
    &lt;form-bean name="LoginForm" type="com.hans.struts.action.form.LoginForm"&gt;&lt;/form-bean&gt;
&lt;/form-beans&gt;
&lt;action-mappings&gt;
    &lt;action path="/index" type="org.apache.struts.actions.ForwardAction" parameter="/index.jsp"&gt;&lt;/action&gt;
    &lt;!-- scope 要寫 --&gt;
    &lt;action path="/login" name="LoginForm" scope="request"&gt;
	&lt;forward name="success" path="/WEB-INF/pages/login_success.jsp"&gt;&lt;/forward&gt;
	&lt;forward name="error" path="/index.do" redirect="true"&gt;&lt;/forward&gt;
    &lt;/action&gt;
&lt;/action-mappings&gt;</pre>
<p class="brush: xml; gutter: true">spring-conf.xml</p>
<pre class="brush: xml; gutter: true">&lt;bean name="/login" class="com.hans.struts.action.LoginAction"&gt;&lt;/bean&gt;</pre>
</li>
<li>
<h3>加入Hibernate</h3>
<p>小蛙的 lib 下包含</p>
<pre class="brush: text; gutter: true">antlr-2.7.6.jar                            bsf-2.3.0.jar
c3p0-0.9.1.jar                             commons-beanutils-1.8.0.jar
commons-chain-1.2.jar                      commons-collections-3.1.jar
commons-digester-1.8.jar                   commons-fileupload-1.2.2.jar
commons-io-2.4.jar                         commons-lang3-3.1.jar
commons-logging-1.0.4.jar                  commons-validator-1.3.1.jar
dom4j-1.6.1.jar                            hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate3.jar                             javassist-3.12.0.GA.jar
javax.servlet.jsp.jstl-1.2.1.jar           javax.servlet.jsp.jstl-api-1.2.1.jar
jta-1.1.jar                                mysql-connector-java-5.1.22-bin.jar
oro-2.0.8.jar                              slf4j-api-1.6.1.jar
spring-aop-3.2.0.M1.jar                    spring-asm-3.2.0.M1.jar
spring-aspects-3.2.0.M1.jar                spring-beans-3.2.0.M1.jar
spring-context-3.2.0.M1.jar                spring-context-support-3.2.0.M1.jar
spring-core-3.2.0.M1.jar                   spring-expression-3.2.0.M1.jar
spring-instrument-3.2.0.M1.jar             spring-instrument-tomcat-3.2.0.M1.jar
spring-jdbc-3.2.0.M1.jar                   spring-jms-3.2.0.M1.jar
spring-orm-3.2.0.M1.jar                    spring-oxm-3.2.0.M1.jar
spring-struts-3.2.0.M1.jar                 spring-test-3.2.0.M1.jar
spring-tx-3.2.0.M1.jar                     spring-web-3.2.0.M1.jar
spring-webmvc-3.2.0.M1.jar                 spring-webmvc-portlet-3.2.0.M1.jar
standard-1.0.6.jar                         struts-core-1.3.10.jar
struts-el-1.3.10.jar                       struts-extras-1.3.10.jar
struts-faces-1.3.10.jar                    struts-mailreader-dao-1.3.10.jar
struts-scripting-1.3.10.jar                struts-taglib-1.3.10.jar
struts-tiles-1.3.10.jar</pre>
</li>
<li>
<h3>設定Hibernate環境</h3>
<p>這邊討厭鬼的這篇文章 &#8211;&nbsp;<a href="http://nerdyworld.pixnet.net/blog/post/22404179" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>Struts2+Spring+Hibernate架構配置教學(Hibernate)上 @ 討厭鬼教學</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a> 寫的非常清楚。</li>
<li>
<h3>測試Hibernate</h3>
<p>先建立一個資料庫環境，資料表隨便設定(不一定要照小蛙的，可以越簡單越好，只要有id, m_id, email, name就好)，note: 這只是一個很無聊的範例，確定一下 Hibernate, Struts, Spring 是否三者已經可以結合使用。小蛙自己的 table 為</p>
<pre class="brush: sql; gutter: true">CREATE TABLE IF NOT EXISTS `member` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `m_id` varchar(50) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `gender` char(1) DEFAULT NULL,
  `email` varchar(50) NOT NULL,
  `cdate` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `oriPlace` varchar(30) DEFAULT NULL,
  `nowPlace` varchar(30) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `m_id` (`m_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;</pre>
<p class="brush: sql; gutter: true">index.jsp</p>
<pre class="brush: html; gutter: true">&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
&lt;%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %&gt;
&lt;%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %&gt;
&lt;!DOCTYPE html&gt;
&lt;html lang="zh-TW"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
&lt;title&gt;Login&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;html:form action="/login"&gt;
		&lt;html:text property="username"&gt;&lt;/html:text&gt;&lt;br /&gt;
		&lt;html:password property="password"&gt;&lt;/html:password&gt;&lt;br /&gt;
		&lt;html:submit&gt;送出&lt;/html:submit&gt; &lt;html:reset&gt;清除&lt;/html:reset&gt;
	&lt;/html:form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p class="brush: sql; gutter: true">LoginAction.java</p>
<pre class="brush: java; gutter: true">package com.hans.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.hans.dao.IMemberDao;
import com.hans.entity.Member;
import com.hans.struts.action.form.LoginForm;
public class LoginAction extends Action {
	private IMemberDao dao;
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		LoginForm loginForm = (LoginForm)form;
		if("search".equals(loginForm.getUsername())){
			// 如果是 search 就取出第一筆資料的 mid
			Member m = dao.find(1);
			if(m != null)
				request.setAttribute("ID", m.getMId());
			return mapping.findForward("success");
		}else if("add".equals(loginForm.getUsername())){
			// 如果是 add，就新增一筆 abc, abc@gmail.com 的資料
			Member m = new Member();
			m.setEmail("abc@gmail.com");
			m.setName("abc");
			dao.insert(m);
			request.setAttribute("ID", "新增完成");
			return mapping.findForward("success");
		}
		return mapping.findForward("error");
	}
	public IMemberDao getDao() {
		return dao;
	}
	public void setDao(IMemberDao dao) {
		this.dao = dao;
	}
}</pre>
<p class="brush: sql; gutter: true">IMemberDao.java</p>
<pre class="brush: java; gutter: true">package com.hans.dao;
import com.hans.entity.Member;
public interface IMemberDao {
	public void insert(Member member);
	public Member find(Integer id);
}</pre>
<p class="brush: sql; gutter: true">Member.java (這個是 Hibernate Tool 直接透過資料庫產生的)</p>
<pre class="brush: java; gutter: true">package com.hans.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
 * Member generated by hbm2java
 */
@Entity
@Table(name = "member", catalog = "letsgo")
public class Member implements java.io.Serializable {
	private Integer id;
	private String MId;
	private String name;
	private Character gender;
	private String email;
	private Date cdate;
	private String oriPlace;
	private String nowPlace;
	private Date birthday;
	public Member() {
	}
	public Member(String email) {
		this.email = email;
	}
	public Member(String MId, String name, Character gender, String email,
			Date cdate, String oriPlace, String nowPlace, Date birthday) {
		this.MId = MId;
		this.name = name;
		this.gender = gender;
		this.email = email;
		this.cdate = cdate;
		this.oriPlace = oriPlace;
		this.nowPlace = nowPlace;
		this.birthday = birthday;
	}
	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id", unique = true, nullable = false)
	public Integer getId() {
		return this.id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	@Column(name = "m_id", length = 50)
	public String getMId() {
		return this.MId;
	}
	public void setMId(String MId) {
		this.MId = MId;
	}
	@Column(name = "name", length = 20)
	public String getName() {
		return this.name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Column(name = "gender", length = 1)
	public Character getGender() {
		return this.gender;
	}
	public void setGender(Character gender) {
		this.gender = gender;
	}
	@Column(name = "email", nullable = false, length = 50)
	public String getEmail() {
		return this.email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "cdate", length = 19)
	public Date getCdate() {
		return this.cdate;
	}
	public void setCdate(Date cdate) {
		this.cdate = cdate;
	}
	@Column(name = "oriPlace", length = 30)
	public String getOriPlace() {
		return this.oriPlace;
	}
	public void setOriPlace(String oriPlace) {
		this.oriPlace = oriPlace;
	}
	@Column(name = "nowPlace", length = 30)
	public String getNowPlace() {
		return this.nowPlace;
	}
	public void setNowPlace(String nowPlace) {
		this.nowPlace = nowPlace;
	}
	@Temporal(TemporalType.DATE)
	@Column(name = "birthday", length = 10)
	public Date getBirthday() {
		return this.birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}</pre>
<p class="brush: sql; gutter: true">MemberDao.java</p>
<pre class="brush: java; gutter: true">package com.hans.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.hans.entity.Member;
public class MemberDao extends HibernateDaoSupport implements IMemberDao {
	@Override
	public void insert(Member member) {
		this.getHibernateTemplate().persist(member);
	}
	@Override
	public Member find(Integer id) {
		List&lt;Member&gt; list = this.getHibernateTemplate().find("from Member");
		if(list.size() &gt; 0)
			return list.get(0);
		return null;
	}
}</pre>
<p class="brush: java; gutter: true">login_success.xml (放在 WEB-INF/pages/ 下)</p>
<pre class="brush: html; gutter: true">&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
&lt;!DOCTYPE html&gt;
&lt;html lang="zh-TW"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
&lt;title&gt;Login Success&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%=request.getAttribute("ID") %&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p class="brush: sql; gutter: true">struts-conf.xml</p>
<pre class="brush: xml; gutter: true">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE struts-config
	PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
	"http://struts.apache.org/dtds/struts-config_1_2.dtd"&gt;
&lt;struts-config&gt;
    &lt;form-beans&gt;
        &lt;form-bean name="LoginForm" type="com.hans.struts.action.form.LoginForm"&gt;&lt;/form-bean&gt;
    &lt;/form-beans&gt;
	&lt;action-mappings&gt;
                &lt;!-- 直接轉 --&gt;
		&lt;action path="/index" type="org.apache.struts.actions.ForwardAction" parameter="/index.jsp"&gt;&lt;/action&gt;
                &lt;!-- 設定路徑, form-bean, scope 及轉向 --&gt;
		&lt;action path="/login" name="LoginForm" scope="request"&gt;
		    &lt;forward name="success" path="/WEB-INF/pages/login_success.jsp"&gt;&lt;/forward&gt;
		    &lt;forward name="error" path="/index.do" redirect="true"&gt;&lt;/forward&gt;
		&lt;/action&gt;
	&lt;/action-mappings&gt;
	&lt;controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"&gt;&lt;/controller&gt;
	&lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;
		&lt;set-property value="/WEB-INF/spring-conf.xml" property="contextConfigLocation"/&gt;
	&lt;/plug-in&gt;
&lt;/struts-config&gt;</pre>
<p class="brush: sql; gutter: true">spring-conf.xml</p>
<pre class="brush: xml; gutter: true">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"&gt;
        &lt;!-- 當使用者送出表單到 /login.do 後，注入 dao，該 dao 參考到最下面設定的 memberDao --&gt;
	&lt;bean name="/login" class="com.hans.struts.action.LoginAction"&gt;
	    &lt;property name="dao" ref="memberDao"&gt;&lt;/property&gt;
	&lt;/bean&gt;
	&lt;!-- 吃 tomcat 內部設定的 jndi 不然就要自己設定 --&gt;
	&lt;bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;
            &lt;property name="jndiName" value="java:comp/env/jdbc/TestDB"&gt;&lt;/property&gt;
	&lt;/bean&gt;
	&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&gt;
	    &lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt;
	    &lt;property name="annotatedClasses"&gt;
	        &lt;list&gt;
	            &lt;value&gt;com.hans.entity.Member&lt;/value&gt;
	        &lt;/list&gt;
	    &lt;/property&gt;
	    &lt;property name="hibernateProperties"&gt;
	        &lt;props&gt;
	            &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQL5Dialect&lt;/prop&gt;
	            &lt;prop key="hibernate.format_sql"&gt;true&lt;/prop&gt;
	            &lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;
	        &lt;/props&gt;
	    &lt;/property&gt;
	&lt;/bean&gt;
	&lt;bean id="memberDao" class="com.hans.dao.MemberDao"&gt;
	    &lt;property name="sessionFactory" ref="sessionFactory"&gt;&lt;/property&gt;
	&lt;/bean&gt;
    &lt;context:annotation-config/&gt;
&lt;/beans&gt;</pre>
<p class="brush: sql; gutter: true">當使用者在 index.do 表單輸入 search，則列出資料表第一筆資料的 m_id，若輸入 add，則新增一筆 email 為 abc@gmail.com 且 name 為 abc 的資料，執行的結果可以自行到資料庫中查看。</p>
</li>
</ol>
<p>到這邊已經把整個基本入門的環境架起來了，剩下的 &#8230; 要加油囉！說起來慚愧，小蛙總共花了 2 個星期才把環境及 Struts, Spring, Hibernate 串聯起來(還不太會使用喔) &#8230; 希望之後越來越順手！！！！過程中有發生錯誤情況，可參考&nbsp;<a href="http://wazai.net/2418/struts-1-3-spring-3-2-hibernate-3-6-錯誤筆記" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>Struts 1.3 + Spring 3.2 + Hibernate 3.6 錯誤筆記 @ 蛙齋</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a>，Good Luck!!!<br />
<strong>參考資料：</strong></p>
<ol>
<li>程式設計SSH分類 @ 討厭鬼教學<br />
<address><a href="http://nerdyworld.pixnet.net/blog/category/429960" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://nerdyworld.pixnet.net/blog/category/429960<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>JSP Standard Tag Library<br />
<address><a href="http://jstl.java.net/download.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://jstl.java.net/download.html<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>Struts @ The Apache Software Foundation<br />
<address><a href="http://struts.apache.org/download.cgi#struts1310" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://struts.apache.org/download.cgi#struts1310<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>Spring @ SpringSource Community<br />
<address><a href="http://www.springsource.org/node/3720" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://www.springsource.org/node/3720<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>Hibernate @ JBoss Community<br />
<address><a href="http://www.hibernate.org/downloads" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://wazai.net/2306<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>Struts 1.3 + Spring 3.2 + Hibernate 3.6 錯誤筆記 @ 蛙齋<br />
<address><a href="http://wazai.net/2418/struts-1-3-spring-3-2-hibernate-3-6-錯誤筆記" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://wazai.net/2418/struts-1-3-spring-3-2-hibernate-3-6-錯誤筆記<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>Spring Gossip: 在 Struts 中整合 Spring @ 良葛格學習筆記<br />
<address><a href="http://caterpillar.onlyfun.net/Gossip/SpringGossip/StrutsSpring.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://caterpillar.onlyfun.net/Gossip/SpringGossip/StrutsSpring.html<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
</ol>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2511/struts-1-3-spring-3-2-hibernate-3-6-%e5%ae%89%e8%a3%9d%e7%ad%86%e8%a8%98/" data-wpel-link="internal">Struts 1.3 + Spring 3.2 + Hibernate 3.6 安裝筆記</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2511/struts-1-3-spring-3-2-hibernate-3-6-%e5%ae%89%e8%a3%9d%e7%ad%86%e8%a8%98/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
