0 Replies Latest reply on Jan 11, 2013 4:55 AM by joshd

    Seam project structure and Presentation Layer

    joshd

      I'm in the process of planning to moving a Seam 2.3 project from Tomcat (Seam with POJO) to  JBoss 7 to use full EJB capabilities. I chose to go for a maven-based EAR packaging, since all Seam examples do so, and I also like the idea of separated projects.

       

      So lets say I have a project structure like:

      - foo

      - foo-ear

      - foo-ejb

      - foo-web

       

      What I see in all of the provided Seam exmaples and maven project archtypes - none of these is using Java classes in the web-project (foo-web here). Is there a reason for that?

      If  someone aims at a "seperated presentation layer" wouldn' it be a good idea to put Backing Beans (JSF/RichFaces/Primefaces whatever)  and UI-related Seam-action (POJO Seam components) into this project? And only have business logic EJBs, Entity and Daos etc. in the foo-ejb? Doing so would make it possible to change the presentation layer without touching anything else - just by completely replacing the whole foo-web project.

       

      Example:

       

      foo-web/src/main/webapp

       

       

      <p:dataTable id="groupGrid" value="#{groups}" var="group">
                  <p:column headerText="Groups">                       
              <h:outputText value="#{group.name}" />       
                  </p:column>
       </p:dataTable>
      
      

       

       

      GroupAction providing the #{groups} in

      foo-web/src/main/java/ui

       

      @Name("groupAction")
      @Scope(ScopeType.CONVERSATION)
      public class GroupAction implements Serializable {
      
         @In private GroupDao groupDao;
         @In private GroupService groupService;
         @Out(required=false, scope=ScopeType.PAGE)
         private List<Group> groups;
      
         @Factory(value="groups")
         public void getGroups() {
              groups = groupDao.findAll();
         }
      }
      

       

       

      The GroupDao is a SLSB in

      foo-ejb/src/main/java/dal and

      and GroupService a SLSB in

      foo-ejb/src/main/java/services

       

      @Stateless
      @AutoCreate
      @Name(GroupDao.NAME)
      public class GroupDaoBean extends AbstractDao<Group> implements GroupDao {
        ...
      }
      


      @Stateless
      @Name("groupService")
      public class GroupServiceBean implements GroupService {
      
        @Logger 
        private Log log;
        @EJB
        private OtherDao otherDao;
        @EJB
        private UserDao userDao;
      
      ..
      
      }
      

       

       

      I have tested a bit with this structure, and it works. Is there any good reason not to have it like this? Will it have any downsides or even serios problems? I dont find examples for having Java code in the web-project.

      With the idea of having presentation logic separated from the business logic in mind, I always wonder why someone would have a "weblogic"-package right next to the "datamodel"-package, both in ejb-project.

       

      I would be very interested in some feeback. How are you structuring small-, mediumsized- or big projects.

       

      Thanks in advance

       

      josh