JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Application Server » JBoss  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 在JBoss使用 JSTL + DataSource 的方法 [精華]
Madagascar





發文: 122
積分: 2
於 2005-04-13 11:19 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
一.設定JBoss的DataSource

首先先到%JBoss_Home%\docs\examples\jca下
你會看到很多xxx-ds.xml的檔案(xxx代表資料庫名稱)
將代表你使用的資料庫名稱的xxx.xml打開
填入相關的資料,例如要設定的JNDI Name、JDBC相關設定
然後存檔再放入%JBoss_Home%\server\default\deploy((這是預設,端看你的選擇)

不過再啟動此Datasource之前,
建議先將JBoss預設的hsqldb-ds.xml拿掉以避免可能發生的衝突

JBoss已經實作JMX的Hot Deploy功能,
任何針對在deploy中的xxx-ds.xml內容有任何修改,
將會動態修正相關服務連結

另外xxx-ds.xml內容可設定多個JNDI名稱與相關資料庫連結

二.設定web.xml與jboss-web.xml有關JNDI資料

要讓JSTL能夠順利使用JNDI的DataSource
我們必須在web.xml和jboss-web.xml裡設定相關資料
好讓web app可以順利找到JNDI的服務

首先是web.xml部分:

請將以下作好相關設定
1
2
3
4
5
<resource-ref>
  <res-ref-name>你在jboss-web.xml設定的res-ref-name</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>


其次是jboss-web.xml部分
1
2
3
 <res-ref-name>你想取的res參考名稱</res-ref-name>
    <jndi-name>java:/你在xxx-ds.xml</jndi-name>
  </resource-ref>


在這邊要提醒的是,
這邊的JNDI名稱要打「全名」也就是java:/外加你在xxx-ds.xml裡設定的jndi名稱(我曾在這邊迷路了半天Dead

三.JSTL設定部分

撇開基本的taglib宣告,你可以使用<sql:setDataSource>做datasource設定
或者直接使用sql tag裡的<datasource>的attribute即可
而<datasource>則當然是使用JNDI名稱囉

到這邊應該各位都可以順利使用JSTL搭配JBoss和DS囉...

如果有更好的設定歡迎您指教...Tongue


reply to postreply to post
已完成:SCJP 1.4、SCWCD 1.3
今年目標:SCWCD 1.4、SCBCD 1.3
加油!!!
作者 Re:在JBoss使用 JSTL + DataSource 的方法 [Re:Madagascar]
anthonychen

外線交給我

版主

發文: 2033
積分: 8
於 2005-04-13 12:00 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
真是太感謝了,我也是在相同的地方 "迷路" 了呢 ^_^

本來已經放手不測了,現在又可以繼續測試 JBoss 了,感恩啊~~ m (_._) m

補充一下:

上面 jboss-web.xml 的設定,應該是:

1
2
3
4
  <resource-ref>
      <res-ref-name>你想取的res參考名稱</res-ref-name>
      <jndi-name>java:/你的xxx-ds.xml</jndi-name>
  </resource-ref>


少了開頭的 <resource-ref>


anthonychen edited on 2005-04-13 16:49
reply to postreply to post
作者 Re:在JBoss使用 JSTL + DataSource 的方法 [Re:Madagascar]
ben19770209





發文: 78
積分: 0
於 2005-05-06 18:41 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問, 我遇到了詭異的現象

1.
在 jboss 的 xxx-ds.xml 中, 我定義了一個 jndi

<jndi-name>comp/env/jdbc/xxx</jndi-name>

2.
在 web.xml 中, 我建立了以下的資源

<resource-ref>
<res-ref-name>jdbc/xxx</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

3.
在 jboss-web.xml 中, 我建立了以下的資源對照

<resource-ref>
<res-ref-name>jdbc/xxx</res-ref-name>
<jndi-name>java:comp/env/jdbc/xxx</jndi-name>
</resource-ref>

4.
在我的 java 程式中, 我用以下的方法來取得 jndi

Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/tsts");

5.
結果, 出現了無窮無盡的錯誤訊息,
但是, 奇妙的是, 這些錯誤訊息都是同一段, 然後無窮迴圈的出現
最後死在 StackOverflowError

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
java.lang.StackOverflowError
  java.security.AccessController.doPrivileged(Native Method)
  com.sun.naming.internal.VersionHelper12.getContextClassLoader(VersionHelper12.java:158)
  com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:41)
  javax.naming.spi.NamingManager.getObjectFactoryFromReference(NamingManager.java:129)
  javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:302)
  javax.naming.spi.NamingManager.getContext(NamingManager.java:422)
  javax.naming.spi.ContinuationContext.getTargetContext(ContinuationContext.java:38)
  javax.naming.spi.NamingManager.getContinuationContext(NamingManager.java:770)
  org.jnp.interfaces.NamingContext.lookup(NamingContext.java:700)
  org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)
  javax.naming.InitialContext.lookup(InitialContext.java:351)
  org.jnp.interfaces.NamingContext.resolveLink(NamingContext.java:1046)
  org.jnp.interfaces.NamingContext.lookup(NamingContext.java:685)
  org.jnp.interfaces.NamingContext.lookup(NamingContext.java:701)
  org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)
  javax.naming.InitialContext.lookup(InitialContext.java:351)
  org.jnp.interfaces.NamingContext.resolveLink(NamingContext.java:1046)
  org.jnp.interfaces.NamingContext.lookup(NamingContext.java:685)
  org.jnp.interfaces.NamingContext.lookup(NamingContext.java:701)
  org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)
  javax.naming.InitialContext.lookup(InitialContext.java:351)
  org.jnp.interfaces.NamingContext.resolveLink(NamingContext.java:1046)
  org.jnp.interfaces.NamingContext.lookup(NamingContext.java:685)
  org.jnp.interfaces.NamingContext.lookup(NamingContext.java:701)
  org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)


有誰能為我指點迷津


reply to postreply to post
作者 Re:在JBoss使用 JSTL + DataSource 的方法 [Re:Madagascar]
ben19770209





發文: 78
積分: 0
於 2005-05-06 18:52 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
然而, 若是我只 lookup "jdbc/tsts" 的話

Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/tsts");

則會出現以下的錯誤訊息, 表示 jdbc not found

1
2
3
4
5
6
7
8
9
10
11
18:47:08,086 INFO  [STDOUT] javax.naming.NameNotFoundException: jdbc not bound
18:47:08,086 INFO  [STDOUT]     at org.jnp.server.NamingServer.getBinding(Naming
Server.java:491)
18:47:08,086 INFO  [STDOUT]     at org.jnp.server.NamingServer.getBinding(Naming
Server.java:499)
18:47:08,086 INFO  [STDOUT]     at org.jnp.server.NamingServer.getObject(NamingS
erver.java:505)
18:47:08,086 INFO  [STDOUT]     at org.jnp.server.NamingServer.lookup(NamingServ
er.java:249)
18:47:08,086 INFO  [STDOUT]     at org.jnp.interfaces.NamingContext.lookup(Namin
gContext.java:610)


我有個觀念上的疑惑想請教
到底, 我們在 java 程式中, 要取得的 jndi
應該是要 jndi 全名, 那個 java:comp/env/jdbc/xxx 的
還是 reference 的名稱, 那個 jdbc/xxx

因為, 我在想, 當我們將 *.war 部署到不同的 app server 時
是依靠不同的部署描述檔, 來將 app server 的 jndi 對應到 web 模組中的資源
所以, 理論上, 我們應該要 lookup 的好像應該要是 reference 比較對
醬子, 部署到不同的 app server 時, 才不用改設定
而只依賴不同 app server 自家的描述檔來將 jndi 連結起來就可以了

我是醬子想的
可是好像不是
好像要 lookup 的都要是 jndi 的全名似的
那到底是出了什麼事呢 ??


reply to postreply to post
作者 Re:在JBoss使用 JSTL + DataSource 的方法 [Re:Madagascar]
ben19770209





發文: 78
積分: 0
於 2005-05-06 19:15 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
忘記提一下, 我的環境是 jdk1.5.0_01 + jboss-4.0.2

另外,我在 j2sdk1.4.2_04 + jboss-4.0.2 也是一樣

都是死在 DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/Northwind"); 的樣子


ben19770209 edited on 2005-05-06 23:54
reply to postreply to post
作者 Re:在JBoss使用 JSTL + DataSource 的方法 [Re:ben19770209]
ben19770209





發文: 78
積分: 0
於 2005-05-07 02:50 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
最後,我改成最安全的版本,就可以抓到 DataSource 了

1.
NorthwindODBC-ds.xml 中,JNDI 名稱只使用一節,不使用斜線
<jndi-name>NorthwindDS</jndi-name>

2.
所以,JBoss 產生的 JNDI 就會是 java:/NorthwindDS

在 web.xml 中
1
2
3
4
5
   <resource-ref >
      <res-ref-name>NorthwindDS</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
   </resource-ref>


在 jboss-web.xml 中
1
2
3
4
   <resource-ref>
      <res-ref-name>NorthwindDS</res-ref-name>
      <jndi-name>java:/NorthwindDS</jndi-name>
   </resource-ref>


3.
程式中,要取用 JNDI 時
1
2
            Context ctx = new InitialContext();
            DataSource ds = (DataSource)ctx.lookup("java:/NorthwindDS");


雖然醬子是 OK 的
但是為何不能使用斜線呢??
恩,等下再來試試看,難道是 XML 中的格式問題嗎??


reply to postreply to post
作者 Re:在JBoss使用 JSTL + DataSource 的方法 [Re:Madagascar]
ben19770209





發文: 78
積分: 0
於 2005-05-07 03:03 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
NorthwindODBC-ds.xml 中
1
<jndi-name>jdbc/NorthwindDS</jndi-name>


web.xml 中
1
2
3
4
5
   <resource-ref >
      <res-ref-name>jdbc/NorthwindDS</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
   </resource-ref>


jboss-web.xml 中
1
2
3
4
   <resource-ref>
      <res-ref-name>jdbc/NorthwindDS</res-ref-name>
      <jndi-name>java:jdbc/NorthwindDS</jndi-name>
   </resource-ref>


取用 DataSource 時
1
2
3
            Context ctx = new InitialContext();
            Context env = (Context)ctx.lookup("java:comp/env");
            DataSource ds = (DataSource)env.lookup("jdbc/NorthwindDS");


醬也行

雖然其中有些原理我還沒搞懂
不過,至少這種做法,可以不用改 web.xml 與取用 DataSource 的寫法
醬子要移植到不同的 app server 時,就只要管各自的描述檔即可


reply to postreply to post
作者 Re:在JBoss使用 JSTL + DataSource 的方法 [Re:Madagascar]
yehchge





發文: 16
積分: 0
於 2006-05-18 22:30 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問一下,我照著以上的方法處理,還是沒有辦法正常啟動耶
我的作業環境是:
Eclipse SDK Version: 3.1.2
JAVA JRE 1.5.0_06
mysql-connector-java-5.0.0-beta
JBOSS 4.0.3

出現錯誤的訊息:
org.jboss.deployment.DeploymentException: Error during deploy; - nested throwable: (javax.naming.NamingException: resource-ref: MySqlDS has no valid JNDI binding. Check the jboss-web/resource-ref.)


reply to postreply to post
作者 Re:在JBoss使用 JSTL + DataSource 的方法 [Re:Madagascar]
peihsinsu





發文: 22
積分: 0
於 2007-03-16 01:26 user profilesend a private message to usersend email to peihsinsureply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請教一下~
使用
Context ctx = new InitialContext();
Context env = (Context)ctx.lookup("java:comp/env");
DataSource ds = (DataSource)env.lookup("jdbc/NorthwindDS");
這樣兩階段lookup的目的是什麼啊?
另外,如果用
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx .lookup("java:jdbc/NorthwindDS");
也可以呼叫
這兩種使用方式有何差別呢?

感恩~


reply to postreply to post
Simon Su
» JWorld@TW »  Application Server » JBoss

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8