隨筆-75  評(píng)論-193  文章-5  trackbacks-0

              上次使用Seam自動(dòng)生成了一個(gè)CRUD的例子,后來想還是自己白手起家做一個(gè)例子看看,于是開始動(dòng)手。

              首先使用JBossTools工具生成項(xiàng)目,在生成項(xiàng)目的向?qū)е校绻?xiàng)目類型選擇ear,則會(huì)生成四個(gè)項(xiàng)目,分別對(duì)應(yīng)war、ear、ejb、test,覺得這樣太過繁瑣,還是選擇war類型,又想要不使用tomcat作為運(yùn)行服務(wù)器吧,因?yàn)镴Boss也不太熟悉。沒想到這一試倒試出問題來了,如果完全使用向?qū)身?xiàng)目,選擇tomcat作為運(yùn)行服務(wù)器,則項(xiàng)目根本無法運(yùn)行起來,總是提示缺少這個(gè)jar,那個(gè)jar。好,又換回JBoss,沒問題了。仔細(xì)看了一下,原來在自動(dòng)生成項(xiàng)目的WebContent/WEB-INF/lib目錄中,只有大概十幾個(gè)jar,連Hibernate的jar都沒有,而在JBoss的Server/default/lib目錄下則什么jar都有,怪不得不出錯(cuò)。

          第一個(gè)教訓(xùn):還是先使用JBoss作為運(yùn)行環(huán)境,等整個(gè)Seam都搞熟了,再配一個(gè)Tomcat的運(yùn)行環(huán)境。

              繼續(xù),將原來項(xiàng)目中的一個(gè)通用DAO和一個(gè)UserService拷貝過來,代碼如下,啟動(dòng)服務(wù)器報(bào)錯(cuò)。分別為如下錯(cuò)誤信息:

          第二個(gè)錯(cuò)誤解決:Caused by: java.lang.IllegalArgumentException: @PersistenceContext may only be used on session bean or message driven bean components: genericDao

              既然提示@PersistenceContext只能用在SessionBean中,因?yàn)樵瓉淼拇a是使用的Spring框架,想了好長(zhǎng)時(shí)間,在WebContent/WEB-INF/component.xml中看到這么一段,那么是不是通過@In來注入entityManager呢,修改@PersistenceContext為@In,編輯器自動(dòng)提示沒有發(fā)現(xiàn)名稱為em的Component(這點(diǎn)好像不錯(cuò)),于是再修改為@In("entityManager") ,重啟服務(wù)器,該問題解決。

          <persistence:managed-persistence-context name="entityManager" auto-create="true" entity-manager-factory="#{testEntityManagerFactory}"/>

          第三個(gè)錯(cuò)誤解決:Caused by org.jboss.seam.RequiredException with message: "@In attribute requires non-null value: userService.genericDao"

              將UserService中的@In修改為@In(create = true, required = true)解決此問題。

              解決上述幾個(gè)問題后,自己的例子終于運(yùn)行起來了 :-)

              下一篇關(guān)于Seam In Action中對(duì)JSF的介紹及Seam如何增強(qiáng)JSF。

          -------------------------------------------------------------------------------------------------

              項(xiàng)目生成的代碼被分為兩個(gè)目錄,分別為Action和Model目錄,檢查JBoss中項(xiàng)目部署的目錄,發(fā)覺Action目錄下的代碼編譯生成的class文件被存放至WEB-INF/dev目錄下,Model目錄下的代碼編譯生成的class文件被存放至WEB-INF/classes目錄下,google了一下,發(fā)現(xiàn)在Seam Reference中提到這是Seam的增量式重部署,支持對(duì)JavaBean組件的增量重部署,可以加快編輯/編譯/測(cè)試的速度。

          代碼如下:

          public interface GenericDao {
              public Object get(Class clazz, Serializable id);
              public
          void save(Object object);
              public
          void update(Object object);
              public
          void remove(Class clazz, Serializable id);
              public
          void remove(Object obj);
             
          }


          @Name("genericDao")
          public class GenericDaoImpl implements GenericDao {
              @PersistenceContext 
          ---->   @In("entityManager")
              private EntityManager em;

              public Object get(Class clazz, Serializable id) {
                 
          if (id == nullreturn null;
                 
          else return em.find(clazz, id);
              }
             
          }


          public interface UserService {
              public
          void findAllUsers();
          }

          @Name(
          "userService")
          public class UserServiceImpl implements UserService, SecurityUserService {

              @In
          ----> @In(create = true, required = true)
              protected GenericDao genericDao;
              private List
          <User> resultList = null;

              public List
          <User> getResultList() {
                 
          if (resultList == null) {
                     
          this.findAllUsers();
                  }
                 
          return resultList;
              }

              public
          void setResultList(List<User> resultList) {
                 
          this.resultList = resultList;
              }


              public
          void findAllUsers() {
                  String hql
          = "from User order by userCode";
                  resultList
          = this.genericDao.query(hql);
              }
          }

          // 實(shí)體類
          @Entity
          @Table(name = "USER")
          public class User implements IUser, Serializable {
              // 用戶編碼
              @Id
              private String userCode;

              // 用戶姓名
              private String userName;
          }


          <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
             
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <ui:composition xmlns="http://www.w3.org/1999/xhtml"
              xmlns:s
          ="http://jboss.com/products/seam/taglib"
              xmlns:ui
          ="http://java.sun.com/jsf/facelets"
              xmlns:f
          ="http://java.sun.com/jsf/core"
              xmlns:h
          ="http://java.sun.com/jsf/html"
              xmlns:rich
          ="http://richfaces.org/rich"
              template
          ="layout/template.xhtml">

          <ui:define name="body">
             
          <rich:panel>
                 
          <f:facet name="header">User Search Results</f:facet>
                 
          <rich:dataTable id="userServiceTable"
                             
          var="user"
                            value
          ="#{userService.resultList}">
                     
          <h:column>
                         
          <f:facet name="header">
                             
          <h:outputText value="UserCode"/>
                         
          </f:facet>
                         
          <h:outputText value="#{user.userCode}"/>
                     
          </h:column>
                     
          <h:column>
                         
          <f:facet name="header">
                             
          <h:outputText value="UserName"/>
                         
          </f:facet>
                         
          <h:outputText value="#{user.userName}"/>
                     
          </h:column>
                 
          </rich:dataTable>
                
          </rich:panel>
          </ui:define>
          </ui:composition>

          通過這個(gè)實(shí)踐,小結(jié)一下:

          1、發(fā)覺Seam確實(shí)簡(jiǎn)化了JSF開發(fā),但由于它涉及的新東西相對(duì)較多,與傳統(tǒng)的SSH走的路線不太一致,還是覺得其學(xué)習(xí)曲線比較陡峭,需要對(duì)Seam熟練掌握后(包括開發(fā)環(huán)境的搭建等)才能真正提高開發(fā)效率。

          2、Seam提供了IOC的功能,有時(shí)需要跳出Spring,從一個(gè)新的角度去審視Seam。

          posted on 2008-12-18 23:46 The Matrix 閱讀(2168) 評(píng)論(0)  編輯  收藏 所屬分類: JBoss Seam/JSF
          主站蜘蛛池模板: 乌审旗| 莲花县| 克什克腾旗| 邵东县| 深泽县| 文山县| 陵水| 鱼台县| 华宁县| 长乐市| 西华县| 信阳市| 电白县| 新宁县| 红原县| 峨眉山市| 岗巴县| 绿春县| 文登市| 金山区| 深水埗区| 都安| 济源市| 平湖市| 德钦县| 泰顺县| 蒙自县| 广昌县| 海晏县| 菏泽市| 五峰| 太仓市| 营山县| 黔西| 抚顺县| 富阳市| 蒲江县| 钦州市| 六枝特区| 阿合奇县| 巴彦县|