Let's go inside

          this blog is deprecated as a result of laziness.
          posts - 59, comments - 2, trackbacks - 0, articles - 0

          My First EJB3 Demo Blood&Tears

          Posted on 2006-08-03 05:34 Earth 閱讀(900) 評論(0)  編輯  收藏 所屬分類: JavaEE5/EJB3

          寫在前面,一個EAR包中可以包含若干個JAR包和WAR包。本demo的目錄結構如下 :
          snap036.jpg
          看了一段時間的書,手開始癢癢,不料盡碰到一些古怪的問題,郁悶。
          最近的一個是Eclipse不能自動編譯甚至不能編譯java文件的問題。查了半天資料也無法解決。非常之郁悶。

          只好重新開始新建工程,為了不出錯,對照一個demo開始了。
          工程名就叫做ym(郁悶),選用最為流行的MyEclipse做為插件了。。。
          以后還會發生什么問題,不得而知,從現在開始,無論成功失敗,記錄一下期間碰到的問題,以備后用(純屬個人經驗,不對的地方請多指教)。

          1.解決Eclipse自動編譯失效問題
          起因:
          我想在EJB工程中使用WEB工程中定義的類,
          比如在EJB工程中的UserManager中需要使用WEB工程中定義的com.earth.ejb3.ServiceLocator;直接import會出錯,
          使用Ctrl+1提示Add project 'ymWeb' to build path of 'ymEJB',這樣代碼沒有問題了。

          分析:
          Eclipse自動在EJB下的.classpath文件中加入了這樣一句:<classpathentry kind="src" path="/ymWeb"/>
          這樣,在.classpath文件中同時有兩個src,另一個是<classpathentry kind="src" path="src"/>

          我想這大概就是使Eclipse自動編譯失效的原因。因為自從使用了本次Ctrl+1功能后,java文件就不能自動編譯了!

          解決方法:
          OK,經過多次嘗試,最后找到了解決辦法:
          如果在WEB工程中要使用EJB工程中定義的類,必須把EJB工程的output目錄加入到WEB工程的build path,
          所以在WEB工程的.classpath中加入這樣一句
          <classpathentry kind="lib" path="/ymEJB/classes"/>

          反過來也一樣,在EJB工程的.classpath中加入這樣一句
          <classpathentry kind="lib" path="/ymWeb/web/WEB-INF/classes"/>

          即互相把對方的output做為自己的lib

          這是修改之后ymWeb的.classpath文件
          <classpath>
          ?<classpathentry kind="src" path="src"/>
          ??????? ...
          ?<classpathentry kind="lib" path="/ymEJB/classes"/>
          ?<classpathentry kind="output" path="web/WEB-INF/classes"/>
          </classpath>
          這是修改之后ymEJB的.classpath文件
          <classpath>
          ?<classpathentry kind="src" path="src"/>
          ?<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
          ?<classpathentry kind="con" path="com.genuitec.eclipse.j2eedt.core.J2EE14_CONTAINER"/>
          ?<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/jboss-ejb3"/>
          ?<classpathentry kind="lib" path="D:/SmartLibrary/commons/commons-lang.jar"/>
          ?<classpathentry kind="lib" path="/ymWeb/web/WEB-INF/classes"/>
          ?<classpathentry kind="output" path="classes"/>
          </classpath>

          可以通過project->properties->Java Build Path->Libraries選項卡->Add Class Folder來完成上面的操作

          2.
          加入jar到lib目錄(隨同應用一起發布)
          lib右鍵->import->File system->選擇要導入的jar
          加入jar到build path(不會發布)
          project->properties->Java Build Path->Libraries選項卡->Add External JARs

          3.避免頻繁啟動jboss技巧。。。

          4.在JAR包中無法調用WAR包中的class文件。所以要把WAR中公共的class文件打成一個JAR包

          5.如何將新建的一個EJB Project commons-earth.jar包加入到ear中?
          將commons-earth .mymetadata中的<project-module>拷貝到EAR .mymetadata <project-modules>中,
          然后在EAR中的application.xml中加入如下代碼
          ?<module id="myeclipse.1154552687109">
          ??<ejb>commons-earth.jar</ejb>
          ?</module>

          OK,太興奮了,加入user成功了。

          睡覺去了,明天加入extremeTable。

          6.見2:加入eXtremeComponents.jar到lib目錄,此時在war中可以調用,但在其它的jar包中無法調用,howto?
          project->properties->Java Build Path->Libraries選項卡->Add JARs,選擇ymWeb/web/WEB-INF/eXtremeComponents.jar
          還是不可行,jboss還是找不到它,郁悶,只好將這個jar包放到default/lib目錄下。reboot jboss
          又提示找不到commons-StringUtils,,,,這些包全部都存在于ymWeb/web/WEB-INF/lib下,為什么會找不到?


          7.<html:form>和<form>的一個小區別前者action="/userAction.do就可以了"后者要寫成action="/ym/userAction.do"

          8.以前碰到過的問題,不要在form中用disabled="disabled"應該使用readonly="readonly",只有后者的數據才會自動組裝到ActionForm

          9.解決亂碼問題,對于亂碼,一向是加過濾器,這次卻不行了。郁悶,最后查明原因。EJB3自動建表使用了latin1 編碼。將表的默認編碼改為utf-8,并且去掉表中每一字段的編碼。
          最后還需要在mysql-ds.xml中設置jdbc:mysql://localhost:3306/message?useUnicode=true&amp;characterEncoding=UTF-8,修改mysql-ds.xml后需要重新發布工程。

          10以Packaged Archive的方式發布EAR包,修改文件后不用重啟jboss可進行熱布署

          11.ec自帶分頁,能幫你計算出rowStart和rowEnd。
          在本示例中,我用的是EJB3中的
          Query.setFirstResult(limit.getRowStart()).setMaxResults(limit.getCurrentRowsDisplayed())
          這樣ec中的分頁就與具體數據庫無關了。。。。。

          主站蜘蛛池模板: 乌拉特中旗| 二连浩特市| 安新县| 衡东县| 古田县| 渭源县| 二连浩特市| 婺源县| 蒲江县| 夏邑县| 宁乡县| 将乐县| 虎林市| 天气| 习水县| 浦江县| 西乌| 长兴县| 伽师县| 高安市| 贵德县| 枞阳县| 全州县| 西盟| 泰来县| 新化县| 日土县| 高阳县| 塔河县| 铜陵市| 东源县| 榆中县| 庆阳市| 额敏县| 格尔木市| 中西区| 岑溪市| 宾川县| 芦溪县| 滦南县| 彰化市|