<?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>getDataSource &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/getdatasource/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>getDataSource &#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>
	</channel>
</rss>
