Ê×Ò³ Ê«´Ê ×Öµä °å±¨ ¾ä×Ó ÃûÑÔ ÓÑ´ð ÀøÖ¾ ѧУ ÍøÕ¾µØÍ¼
µ±Ç°Î»ÖÃ: Ê×Ò³ > ½Ì³ÌƵµÀ > Èí¼þ¹ÜÀí > Èí¼þ¼Ü¹¹Éè¼Æ >

Seamѧϰ(ʮһ)-SeamÓ¦ÓóÌÐò¿ò¼Ü

2012-09-22 
Seamѧϰ(ʮһ)-----SeamÓ¦ÓóÌÐò¿ò¼ÜSeamÓ¦ÓóÌÐò¿ò¼ÜSeamͨ¹ý±àд´øÓÐ×¢½âµÄ¼òµ¥JavaÀàÀ´Èô´½¨Ó¦ÓóÌÐò

Seamѧϰ(ʮһ)-----SeamÓ¦ÓóÌÐò¿ò¼Ü
  SeamÓ¦ÓóÌÐò¿ò¼Ü
   Seamͨ¹ý±àд´øÓÐ×¢½âµÄ¼òµ¥JavaÀàÀ´Èô´½¨Ó¦ÓóÌÐòµÄ¹¤×÷±äµÃ·Ç³£¼òµ¥£¬²»ÐèÀ©Õ¹ÈκÎÌØ¶¨½Ó¿ÚºÍ¸¸Àà¡£µ«³£¼ûµÄ±à³ÌÈÎÎñ»¹ÄܽøÒ»²½¼ò»¯£¬ÕâÊÇͨ¹ýÒ»×éÔ¤ÏÈ´´½¨µÄ×é¼þ½øÐеģ¬ËüÃÇÄܹ»ÓÉ component.xml ÎļþÅäÖã¨×î¼òµ¥µÄÇé¿ö£©»òÕßÀàÀ©Õ¹¶øÊµÏÖ¸´Óá£

ÔÚÒ»¸öWebÓ¦ÓóÌÐòÖÐʹÓÃHibernate»òÕßJPA½øÐлù±¾µÄÊý¾Ý¿â²Ù×÷ʱ£¬Seam Application Framework£¨SeamÓ¦ÓóÌÐò¿ò¼Ü£© Äܹ»¼õÉÙÄãÐèÒªÊéдµÄ´úÂëÁ¿¡£

ÎÒÃÇÐèҪǿµ÷µÄÊÇ£¬Õâ¸ö¿ò¼Ü·Ç³£µÄ¼òµ¥£¬Ö»ÊÇÉÙÁ¿µÄÒ×ÓÚÀí½âºÍÀ©Õ¹µÄ¼òµ¥Àà¡£ ¡°Ä§Á¦¡±À´×ÔÓÚSeam×ÔÉí ¡ª ¼´Ê¹Ã»ÓÐÓÃÕâ¸ö¿ò¼ÜÀ´´´½¨ÈκÎSeamÓ¦ÓóÌÐòµÄʱºò£¬ÄãҲͬÑùÓõ½ÕâÒ»¡°Ä§Á¦¡±¡£

11.1. ¼ò½é
ÓÐÁ½ÖÖ²»Í¬µÄ·½·¨Ê¹ÓÃSeam Application FrameworkËùÌṩµÄ×é¼þ¡£µÚÒ»ÖÖ·½·¨ÊÇÏñ´¦ÀíÆäËûÖÖÀàµÄSeamÄÚÖÃ×é¼þÒ»Ñù£¬ÔÚ components.xml Öа²×°ºÍÅäÖÃ×é¼þµÄʵÀý¡£ ¾ÙÀýÀ´Ëµ£¬ÏÂÁÐ components.xml ÖÐµÄÆ¬¶Î°²×°ÁËÒ»¸öÄܹ»Îª Person ʵÌåÖ´Ðлù±¾µÄCRUD£¨´´½¨(Create)¡¢¶ÁÈ¡(Retrieve) ¡¢¸üÐÂ(Update)ºÍɾ³ý(Delete)£©²Ù×÷µÄ×é¼þ£º

<framework:entity-home name="personHome"
                       entity-entity-/>
Ò²¿ÉÒÔͨ¹ýÀàµÄÀ©Õ¹

@Name("personHome")
public class PersonHome extends EntityHome<Person> {}
Home¶ÔÏóÌṩÁËÈçϵIJÙ×÷£ºpersist()¡¢remove()¡¢update() ºÍ getInstance()¡£ ÔÚÄãÄܹ»µ÷Óà remove() »ò update() ²Ù×÷֮ǰ£¬Äã±ØÐëÊ×ÏÈʹÓà setId() ·½·¨¶¨ÒåÄã¸ÐÐËȤµÄ¶ÔÏóµÄ±êʶ·û¡£

ÎÒÃÇ¿ÉÒÔÖ±½Ó´ÓÒ»¸öJSFÒ³ÃæÊ¹ÓÃÒ»¸öHome£¬ÈçÏÂÀý£º

<h1>Create Person</h1>
<h:form>
    <div>First name: <h:inputText value="#{personHome.instance.firstName}"/></div>
    <div>Last name: <h:inputText value="#{personHome.instance.lastName}"/></div>
    <div>
        <h:commandButton value="Create Person" action="#{personHome.persist}"/>
    </div>
</h:form>
ͨ³££¬Ö»ÓÃperson Ö¸Ã÷personƯÁÁµÃ¶à£¬ËùÒÔÔÚ components.xml ÖÐÌí¼ÓÒ»ÐÐÓï¾äÀ´ÊµÏÖ¡£

<factory name="person"
         value="#{personHome.instance}"/>

<framework:entity-home name="personHome"
                       entity-/>
£¨Èç¹ûÎÒÃÇʹÓÃÅäÖõķ½·¨¡££© »òÕߣ¬ÎÒÃÇ¿ÉÒÔͨ¹ýÏò PersonHome ÖÐÌí¼ÓÒ»¸ö @Factory ·½·¨À´ÊµÏÖ£º

@Name("personHome")
public class PersonHome extends EntityHome<Person> {

    @Factory("person")
    public Person initPerson() { return getInstance(); }

}
£¨Èç¹ûÎÒÃÇʹÓÃÀàÀ©Õ¹µÄ·½·¨£© Õâ¸öÐÞ¸ÄʹÎÒÃǵÄJSFÒ³Ãæ¼ò»¯ÈçÏ£º

<h1>Create Person</h1>
<h:form>
    <div>First name: <h:inputText value="#{person.firstName}"/></div>
    <div>Last name: <h:inputText value="#{person.lastName}"/></div>
    <div>
        <h:commandButton value="Create Person" action="#{personHome.persist}"/>
    </div>
</h:form>
ºÃ£¬Õâ¾Í¿ÉÒÔÓÃÀ´´´½¨Ð嵀 Person ʵÌåÁË¡£Êǵģ¬Õâ¾ÍÊÇËùÐèµÄÈ«²¿´úÂ룡ÏÖÔÚ£¬Èç¹ûÎÒÃÇÏëÏÔʾ£¬¸üУ¬É¾³ýÊý¾Ý¿âÖÐÒѾ­´æÔÚµÄ Person ʵÌ壬ÎÒÃÇÐèÒª½«ÊµÌå±êʶ·û´«µÝ¸ø PersonHome¡£Ò³Ãæ²ÎÊýÊÇÒ»Öַdz£ºÃµÄʵÏÖ·½Ê½£º

<pages>
    <page view-id="/editPerson.jsp">
        <param name="personId" value="#{personHome.id}"/>
    </page>
</pages>
ÏÖÔÚ£¬ÎÒÃÇ¿ÉÒÔÏòJSFÒ³ÃæÖÐÔö¼ÓÆäËûµÄ²Ù×÷£º

<h1>
    <h:outputText rendered="#{!personHome.managed}" value="Create Person"/>
    <h:outputText rendered="#{personHome.managed}" value="Edit Person"/>
</h1>
<h:form>
    <div>First name: <h:inputText value="#{person.firstName}"/></div>
    <div>Last name: <h:inputText value="#{person.lastName}"/></div>
    <div>
        <h:commandButton value="Create Person" action="#{personHome.persist}" rendered="#{!personHome.managed}"/>
        <h:commandButton value="Update Person" action="#{personHome.update}" rendered="#{personHome.managed}"/>
        <h:commandButton value="Delete Person" action="#{personHome.remove}" rendered="#{personHome.managed}"/>
    </div>
</h:form>
µ±ÎÒÃÇûÓдøÈκÎÇëÇó²ÎÊýÁ´½Óµ½¸ÃÒ³ÃæÊ±£¬»áÏÔʾ"Create Person"Ò³Ãæ£¬µ±ÎÒÃÇΪ personId Õâ¸öÇëÇó²ÎÊýÉ趨һ¸öֵʱ£¬»áÏÔʾ¡°Edit Person¡±Ò³Ãæ¡£

¼ÙÉèÎÒÃÇÐèÒª´´½¨Ò»Ð© Person ʵÌ壬²¢ÇÒ³õʼ»¯ÕâЩÈ˵Ĺú¼®¡£ÎÒÃÇ¿ÉÒÔͨ¹ýÅäÖúÜÇáËɵØÍê³É£º

<factory name="person"
         value="#{personHome.instance}"/>

<framework:entity-home name="personHome"
                       entity-var="person">
    <h:column>
        <s:link view="/editPerson.jsp" value="#{person.firstName} #{person.lastName}">
            <f:param name="personId" value="#{person.id}"/>
        </s:link>
    </h:column>
</h:dataTable>
ÎÒÃÇ¿ÉÄÜÐèÒªÖ§³Ö·ÖÒ³£º

<framework:entity-query name="people"
                        ejbql="select p from Person p"
                        order="lastName"
                        max-results="20"/>
ÎÒÃÇ¿ÉÒÔʹÓÃpage²ÎÊýÀ´¾ö¶¨±»ÏÔʾµÄÒ³Ãæ

<pages>
    <page view-id="/searchPerson.jsp">
        <param name="firstResult" value="#{people.firstResult}"/>
    </page>
</pages>
ÓÃÓÚ·ÖÒ³µÄJSF´úÂë¿ÉÄÜÓеãÈß³¤£¬µ«ÈÔÈ»ÊDZãÓÚ¹ÜÀíµÄ£º

<h1>Search for people</h1>
<h:dataTable value="#{people.resultList}" var="person">
    <h:column>
        <s:link view="/editPerson.jsp" value="#{person.firstName} #{person.lastName}">
            <f:param name="personId" value="#{person.id}"/>
        </s:link>
    </h:column>
</h:dataTable>

<s:link view="/search.xhtml" rendered="#{people.previousExists}" value="First Page">
    <f:param name="firstResult" value="0"/>
</s:link>

<s:link view="/search.xhtml" rendered="#{people.previousExists}" value="Previous Page">
    <f:param name="firstResult" value="#{people.previousFirstResult}"/>
</s:link>

<s:link view="/search.xhtml" rendered="#{people.nextExists}" value="Next Page">
    <f:param name="firstResult" value="#{people.nextFirstResult}"/>
</s:link>

<s:link view="/search.xhtml" rendered="#{people.nextExists}" value="Last Page">
    <f:param name="firstResult" value="#{people.lastFirstResult}"/>
</s:link>
ÕæÊµµÄËÑË÷½çÃæÄܹ»Í¨¹ýÈÃÓû§ÊäÈëһϵÁеĿÉÑ¡µÄËÑË÷±ê×¼À´ËõС·µ»ØµÄ½á¹ûÁÐ±í¡£Query¶ÔÏóͨ¹ýÈÃÄãÖ¸¶¨¿ÉÑ¡µÄ¡°Ô¼Êø¡±À´Ö§³ÖÕâ¸öÖØÒªµÄÓÃÀý¡£

<component name="examplePerson" action="/search.jsp"/></div>
</h:form>

<h:dataTable value="#{people.resultList}" var="person">
    <h:column>
        <s:link view="/editPerson.jsp" value="#{person.firstName} #{person.lastName}">
            <f:param name="personId" value="#{person.id}"/>
        </s:link>
    </h:column>
</h:dataTable>
ÔڵײãʵÌå·¢Éú¸Ä±äºó£¬¿ÉÒÔͨ¹ý¼àÌý org.jboss.seam.afterTransactionSuccess ʼþÀ´Ë¢Ð²éѯ£º

<event type="org.jboss.seam.afterTransactionSuccess">
    <action execute="#{people.refresh}" />
</event>
»òÕߣ¬ÔÚ·¢Éú³Ö¾Ã»¯¡¢¸üлòÕßɾ³ýʱ£¬Í¨¹ý PersonHome À´Ë¢Ð²éѯ£º

<event type="org.jboss.seam.afterTransactionSuccess.Person">
    <action execute="#{people.refresh}" />
</event>
Õâ¸ö²¿·ÖËùÓеÄÀý×Ó¶¼ÊÇͨ¹ýÅäÖÃÀ´ÌåÏÖÖØÓõ쬵«ÊÇ£¬¶ÔQuery¶ÔÏóͨ¹ýÀ©Õ¹À´½øÐÐÖØÓÃÒ²ÊÇ¿ÉÐеġ£

11.4. Controller¶ÔÏó
Controller ÀàÒÔ¼°ËüµÄ×ÓÀà EntityController£¬HibernateEntityController ºÍ BusinessProcessController ÊÇSeam Application FrameworkµÄ¿ÉÑ¡²¿·Ö¡£ ÕâЩÀàÖ»ÊÇÌṩÁËһЩ·ÃÎʳ£ÓÃÄÚÖÃ×é¼þ¼°ÕâЩ×é¼þ·½·¨µÄ±ãÀûÊֶΣ¬ËüÃÇÄܹ»¼õÉÙһЩ¼üÅÌÊäÈëÁ¿£¬Ò²ÎªÌ½Ë÷SeamÄÚÖ÷ḻ¹¦ÄܵijõѧÕßÌṩÁËÒ»¸ö·Ç³£ºÃµÄÌø°å¡£

ÀýÈ磬Õâ¾ÍÊÇSeam×¢²áʵÀýÖÐµÄ RegisterAction£º

@Stateless
@Name("register")
public class RegisterAction extends EntityController implements Register
{

   @In private User user;

   public String register()
   {
      List existing = createQuery("select u.username from User u where u.username=:username")
         .setParameter("username", user.getUsername())
         .getResultList();

      if ( existing.size()==0 )
      {
         persist(user);
         info("Registered new user #{user.username}");
         return "/registered.jspx";
      }
      else
      {
         addFacesMessage("User #{user.username} already exists");
         return null;
      }
   }

}
ÕýÈçÄãËù¿´µ½µÄÒ»Ñù£¬Õâ²»ÊÇʲô¾ªÊÀº§Ë×µÄÌá¸ß...

ÈȵãÅÅÐÐ