01.03.01 Basic UI - Roo 01 - Basic UI now with Spring Roo
Sample Use Case - Basic UI now with Spring Roo
Spring roo shares some ideas with forge and differ on quite a lot, other authors have done a better job differencing this two tools
To kickstart let’s launch Roo’s command line and create a new project.
simple-concise-code/simple-concise-roo$ roo
____ ____ ____
/ __ \/ __ \/ __ \
/ /_/ / / / / / / /
/ _, _/ /_/ / /_/ /
/_/ |_|\____/\____/ 1.2.5.RELEASE [rev 8341dc2]
Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER.
roo> project --topLevelPackage mx.rmm.simpleconcise.roo
Created ROOT/pom.xml
Created SRC_MAIN_RESOURCES
Created SRC_MAIN_RESOURCES/log4j.properties
Created SPRING_CONFIG_ROOT
Created SPRING_CONFIG_ROOT/applicationContext.xml
The second step is setup our persistence engine.
jpa setup --database H2_IN_MEMORY --provider HIBERNATE
Created SPRING_CONFIG_ROOT/database.properties
Updated SPRING_CONFIG_ROOT/applicationContext.xml
Created SRC_MAIN_RESOURCES/META-INF/persistence.xml
Updated ROOT/pom.xml [added dependencies com.h2database:h2:1.3.172, org.hibernate:hibernate-core:4.2.2.Final, org.hibernate:hibernate-entitymanager:4.2.2.Final, org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final, commons-collections:commons-collections:3.2.1, org.hibernate:hibernate-validator:4.3.1.Final, javax.validation:validation-api:1.0.0.GA, javax.transaction:jta:1.1, org.springframework:spring-jdbc:${spring.version}, org.springframework:spring-orm:${spring.version}, commons-pool:commons-pool:1.5.6, commons-dbcp:commons-dbcp:1.4]
Now let’s create our basic enum.
roo> enum type --class ~.domain.CatalogueStatus
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/domain
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/domain/CatalogueStatus.java
~.model.Catalogue roo> enum type --class ~.model.CatalogueStatus
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueStatus.java
~.model.CatalogueStatus roo> enum constant --name DRAFT
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueStatus.java
~.model.CatalogueStatus roo> enum constant --name PUBLISHED
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueStatus.java
~.model.CatalogueStatus roo> enum constant --name HIDDEN
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueStatus.java
Now our entity, here we will see a first difference, spring roo heavily uses aspectJ and allows us to create tests cases for our entities.
roo> entity jpa --class ~.model.Catalogue --testAutomatically
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue.java
Created SRC_TEST_JAVA/mx/rmm/simpleconcise/roo/model
Created SRC_TEST_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueDataOnDemand.java
Created SRC_TEST_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueIntegrationTest.java
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue_Roo_Configurable.aj
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue_Roo_Jpa_Entity.aj
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue_Roo_Jpa_ActiveRecord.aj
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue_Roo_ToString.aj
Created SRC_TEST_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueDataOnDemand_Roo_Configurable.aj
Created SRC_TEST_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueDataOnDemand_Roo_DataOnDemand.aj
Created SRC_TEST_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueIntegrationTest_Roo_Configurable.aj
Created SRC_TEST_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueIntegrationTest_Roo_IntegrationTest.aj
Next let’s add the basic fields excluding the reference to CatalogueStatus enum for now.
~.model.Catalogue roo> field string --fieldName code --notNull
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue.java
Updated SRC_TEST_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueDataOnDemand_Roo_DataOnDemand.aj
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue_Roo_Jpa_ActiveRecord.aj
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue_Roo_JavaBean.aj
~.model.Catalogue roo> field string --fieldName description --notNull
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue.java
Updated SRC_TEST_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueDataOnDemand_Roo_DataOnDemand.aj
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue_Roo_Jpa_ActiveRecord.aj
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue_Roo_JavaBean.aj
Next let’s setup our GUI scaffold using JSF, please note that Roo uses spring MVC by default.
web jsf setup
Created ROOT/src/main/webapp
Created ROOT/src/main/webapp/index.html
Created ROOT/src/main/webapp/viewExpired.xhtml
Created ROOT/src/main/webapp/resources/images
Created ROOT/src/main/webapp/resources/images/csv.png
Created ROOT/src/main/webapp/resources/images/de.png
Created ROOT/src/main/webapp/resources/images/en.png
Created ROOT/src/main/webapp/resources/images/es.png
Created ROOT/src/main/webapp/resources/images/excel.png
Created ROOT/src/main/webapp/resources/images/favicon.ico
Created ROOT/src/main/webapp/resources/images/fr.png
Created ROOT/src/main/webapp/resources/images/pdf.png
Created ROOT/src/main/webapp/resources/images/roo_logo.png
Created ROOT/src/main/webapp/resources/images/springsource-logo.png
Created ROOT/src/main/webapp/resources/images/xml.png
Created ROOT/src/main/webapp/resources/css
Created ROOT/src/main/webapp/resources/css/standard.css
Created ROOT/src/main/webapp/resources/js
Created ROOT/src/main/webapp/resources/js/calendar.js
Created ROOT/src/main/webapp/templates
Created ROOT/src/main/webapp/templates/content.xhtml
Created ROOT/src/main/webapp/templates/footer.xhtml
Created ROOT/src/main/webapp/templates/header.xhtml
Created ROOT/src/main/webapp/templates/layout.xhtml
Created ROOT/src/main/webapp/templates/menu.xhtml
Created ROOT/src/main/webapp/pages
Created ROOT/src/main/webapp/pages/main.xhtml
Updated ROOT/pom.xml [added dependencies com.sun.faces:jsf-api:2.1.2, com.sun.faces:jsf-impl:2.1.2, org.primefaces:primefaces:3.5, org.primefaces.themes:south-street:1.0.10, org.springframework:spring-web:${spring.version}, javax.el:el-api:2.2, commons-fileupload:commons-fileupload:1.2.2, commons-io:commons-io:2.1; added repositories http://download.java.net/maven/2, http://repository.primefaces.org; updated project type to war]
Created SRC_MAIN_WEBAPP/WEB-INF
Created SRC_MAIN_WEBAPP/WEB-INF/web.xml
Finally we generate all scaffolding.
roo> web jsf all --package ~.web
Created ROOT/src/main/resources/mx/rmm/simpleconcise/roo/web/i18n
Created ROOT/src/main/resources/mx/rmm/simpleconcise/roo/web/i18n/messages_de.properties
Created ROOT/src/main/resources/mx/rmm/simpleconcise/roo/web/i18n/messages_en.properties
Created ROOT/src/main/resources/mx/rmm/simpleconcise/roo/web/i18n/messages_es.properties
Created ROOT/src/main/resources/mx/rmm/simpleconcise/roo/web/i18n/messages_fr.properties
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/CatalogueBean.java
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/converter
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/converter/CatalogueConverter.java
Created SRC_MAIN_WEBAPP/WEB-INF/faces-config.xml
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/ApplicationBean.java
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/util
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/util/LocaleBean.java
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/util/ViewExpiredExceptionExceptionHandlerFactory.java
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/util/ViewExpiredExceptionExceptionHandler.java
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/util/MessageFactory.java
Created SRC_MAIN_WEBAPP/pages/catalogue.xhtml
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/converter/CatalogueConverter_Roo_Converter.aj
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/converter/CatalogueConverter_Roo_Configurable.aj
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/ApplicationBean_Roo_ApplicationBean.aj
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/ApplicationBean_Roo_Configurable.aj
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/CatalogueBean_Roo_Serializable.aj
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/CatalogueBean_Roo_Configurable.aj
Created SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/CatalogueBean_Roo_ManagedBean.aj
Our landing page looks like this, with a menu on the left side and localization options on the bottom row.
Navigating on Catalogue/create we are prompted for the required fields.
With expected validations in place.
After succesfull creation we are redirected to the list all page.
Current metrics
.aj
921 total
.java
301 total
.properties
124 total
.xhtml
280 total
.xml
593 total
Let’s continue with our enum on the first sample.
roo> field enum --class ~.model.Catalogue --type ~.model.CatalogueStatus --fieldName status --enumType STRING --notNull
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue.java
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/web/CatalogueBean_Roo_ManagedBean.aj
Updated SRC_TEST_JAVA/mx/rmm/simpleconcise/roo/model/CatalogueDataOnDemand_Roo_DataOnDemand.aj
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue_Roo_Jpa_ActiveRecord.aj
Updated SRC_MAIN_JAVA/mx/rmm/simpleconcise/roo/model/Catalogue_Roo_JavaBean.aj
~.model.Catalogue roo> web jsf all --package ~.web
Now our creation dialog asks for the status and another difference, the value of status can be captured or selected
After succesfull creation we are redirected to the list all page.
Other thing we are missing are the search fields so all the results are shown on the same table albeit paginated
You can find sourcecode here