SlideShare una empresa de Scribd logo
1 de 37
Descargar para leer sin conexión
US NAVY INTEGRATES SPRING APPS
  WITH FLYING COLORS THANKS TO WEB CMS



                      +
CAMPBELL
      EWALD



ABOUT THE WEBINAR
  Posting Questions
  Viewing the recorded
  webinar and related
  materials
  Contacting Us
  Tweeting - use hash tags:
  #magnolia_cms #campbellewald
  #springframework #springmvc
  #USNavy



                              2   WEBINAR
CAMPBELL
     EWALD



ABOUT US
     MATT	
  DERTINGER	
  SOLUTIONS	
  ARCHITECT,	
  INTERACTIVE	
  R&D,	
  CE	
  DETROIT
     CAMPBELL	
  EWALD
     Twi9er:	
  @ma9nolia


     SEAN	
  MCMAINS	
  SALES	
  ENGINEER
     MAGNOLIA	
  CMS
     sean.mcmains@magnolia-­‐CMS.com


     TOBIAS	
  MATTSSON	
  SENIOR	
  SOFTWARE	
  ENGINEER	
  &	
  BLOSSOM	
  DEVELOPER
     MAGNOLIA	
  CMS
     tobias.ma9sson@magnolia-­‐cms.com




                                                    3                                       WEBINAR
CAMPBELL
         EWALD



ABOUT CAMPBELL EWALD AND MAGNOLIA
  CAMPBELL EWALD
  Digital Agency
  Magnolia Partner
  General Motors, Kaiser Permanente, US Postal Service

  Magnolia
  Java-based Content Management System
  Community and Enterprise Editions
  Sony, Deloitte, Airbus and JBoss




                                         4               WEBINAR
CAMPBELL
      EWALD



WHAT WE’LL TALK ABOUT
  Overview of Magnolia Blossom module
  Navy Use Cases
  Step-by-Step Walkthrough
  Questions




                             5          WEBINAR
CAMPBELL
EWALD



           BLOSSOM OVERVIEW




                  6           WEBINAR
CAMPBELL
     EWALD



A LITTLE PHILOSOPHY
                The idea that sparked me writing the Blossom Module
                for Magnolia CMS was to bring the CMS and
                especially the content into Spring Web MVC not the
                other way around. Controllers should be the building
                blocks when composing pages.
                – Tobias Mattsson
                 http://tobias-mattsson-magnolia.blogspot.com/2011/03/spring-web-mvc-with-content.html




                                                    7                                                    WEBINAR
CAMPBELL
           EWALD



WHAT’S BLOSSOM
  Spring integration module for Magnolia
  CMS
  Spring Web MVC with Content
  Key features:
     Annotation based API
     Spring controllers exposed as template
     components
     Pre-execution of template components




                                              8   WEBINAR
CAMPBELL
         EWALD



WHY USE BLOSSOM
  Leverages proven Spring Framework

  Easily integrate or migrate existing Spring-based applications

  Spring developers will feel right at home

  Dynamic dialogs,Virtual URI Mappings, Pre-execution

  Easily access content in controllers

  Best practice web app design patterns (MVC, IoC, AOP)

  Open Source and Free to download and use




                                              9                    WEBINAR
CAMPBELL
EWALD



           NAVY USE CASES



                        TM




                10           WEBINAR
CAMPBELL
          EWALD



ABOUT NAVY.COM
  Official recruitment Website for
  the U.S. Navy
  Redesigned in 2010, moved to
  Magnolia CMS
  Application integration for
  subscription services, CRUD
  functionality and user-space
  applications




                                    11   WEBINAR
CAMPBELL
          EWALD



BLOSSOM + RESTEASY
    Navy.com
    Navy Custom Module

                                                                   RESTEasy provided nice
Blossom                                                            JAX-RS client
                                                                   Aligned with Magnolia CMS
                                                                   roadmap
                  Navy Web Service Registry                        Allowed business
                Business Component 1   Business Component 3        components to be loosely-
                Business Component 2   Business Component n
                                                                   coupled to CMS



                                                              12                     WEBINAR
CAMPBELL
         EWALD



BLOSSOM EXAMPLES
  Request More Information (Lead) Forms

  Find a Recruiter

  Subscriber

  Life Ops

  Reserve Pay Calculator

  Training Locations Map

  Poll




                                     13   WEBINAR
CAMPBELL
         EWALD



FIND A RECRUITER

  Finds the nearest Enlisted and Officer
  Recruiter Locations based on the postal
  code entered by the site visitor
  Collect and validate input, call Navy Web
  Service, display results.




                                         14   WEBINAR
CAMPBELL
         EWALD



LIFE OPS
   Personality Profile Test to help
   potential recruits plan their
   future
   Wizard type interface
   Collect and validate selected
   options from site visitor, populate
   model, then calculate and display
   results




                                     15   WEBINAR
CAMPBELL
        EWALD



STANDARD TEMPLATING KIT
   The STK is a production-
  ready website construction
         framework.

 • Best Practices
 • Rapid Prototyping
 • Modular Architecture
 • Extensible
 • Standards-Compliant


                               16   WEBINAR
CAMPBELL
 EWALD



BUILDING LIFE OPS: STEP-BY-STEP




              17             WEBINAR
CAMPBELL
             EWALD



GETTING STARTED
  Starting Spring - Add the Blossom Servlet Context Listener to your web.xml
  <listener>
    <listener-class>info.magnolia.module.blossom.support.ServletContextExposingContextListener</listener-class>
  </listener>


  Create a module for your custom Spring application components, quickest way:
  $ mvn archetype:generate -DarchetypeCatalog=http://nexus.magnolia-cms.com/content/groups/public/


  Have your module class extend BlossomModuleSupport and implement start and stop
  methods:
  public class BlossomSampleModule extends BlossomModuleSupport implements ModuleLifecycle {
    public void start(ModuleLifecycleContext moduleLifecycleContext) {
      initRootWebApplicationContext("classpath:/applicationContext.xml");
      initBlossomDispatcherServlet("blossom", "classpath:/blossom-servlet.xml");
    }
    public void stop(ModuleLifecycleContext moduleLifecycleContext) {
      destroyDispatcherServlets();
      closeRootWebApplicationContext();
    }
  }




                                                    18                                                 WEBINAR
CAMPBELL
             EWALD



SPRING BEAN CONFIGURATION

  Create a Spring bean config file called applicationContext.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:blossom="http://www.magnolia-cms.com/schema/blossom"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.magnolia-cms.com/schema/blossom http://www.magnolia-cms.com/schema/blossom-1.2.xsd">

    <blossom:configuration />

  </beans>




                                                    19                                                 WEBINAR
CAMPBELL
             EWALD



SPRING BEAN CONFIGURATION
  Create a Spring bean config file called blossom-servlet.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="...">

    <context:annotation-config />

    <context:component-scan base-package="com.c_e.webinar.magnolia.module.blossomsample" use-default-filters="false">
      <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.Paragraph" />
      <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.Template" />
      <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.DialogFactory" />
      <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.VirtualURIMapper" />
      <context:include-filter type="assignable" expression="info.magnolia.cms.beans.config.VirtualURIMapping" />
    </context:component-scan>
    ...
  </beans>




                                                    20                                                 WEBINAR
CAMPBELL
             EWALD



SPRING BEAN CONFIGURATION
  Add Spring Handler Adapters and Mappings to blossom-servlet.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <beans ...>
    ...
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
      <property name="customArgumentResolver">
        <bean class="info.magnolia.module.blossom.web.BlossomWebArgumentResolver" />
      </property>
    </bean>
    <bean class="info.magnolia.module.blossom.preexecution.BlossomHandlerMapping">
      <property name="targetHandlerMappings">
        <list>
           <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
             <property name="useDefaultSuffixPattern" value="false" />
           </bean>
           <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
        </list>
      </property>
    </bean>
    ...
  </beans>




                                                      21                                                   WEBINAR
CAMPBELL
             EWALD



SPRING BEAN CONFIGURATION
  Add Spring View Resolvers to blossom-servlet.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <beans...>
    ...
    <bean class="info.magnolia.module.blossom.view.UuidRedirectViewResolver">
      <property name="order" name="1" />
    </bean>
    <bean class="info.magnolia.module.blossom.view.TemplateViewResolver">
      <property name="order" name="2" />
      <property name="prefix" name="/ce-webinar-templating-kit/templates/blossomsamples" />
      <property name="suffix" name=".ftl" />
      <property name="viewRenderer">
        <bean class="info.magnolia.module.blossom.view.FreemarkerTemplateViewRenderer" />
      </property>
    </bean>
    <bean class="info.magnolia.module.blossom.view.ParagraphViewResolver">
      <property name="order" name="3" />
      <property name="prefix" name="/ce-webinar-templating-kit/paragraphs/blossomsamples" />
      <property name="suffix" name=".ftl" />
      <property name="viewRenderer">
        <bean class="info.magnolia.module.blossom.view.FreemarkerParagraphViewRenderer" />
      </property>
    </bean>
  </beans>




                                                    22                                         WEBINAR
CAMPBELL
           EWALD



LIFE OPS MODEL
  Uses Bean Validation API (JSR 303)

  Excerpt:
  public class LifeOps implements Serializable {
      ...
      @NotNull
      @Min(0)
      @Max(18)
      private Integer advisor;

      ...
      @NotNull
      @Min(0)
      @Max(18)
      private Integer doer;
      ...
  }




                                                   23   WEBINAR
CAMPBELL
            EWALD



LIFE OPS MODEL
  Add in bean validation support to blossom-servlet.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <beans ...>
    ...
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
      ...
      <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
          <property name="validator" ref="validator" />
        </bean>
      </property>
    </bean>

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
    ...
  </beans>




                                                   24                                                 WEBINAR
CAMPBELL
            EWALD



LIFE OPS MODEL
  Constructor
  public LifeOps(Integer advisor, Integer doer, Integer innovator, Integer persuader, Integer planner, Integer
  problemSolver) {
      this.advisor = advisor;
      this.doer = doer;
      this.innovator = innovator;
      this.persuader = persuader;
      this.planner = planner;
      this.problemSolver = problemSolver;
  }


  Constructor using transients:
  public LifeOps(String[] activities, String[] interests, String[] careers) {
      this.activities = activities;
      this.interests = interests;
      this.careers = careers;
      this.resetScores();
      this.calculateScores(activities);
      this.calculateScores(interests);
      this.calculateScores(careers);
  }




                                                   25                                                 WEBINAR
CAMPBELL
                  EWALD



LIFE OPS SPRING VALIDATOR
public class LifeOpsValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return LifeOps.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        LifeOps lifeOps = (LifeOps) target;
        if (lifeOps.getActivities() == null || lifeOps.getActivities().length == 0) {
            errors.rejectValue("activities", "activities.required", "Please choose at least one activity before proceeding.");
        }
        if (lifeOps.getInterests() == null || lifeOps.getInterests().length == 0) {
            errors.rejectValue("interests", "interests.required", "Please choose at least one interest before proceeding.");
        }
        if (lifeOps.getCareers() == null || lifeOps.getCareers().length == 0) {
            errors.rejectValue("careers", "careers.required", "Please choose at least one career before proceeding.");
        }
    }
}




                                                         26                                                 WEBINAR
CAMPBELL
                  EWALD



LIFE OPS CONTROLLER
@Controller
@RequestMapping("/life-ops")
@Paragraph("Life Ops form")
@ParagraphDescription("Adds a Life Ops form and displays Life Ops Results")
@I18nBasename("com.c_e.webinar.magnolia.module.blossomsample.messages")
public class LifeOpsController {

	   private static final Logger log = LoggerFactory.getLogger(LifeOpsController.class);
	
	   private final String LIFE_OPS_FORM_PATH = "life-ops/form";
	   private final String LIFE_OPS_SHOW_PATH = "life-ops/show";
	
    @Autowired
    private Validator validator;
	
    @RequestMapping(method = RequestMethod.GET)
    public String form(LifeOps lifeOps) {
        return LIFE_OPS_FORM_PATH;
    }
    ...
}




                                                         27                               WEBINAR
CAMPBELL
                  EWALD



LIFE OPS CONTROLLER
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@Valid LifeOps lifeOps, BindingResult result, Model model) {
    new LifeOpsValidator().validate(lifeOps, result);
    if (result.hasErrors()) {
        List<FieldError> fieldErrors = result.getFieldErrors();
        Map<String, String> errorsMap = new HashMap<String, String>();
        for (int i = 0; i < fieldErrors.size(); i++) {
             FieldError thisError = fieldErrors.get(i);
             errorsMap.put(thisError.getField(), thisError.getDefaultMessage() );
        }
        lifeOps.setErrors(errorsMap);
        model.addAttribute("lifeOps", lifeOps);
        return LIFE_OPS_FORM_PATH;
    } else {
        lifeOps = new LifeOps(lifeOps.getActivities(), lifeOps.getInterests(), lifeOps.getCareers() );
        model.addAttribute("lifeOps", lifeOps);
        return "redirect:/" + STKUtil.getSite().getName() + "/life-ops/results"
                     + "/" + lifeOps.getAdvisor()
                     + "/" + lifeOps.getDoer()
                     + "/" + lifeOps.getInnovator()
                     + "/" + lifeOps.getPersuader()
                     + "/" + lifeOps.getPlanner()
                     + "/" + lifeOps.getProblemSolver();
    }
}




                                                         28                                              WEBINAR
CAMPBELL
                  EWALD



LIFE OPS CONTROLLER
@RequestMapping(method = RequestMethod.GET, params = "advisor")
public String show(
    @RequestParam Integer advisor,
    @RequestParam Integer doer,
    @RequestParam Integer innovator,
    @RequestParam Integer persuader,
    @RequestParam Integer planner,
    @RequestParam Integer problemSolver,
    Model model) {

    try {
        LifeOps lifeOps = new LifeOps(advisor, doer, innovator, persuader, planner, problemSolver);
        model.addAttribute("lifeOps", lifeOps);
    } catch (Exception e) {
        log.error("LifeOpsController.show() Exception:" + e);
    }

    return LIFE_OPS_SHOW_PATH;
}




                                                         29                                           WEBINAR
CAMPBELL
                  EWALD



LIFE OPS CONTROLLER
@TabFactory("Settings")
public void addTab(TabBuilder builder) {
    builder.addEdit("activitiesText", "Activities Text", "A short description for the activities fieldset");
    builder.addEdit("interestsText", "Interests Text", "A short description for the interests fieldset");
    builder.addEdit("careersText", "Careers Text", "A short description for the interests fieldset");
    builder.addFckEditor("resultsText", "Results Text", "A short intro for the results page");
}




                                                         30                                                    WEBINAR
CAMPBELL
                  EWALD



LIFE OPS VIRTUAL URI MAPPING
@VirtualURIMapper
public class LifeOpsURIMapper {

    private Pattern pattern;

    public LifeOpsURIMapper() {
        this.pattern = Pattern.compile("^/life-ops/results/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?
[0-8])/([0-1]?[0-8])/?");
    }

    public String mapping(String uri, HttpServletRequest request) {
        this.pattern = Pattern.compile("^/(" + STKUtil.getSite().getName()
                + "/)?life-ops/results/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?
[0-8])/?");
        Matcher matcher = pattern.matcher(uri);
        if (matcher.matches()) {
            return matcher.replaceAll("forward:/" + STKUtil.getSite().getName()
                     + "/life-ops/results/?advisor=$2&doer=$3&innovator=$4&persuader=$5&planner=$6&problemSolver=$7");
        }
        return null;
    }
	
}




                                                          31                                                 WEBINAR
CAMPBELL
                       EWALD



LIFE OPS FORM VIEW
[#assign cms=JspTaglibs["cms-taglib"]]
[#assign form=JspTaglibs["http://www.springframework.org/tags/form"]]

<div>
    [@cms.editBar /]

    [@form.form id="life-ops-form" modelAttribute="lifeOps"]
        ...
        <fieldset>
            <legend>Activities</legend>
            ...
            <dl class="prop">
                <dt><span>What do you like to do?</span></dt>
                <dd class="value">
                     <ul>
                          <li>
                               <input id="activities1" name="activities" value="D" type="checkbox" />
                               <label for="activities1"><strong>Set up a home computer network</strong></label>
                          </li>
                          <li>
                               <input id="activities2" name="activities" value="S" type="checkbox" />
                               <label for="activities2"><strong>Track the path of a hurricane</strong></label>
                          </li>
                          ...
                     </ul>
                 </dd>
             </dl>
         </fieldset>




                                                                     32                                           WEBINAR
CAMPBELL
                  EWALD



LIFE OPS RESULTS VIEW
[#assign results = [
    {"name": "problemSolver",   "label":   "Problem Solver",   "score":   lifeOps.problemSolver},
    {"name": "planner",         "label":   "Planner",          "score":   lifeOps.planner},
    {"name": "persuader",       "label":   "Persuader",        "score":   lifeOps.persuader},
    {"name": "innovator",       "label":   "Innovator",        "score":   lifeOps.innovator},
    {"name": "doer",            "label":   "Do-er",            "score":   lifeOps.doer},
    {"name": "advisor",         "label":   "Advisor",          "score":   lifeOps.advisor}
]]
...




                                                           33                                       WEBINAR
CAMPBELL
                    EWALD



LIFE OPS RESULTS VIEW
<div class="super-list">
    [@cms.editBar /]
    <ul>
         [#list results?sort_by("score")?reverse as result]
             [#assign profileDivId = result.label?lower_case?trim?replace(' ', '-')]
             [#assign scoreWidth = (result.score/2)*11+"%"]
             [#assign contentCollectionText = result.name + "Text"]
             [#assign contentCollectionExtras = result.name + "Extras"]
             <li>
                  <h3>
                       <a rel="bookmark" href="#${profileDivId}" title="${result.label}">
                            <dfn style="width:${scoreWidth};"><strong>${result.label}</strong></dfn>
                       </a>
                  </h3>
                  ...
                  [#if contentCollectionText?exists]
                       [@cms.contentNodeIterator contentNodeCollectionName=contentCollectionText]
                            [@cms.includeTemplate/]
                       [/@cms.contentNodeIterator]
                  [/#if]
                  [@cms.newBar contentNodeCollectionName=contentCollectionText paragraph="stkTextImage, stkTeaserGroup" /]
                  ...
             </li>
         [/#list]
    </ul>
</div><!-- end super-list -->




                                                               34                                                      WEBINAR
CAMPBELL
EWALD




           QUESTIONS



           35          WEBINAR
CAMPBELL
     EWALD



CONTACT INFO
      MATT	
  DERTINGER	
  SOLUTIONS	
  ARCHITECT,	
  INTERACTIVE	
  R&D,	
  CE	
  DETROIT
      CAMPBELL	
  EWALD
      Twi9er:	
  @ma9nolia


      SEAN	
  MCMAINS	
  SALES	
  ENGINEER
      MAGNOLIA	
  CMS
      sean.mcmains@magnolia-­‐cms.com


      TOBIAS	
  MATTSSON	
  SENIOR	
  SOFTWARE	
  ENGINEER	
  &	
  BLOSSOM	
  DEVELOPER
      MAGNOLIA	
  CMS
      tobias.ma9sson@magnolia-­‐cms.com




                                                  36                                         WEBINAR
CAMPBELL
         EWALD



FURTHER READING
  Visit the Magnolia documentation site to download Magnolia and find tutorials and guides
  http://documentation.magnolia-cms.com/index.html

  The Blossom reference documentation
  http://documentation.magnolia-cms.com/modules/blossom.html

  Blossom Sample Webapp
  http://documentation.magnolia-cms.com/modules/blossom.html#GettingStarted

  Tobias Mattsson's blog
  http://tobias-mattsson-magnolia.blogspot.com/

  Ask your questions and see what others are doing at the Magnolia community forum
  http://forum.magnolia-cms.com/forum.html




                                       37                                      WEBINAR

Más contenido relacionado

La actualidad más candente

Extreme Web Productivity with Spring Roo
Extreme Web Productivity with Spring RooExtreme Web Productivity with Spring Roo
Extreme Web Productivity with Spring RooStefan Schmidt
 
Enable seo friendly url in websphere portal
Enable seo friendly url in websphere portalEnable seo friendly url in websphere portal
Enable seo friendly url in websphere portalmichele buccarello
 
Primefaces mobile users_guide_0_9
Primefaces mobile users_guide_0_9Primefaces mobile users_guide_0_9
Primefaces mobile users_guide_0_9ednilsoncampos
 
Customize it! Make IBM Connections look your way
Customize it! Make IBM Connections look your way Customize it! Make IBM Connections look your way
Customize it! Make IBM Connections look your way Klaus Bild
 
Websphere portal theme menu framework
Websphere portal theme menu frameworkWebsphere portal theme menu framework
Websphere portal theme menu frameworkmichele buccarello
 
Microservices Tutorial Session at JavaOne 2016
Microservices Tutorial Session at JavaOne 2016Microservices Tutorial Session at JavaOne 2016
Microservices Tutorial Session at JavaOne 2016Jason Swartz
 
Start Developing Apps for Magnolia CMS
Start Developing Apps for Magnolia CMSStart Developing Apps for Magnolia CMS
Start Developing Apps for Magnolia CMSMagnolia
 
Fisl 11 - Dicas de Desenvolvimento Web com Ruby
Fisl 11 - Dicas de Desenvolvimento Web com RubyFisl 11 - Dicas de Desenvolvimento Web com Ruby
Fisl 11 - Dicas de Desenvolvimento Web com RubyFabio Akita
 
IBM Connections 4.5 User Data Propagation.
IBM Connections 4.5 User Data Propagation.IBM Connections 4.5 User Data Propagation.
IBM Connections 4.5 User Data Propagation.michele buccarello
 
Building jQuery Mobile Web Apps
Building jQuery Mobile Web AppsBuilding jQuery Mobile Web Apps
Building jQuery Mobile Web AppsOperation Mobile
 

La actualidad más candente (12)

Extreme Web Productivity with Spring Roo
Extreme Web Productivity with Spring RooExtreme Web Productivity with Spring Roo
Extreme Web Productivity with Spring Roo
 
Enable seo friendly url in websphere portal
Enable seo friendly url in websphere portalEnable seo friendly url in websphere portal
Enable seo friendly url in websphere portal
 
Primefaces mobile users_guide_0_9
Primefaces mobile users_guide_0_9Primefaces mobile users_guide_0_9
Primefaces mobile users_guide_0_9
 
Customize it! Make IBM Connections look your way
Customize it! Make IBM Connections look your way Customize it! Make IBM Connections look your way
Customize it! Make IBM Connections look your way
 
Websphere portal theme menu framework
Websphere portal theme menu frameworkWebsphere portal theme menu framework
Websphere portal theme menu framework
 
Microservices Tutorial Session at JavaOne 2016
Microservices Tutorial Session at JavaOne 2016Microservices Tutorial Session at JavaOne 2016
Microservices Tutorial Session at JavaOne 2016
 
Start Developing Apps for Magnolia CMS
Start Developing Apps for Magnolia CMSStart Developing Apps for Magnolia CMS
Start Developing Apps for Magnolia CMS
 
Fisl 11 - Dicas de Desenvolvimento Web com Ruby
Fisl 11 - Dicas de Desenvolvimento Web com RubyFisl 11 - Dicas de Desenvolvimento Web com Ruby
Fisl 11 - Dicas de Desenvolvimento Web com Ruby
 
IBM Connections 4.5 User Data Propagation.
IBM Connections 4.5 User Data Propagation.IBM Connections 4.5 User Data Propagation.
IBM Connections 4.5 User Data Propagation.
 
Search engine optimization (seo)
Search engine optimization (seo)Search engine optimization (seo)
Search engine optimization (seo)
 
Using Wireframes
Using WireframesUsing Wireframes
Using Wireframes
 
Building jQuery Mobile Web Apps
Building jQuery Mobile Web AppsBuilding jQuery Mobile Web Apps
Building jQuery Mobile Web Apps
 

Similar a Magnolia blossom-webinar

US NAVY Slideshare Spring APPS
US NAVY Slideshare Spring APPSUS NAVY Slideshare Spring APPS
US NAVY Slideshare Spring APPSCara Lynn Mallow
 
Multi client Development with Spring
Multi client Development with SpringMulti client Development with Spring
Multi client Development with SpringJoshua Long
 
Get MEAN! Node.js and the MEAN stack
Get MEAN!  Node.js and the MEAN stackGet MEAN!  Node.js and the MEAN stack
Get MEAN! Node.js and the MEAN stackNicholas McClay
 
Multi Client Development with Spring
Multi Client Development with SpringMulti Client Development with Spring
Multi Client Development with SpringJoshua Long
 
Planbox Backbone MVC
Planbox Backbone MVCPlanbox Backbone MVC
Planbox Backbone MVCAcquisio
 
Using Magnolia in a Microservices Architecture
Using Magnolia in a Microservices ArchitectureUsing Magnolia in a Microservices Architecture
Using Magnolia in a Microservices ArchitectureMagnolia
 
ActiveMQ Configuration
ActiveMQ ConfigurationActiveMQ Configuration
ActiveMQ ConfigurationAshish Mishra
 
Deployment of DevOps Environment with CA Solutions
Deployment of DevOps Environment with CA SolutionsDeployment of DevOps Environment with CA Solutions
Deployment of DevOps Environment with CA SolutionsNic Swart
 
Struts An Open-source Architecture for Web Applications
Struts An Open-source Architecture for Web ApplicationsStruts An Open-source Architecture for Web Applications
Struts An Open-source Architecture for Web Applicationselliando dias
 
Integration and Batch Processing on Cloud Foundry
Integration and Batch Processing on Cloud FoundryIntegration and Batch Processing on Cloud Foundry
Integration and Batch Processing on Cloud FoundryJoshua Long
 
Cloud-Native Modernization or Death? A false dichotomy. | DevNation Tech Talk
Cloud-Native Modernization or Death? A false dichotomy. | DevNation Tech TalkCloud-Native Modernization or Death? A false dichotomy. | DevNation Tech Talk
Cloud-Native Modernization or Death? A false dichotomy. | DevNation Tech TalkRed Hat Developers
 
Building a Scalable Federated Hybrid Cloud
Building a Scalable Federated Hybrid CloudBuilding a Scalable Federated Hybrid Cloud
Building a Scalable Federated Hybrid CloudPLUMgrid
 
Gear6 and Scaling Website Performance: Caching Session and Profile Data with...
Gear6 and Scaling Website Performance:  Caching Session and Profile Data with...Gear6 and Scaling Website Performance:  Caching Session and Profile Data with...
Gear6 and Scaling Website Performance: Caching Session and Profile Data with...Gear6
 
VMware vFabric - Webinar with CIO Magazine
VMware vFabric - Webinar with CIO MagazineVMware vFabric - Webinar with CIO Magazine
VMware vFabric - Webinar with CIO MagazineAl Sargent
 
Highly Scalable User Experience Design: Vaadin and Magnolia
Highly Scalable User Experience Design: Vaadin and MagnoliaHighly Scalable User Experience Design: Vaadin and Magnolia
Highly Scalable User Experience Design: Vaadin and MagnoliaMagnolia
 

Similar a Magnolia blossom-webinar (20)

US NAVY Slideshare Spring APPS
US NAVY Slideshare Spring APPSUS NAVY Slideshare Spring APPS
US NAVY Slideshare Spring APPS
 
Multi client Development with Spring
Multi client Development with SpringMulti client Development with Spring
Multi client Development with Spring
 
Quality control in a cloudy world
Quality control in a cloudy worldQuality control in a cloudy world
Quality control in a cloudy world
 
Get MEAN! Node.js and the MEAN stack
Get MEAN!  Node.js and the MEAN stackGet MEAN!  Node.js and the MEAN stack
Get MEAN! Node.js and the MEAN stack
 
Multi Client Development with Spring
Multi Client Development with SpringMulti Client Development with Spring
Multi Client Development with Spring
 
Planbox Backbone MVC
Planbox Backbone MVCPlanbox Backbone MVC
Planbox Backbone MVC
 
Using Magnolia in a Microservices Architecture
Using Magnolia in a Microservices ArchitectureUsing Magnolia in a Microservices Architecture
Using Magnolia in a Microservices Architecture
 
ActiveMQ Configuration
ActiveMQ ConfigurationActiveMQ Configuration
ActiveMQ Configuration
 
Deployment of DevOps Environment with CA Solutions
Deployment of DevOps Environment with CA SolutionsDeployment of DevOps Environment with CA Solutions
Deployment of DevOps Environment with CA Solutions
 
Struts An Open-source Architecture for Web Applications
Struts An Open-source Architecture for Web ApplicationsStruts An Open-source Architecture for Web Applications
Struts An Open-source Architecture for Web Applications
 
Introduction to ASP.NET MVC
Introduction to ASP.NET MVCIntroduction to ASP.NET MVC
Introduction to ASP.NET MVC
 
Integration and Batch Processing on Cloud Foundry
Integration and Batch Processing on Cloud FoundryIntegration and Batch Processing on Cloud Foundry
Integration and Batch Processing on Cloud Foundry
 
Cloud-Native Modernization or Death? A false dichotomy. | DevNation Tech Talk
Cloud-Native Modernization or Death? A false dichotomy. | DevNation Tech TalkCloud-Native Modernization or Death? A false dichotomy. | DevNation Tech Talk
Cloud-Native Modernization or Death? A false dichotomy. | DevNation Tech Talk
 
Building a Scalable Federated Hybrid Cloud
Building a Scalable Federated Hybrid CloudBuilding a Scalable Federated Hybrid Cloud
Building a Scalable Federated Hybrid Cloud
 
Gear6 and Scaling Website Performance: Caching Session and Profile Data with...
Gear6 and Scaling Website Performance:  Caching Session and Profile Data with...Gear6 and Scaling Website Performance:  Caching Session and Profile Data with...
Gear6 and Scaling Website Performance: Caching Session and Profile Data with...
 
SCA Reaches the Cloud
SCA Reaches the CloudSCA Reaches the Cloud
SCA Reaches the Cloud
 
VMware vFabric - Webinar with CIO Magazine
VMware vFabric - Webinar with CIO MagazineVMware vFabric - Webinar with CIO Magazine
VMware vFabric - Webinar with CIO Magazine
 
NodeJS @ ACS
NodeJS @ ACSNodeJS @ ACS
NodeJS @ ACS
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
Highly Scalable User Experience Design: Vaadin and Magnolia
Highly Scalable User Experience Design: Vaadin and MagnoliaHighly Scalable User Experience Design: Vaadin and Magnolia
Highly Scalable User Experience Design: Vaadin and Magnolia
 

Más de bkraft

The Open Suite Approach: How to ride the shock waves of a changing web
The Open Suite Approach: How to ride the shock waves of a changing webThe Open Suite Approach: How to ride the shock waves of a changing web
The Open Suite Approach: How to ride the shock waves of a changing webbkraft
 
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...bkraft
 
Magnolia Conference 2013: Keynote
Magnolia Conference 2013: KeynoteMagnolia Conference 2013: Keynote
Magnolia Conference 2013: Keynotebkraft
 
Webinar slides: Orchestrate Your Digital Channels with Magnolia 5
Webinar slides: Orchestrate Your Digital Channels with Magnolia 5Webinar slides: Orchestrate Your Digital Channels with Magnolia 5
Webinar slides: Orchestrate Your Digital Channels with Magnolia 5bkraft
 
Webinar - Why Magnolia 5 Rocks For IT
Webinar - Why Magnolia 5 Rocks For ITWebinar - Why Magnolia 5 Rocks For IT
Webinar - Why Magnolia 5 Rocks For ITbkraft
 
Increase Online Sales with Magnolia CMS' Shop Module
Increase Online Sales with Magnolia CMS' Shop ModuleIncrease Online Sales with Magnolia CMS' Shop Module
Increase Online Sales with Magnolia CMS' Shop Modulebkraft
 
Virtual Presence Management at Magnolia Amplify Miami 2013
Virtual Presence Management at Magnolia Amplify Miami 2013Virtual Presence Management at Magnolia Amplify Miami 2013
Virtual Presence Management at Magnolia Amplify Miami 2013bkraft
 
High performance and scalability
High performance and scalability High performance and scalability
High performance and scalability bkraft
 
Multilingual websites, microsites and landing pages
Multilingual websites, microsites and landing pagesMultilingual websites, microsites and landing pages
Multilingual websites, microsites and landing pagesbkraft
 
Blossom on the web
Blossom on the webBlossom on the web
Blossom on the webbkraft
 
Single sourcing desktop and mobile websites
Single sourcing desktop and mobile websitesSingle sourcing desktop and mobile websites
Single sourcing desktop and mobile websitesbkraft
 
Work life balance
Work life balanceWork life balance
Work life balancebkraft
 
Magnolia and PHPCR
Magnolia and PHPCRMagnolia and PHPCR
Magnolia and PHPCRbkraft
 
Solr and Image Module Extensions of Magnolia
Solr and Image Module Extensions of MagnoliaSolr and Image Module Extensions of Magnolia
Solr and Image Module Extensions of Magnoliabkraft
 
End to end content managed online mobile banking
End to end content managed online mobile bankingEnd to end content managed online mobile banking
End to end content managed online mobile bankingbkraft
 
MBC Group - Magnolia in the Media
MBC Group - Magnolia in the MediaMBC Group - Magnolia in the Media
MBC Group - Magnolia in the Mediabkraft
 
Yet Another E-Commerce Integration: Magnolia Loves Hybris
Yet Another E-Commerce Integration: Magnolia Loves Hybris Yet Another E-Commerce Integration: Magnolia Loves Hybris
Yet Another E-Commerce Integration: Magnolia Loves Hybris bkraft
 
Bridging the Gap: Magnolia Modules and Spring Configured Software
Bridging the Gap: Magnolia Modules and Spring Configured SoftwareBridging the Gap: Magnolia Modules and Spring Configured Software
Bridging the Gap: Magnolia Modules and Spring Configured Softwarebkraft
 
User Management and SSO for Austrian Government
User Management and SSO for Austrian GovernmentUser Management and SSO for Austrian Government
User Management and SSO for Austrian Governmentbkraft
 
Enterprise Extensions to Magnolia's Imaging
Enterprise Extensions to Magnolia's ImagingEnterprise Extensions to Magnolia's Imaging
Enterprise Extensions to Magnolia's Imagingbkraft
 

Más de bkraft (20)

The Open Suite Approach: How to ride the shock waves of a changing web
The Open Suite Approach: How to ride the shock waves of a changing webThe Open Suite Approach: How to ride the shock waves of a changing web
The Open Suite Approach: How to ride the shock waves of a changing web
 
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...
Von der statischen Website zur virtuellen Präsenz - Vortrag für Nordwestschwe...
 
Magnolia Conference 2013: Keynote
Magnolia Conference 2013: KeynoteMagnolia Conference 2013: Keynote
Magnolia Conference 2013: Keynote
 
Webinar slides: Orchestrate Your Digital Channels with Magnolia 5
Webinar slides: Orchestrate Your Digital Channels with Magnolia 5Webinar slides: Orchestrate Your Digital Channels with Magnolia 5
Webinar slides: Orchestrate Your Digital Channels with Magnolia 5
 
Webinar - Why Magnolia 5 Rocks For IT
Webinar - Why Magnolia 5 Rocks For ITWebinar - Why Magnolia 5 Rocks For IT
Webinar - Why Magnolia 5 Rocks For IT
 
Increase Online Sales with Magnolia CMS' Shop Module
Increase Online Sales with Magnolia CMS' Shop ModuleIncrease Online Sales with Magnolia CMS' Shop Module
Increase Online Sales with Magnolia CMS' Shop Module
 
Virtual Presence Management at Magnolia Amplify Miami 2013
Virtual Presence Management at Magnolia Amplify Miami 2013Virtual Presence Management at Magnolia Amplify Miami 2013
Virtual Presence Management at Magnolia Amplify Miami 2013
 
High performance and scalability
High performance and scalability High performance and scalability
High performance and scalability
 
Multilingual websites, microsites and landing pages
Multilingual websites, microsites and landing pagesMultilingual websites, microsites and landing pages
Multilingual websites, microsites and landing pages
 
Blossom on the web
Blossom on the webBlossom on the web
Blossom on the web
 
Single sourcing desktop and mobile websites
Single sourcing desktop and mobile websitesSingle sourcing desktop and mobile websites
Single sourcing desktop and mobile websites
 
Work life balance
Work life balanceWork life balance
Work life balance
 
Magnolia and PHPCR
Magnolia and PHPCRMagnolia and PHPCR
Magnolia and PHPCR
 
Solr and Image Module Extensions of Magnolia
Solr and Image Module Extensions of MagnoliaSolr and Image Module Extensions of Magnolia
Solr and Image Module Extensions of Magnolia
 
End to end content managed online mobile banking
End to end content managed online mobile bankingEnd to end content managed online mobile banking
End to end content managed online mobile banking
 
MBC Group - Magnolia in the Media
MBC Group - Magnolia in the MediaMBC Group - Magnolia in the Media
MBC Group - Magnolia in the Media
 
Yet Another E-Commerce Integration: Magnolia Loves Hybris
Yet Another E-Commerce Integration: Magnolia Loves Hybris Yet Another E-Commerce Integration: Magnolia Loves Hybris
Yet Another E-Commerce Integration: Magnolia Loves Hybris
 
Bridging the Gap: Magnolia Modules and Spring Configured Software
Bridging the Gap: Magnolia Modules and Spring Configured SoftwareBridging the Gap: Magnolia Modules and Spring Configured Software
Bridging the Gap: Magnolia Modules and Spring Configured Software
 
User Management and SSO for Austrian Government
User Management and SSO for Austrian GovernmentUser Management and SSO for Austrian Government
User Management and SSO for Austrian Government
 
Enterprise Extensions to Magnolia's Imaging
Enterprise Extensions to Magnolia's ImagingEnterprise Extensions to Magnolia's Imaging
Enterprise Extensions to Magnolia's Imaging
 

Último

Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 

Último (20)

Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 

Magnolia blossom-webinar

  • 1. US NAVY INTEGRATES SPRING APPS WITH FLYING COLORS THANKS TO WEB CMS +
  • 2. CAMPBELL EWALD ABOUT THE WEBINAR Posting Questions Viewing the recorded webinar and related materials Contacting Us Tweeting - use hash tags: #magnolia_cms #campbellewald #springframework #springmvc #USNavy 2 WEBINAR
  • 3. CAMPBELL EWALD ABOUT US MATT  DERTINGER  SOLUTIONS  ARCHITECT,  INTERACTIVE  R&D,  CE  DETROIT CAMPBELL  EWALD Twi9er:  @ma9nolia SEAN  MCMAINS  SALES  ENGINEER MAGNOLIA  CMS sean.mcmains@magnolia-­‐CMS.com TOBIAS  MATTSSON  SENIOR  SOFTWARE  ENGINEER  &  BLOSSOM  DEVELOPER MAGNOLIA  CMS tobias.ma9sson@magnolia-­‐cms.com 3 WEBINAR
  • 4. CAMPBELL EWALD ABOUT CAMPBELL EWALD AND MAGNOLIA CAMPBELL EWALD Digital Agency Magnolia Partner General Motors, Kaiser Permanente, US Postal Service Magnolia Java-based Content Management System Community and Enterprise Editions Sony, Deloitte, Airbus and JBoss 4 WEBINAR
  • 5. CAMPBELL EWALD WHAT WE’LL TALK ABOUT Overview of Magnolia Blossom module Navy Use Cases Step-by-Step Walkthrough Questions 5 WEBINAR
  • 6. CAMPBELL EWALD BLOSSOM OVERVIEW 6 WEBINAR
  • 7. CAMPBELL EWALD A LITTLE PHILOSOPHY The idea that sparked me writing the Blossom Module for Magnolia CMS was to bring the CMS and especially the content into Spring Web MVC not the other way around. Controllers should be the building blocks when composing pages. – Tobias Mattsson http://tobias-mattsson-magnolia.blogspot.com/2011/03/spring-web-mvc-with-content.html 7 WEBINAR
  • 8. CAMPBELL EWALD WHAT’S BLOSSOM Spring integration module for Magnolia CMS Spring Web MVC with Content Key features: Annotation based API Spring controllers exposed as template components Pre-execution of template components 8 WEBINAR
  • 9. CAMPBELL EWALD WHY USE BLOSSOM Leverages proven Spring Framework Easily integrate or migrate existing Spring-based applications Spring developers will feel right at home Dynamic dialogs,Virtual URI Mappings, Pre-execution Easily access content in controllers Best practice web app design patterns (MVC, IoC, AOP) Open Source and Free to download and use 9 WEBINAR
  • 10. CAMPBELL EWALD NAVY USE CASES TM 10 WEBINAR
  • 11. CAMPBELL EWALD ABOUT NAVY.COM Official recruitment Website for the U.S. Navy Redesigned in 2010, moved to Magnolia CMS Application integration for subscription services, CRUD functionality and user-space applications 11 WEBINAR
  • 12. CAMPBELL EWALD BLOSSOM + RESTEASY Navy.com Navy Custom Module RESTEasy provided nice Blossom JAX-RS client Aligned with Magnolia CMS roadmap Navy Web Service Registry Allowed business Business Component 1 Business Component 3 components to be loosely- Business Component 2 Business Component n coupled to CMS 12 WEBINAR
  • 13. CAMPBELL EWALD BLOSSOM EXAMPLES Request More Information (Lead) Forms Find a Recruiter Subscriber Life Ops Reserve Pay Calculator Training Locations Map Poll 13 WEBINAR
  • 14. CAMPBELL EWALD FIND A RECRUITER Finds the nearest Enlisted and Officer Recruiter Locations based on the postal code entered by the site visitor Collect and validate input, call Navy Web Service, display results. 14 WEBINAR
  • 15. CAMPBELL EWALD LIFE OPS Personality Profile Test to help potential recruits plan their future Wizard type interface Collect and validate selected options from site visitor, populate model, then calculate and display results 15 WEBINAR
  • 16. CAMPBELL EWALD STANDARD TEMPLATING KIT The STK is a production- ready website construction framework. • Best Practices • Rapid Prototyping • Modular Architecture • Extensible • Standards-Compliant 16 WEBINAR
  • 17. CAMPBELL EWALD BUILDING LIFE OPS: STEP-BY-STEP 17 WEBINAR
  • 18. CAMPBELL EWALD GETTING STARTED Starting Spring - Add the Blossom Servlet Context Listener to your web.xml <listener> <listener-class>info.magnolia.module.blossom.support.ServletContextExposingContextListener</listener-class> </listener> Create a module for your custom Spring application components, quickest way: $ mvn archetype:generate -DarchetypeCatalog=http://nexus.magnolia-cms.com/content/groups/public/ Have your module class extend BlossomModuleSupport and implement start and stop methods: public class BlossomSampleModule extends BlossomModuleSupport implements ModuleLifecycle { public void start(ModuleLifecycleContext moduleLifecycleContext) { initRootWebApplicationContext("classpath:/applicationContext.xml"); initBlossomDispatcherServlet("blossom", "classpath:/blossom-servlet.xml"); } public void stop(ModuleLifecycleContext moduleLifecycleContext) { destroyDispatcherServlets(); closeRootWebApplicationContext(); } } 18 WEBINAR
  • 19. CAMPBELL EWALD SPRING BEAN CONFIGURATION Create a Spring bean config file called applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:blossom="http://www.magnolia-cms.com/schema/blossom" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.magnolia-cms.com/schema/blossom http://www.magnolia-cms.com/schema/blossom-1.2.xsd"> <blossom:configuration /> </beans> 19 WEBINAR
  • 20. CAMPBELL EWALD SPRING BEAN CONFIGURATION Create a Spring bean config file called blossom-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="..."> <context:annotation-config /> <context:component-scan base-package="com.c_e.webinar.magnolia.module.blossomsample" use-default-filters="false"> <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.Paragraph" /> <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.Template" /> <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.DialogFactory" /> <context:include-filter type="annotation" expression="info.magnolia.module.blossom.annotation.VirtualURIMapper" /> <context:include-filter type="assignable" expression="info.magnolia.cms.beans.config.VirtualURIMapping" /> </context:component-scan> ... </beans> 20 WEBINAR
  • 21. CAMPBELL EWALD SPRING BEAN CONFIGURATION Add Spring Handler Adapters and Mappings to blossom-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...> ... <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="customArgumentResolver"> <bean class="info.magnolia.module.blossom.web.BlossomWebArgumentResolver" /> </property> </bean> <bean class="info.magnolia.module.blossom.preexecution.BlossomHandlerMapping"> <property name="targetHandlerMappings"> <list> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="useDefaultSuffixPattern" value="false" /> </bean> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> </list> </property> </bean> ... </beans> 21 WEBINAR
  • 22. CAMPBELL EWALD SPRING BEAN CONFIGURATION Add Spring View Resolvers to blossom-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <beans...> ... <bean class="info.magnolia.module.blossom.view.UuidRedirectViewResolver"> <property name="order" name="1" /> </bean> <bean class="info.magnolia.module.blossom.view.TemplateViewResolver"> <property name="order" name="2" /> <property name="prefix" name="/ce-webinar-templating-kit/templates/blossomsamples" /> <property name="suffix" name=".ftl" /> <property name="viewRenderer"> <bean class="info.magnolia.module.blossom.view.FreemarkerTemplateViewRenderer" /> </property> </bean> <bean class="info.magnolia.module.blossom.view.ParagraphViewResolver"> <property name="order" name="3" /> <property name="prefix" name="/ce-webinar-templating-kit/paragraphs/blossomsamples" /> <property name="suffix" name=".ftl" /> <property name="viewRenderer"> <bean class="info.magnolia.module.blossom.view.FreemarkerParagraphViewRenderer" /> </property> </bean> </beans> 22 WEBINAR
  • 23. CAMPBELL EWALD LIFE OPS MODEL Uses Bean Validation API (JSR 303) Excerpt: public class LifeOps implements Serializable { ... @NotNull @Min(0) @Max(18) private Integer advisor; ... @NotNull @Min(0) @Max(18) private Integer doer; ... } 23 WEBINAR
  • 24. CAMPBELL EWALD LIFE OPS MODEL Add in bean validation support to blossom-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...> ... <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> ... <property name="webBindingInitializer"> <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="validator" ref="validator" /> </bean> </property> </bean> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> ... </beans> 24 WEBINAR
  • 25. CAMPBELL EWALD LIFE OPS MODEL Constructor public LifeOps(Integer advisor, Integer doer, Integer innovator, Integer persuader, Integer planner, Integer problemSolver) { this.advisor = advisor; this.doer = doer; this.innovator = innovator; this.persuader = persuader; this.planner = planner; this.problemSolver = problemSolver; } Constructor using transients: public LifeOps(String[] activities, String[] interests, String[] careers) { this.activities = activities; this.interests = interests; this.careers = careers; this.resetScores(); this.calculateScores(activities); this.calculateScores(interests); this.calculateScores(careers); } 25 WEBINAR
  • 26. CAMPBELL EWALD LIFE OPS SPRING VALIDATOR public class LifeOpsValidator implements Validator { @Override public boolean supports(Class<?> clazz) { return LifeOps.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { LifeOps lifeOps = (LifeOps) target; if (lifeOps.getActivities() == null || lifeOps.getActivities().length == 0) { errors.rejectValue("activities", "activities.required", "Please choose at least one activity before proceeding."); } if (lifeOps.getInterests() == null || lifeOps.getInterests().length == 0) { errors.rejectValue("interests", "interests.required", "Please choose at least one interest before proceeding."); } if (lifeOps.getCareers() == null || lifeOps.getCareers().length == 0) { errors.rejectValue("careers", "careers.required", "Please choose at least one career before proceeding."); } } } 26 WEBINAR
  • 27. CAMPBELL EWALD LIFE OPS CONTROLLER @Controller @RequestMapping("/life-ops") @Paragraph("Life Ops form") @ParagraphDescription("Adds a Life Ops form and displays Life Ops Results") @I18nBasename("com.c_e.webinar.magnolia.module.blossomsample.messages") public class LifeOpsController { private static final Logger log = LoggerFactory.getLogger(LifeOpsController.class); private final String LIFE_OPS_FORM_PATH = "life-ops/form"; private final String LIFE_OPS_SHOW_PATH = "life-ops/show"; @Autowired private Validator validator; @RequestMapping(method = RequestMethod.GET) public String form(LifeOps lifeOps) { return LIFE_OPS_FORM_PATH; } ... } 27 WEBINAR
  • 28. CAMPBELL EWALD LIFE OPS CONTROLLER @RequestMapping(method = RequestMethod.POST) public String processSubmit(@Valid LifeOps lifeOps, BindingResult result, Model model) { new LifeOpsValidator().validate(lifeOps, result); if (result.hasErrors()) { List<FieldError> fieldErrors = result.getFieldErrors(); Map<String, String> errorsMap = new HashMap<String, String>(); for (int i = 0; i < fieldErrors.size(); i++) { FieldError thisError = fieldErrors.get(i); errorsMap.put(thisError.getField(), thisError.getDefaultMessage() ); } lifeOps.setErrors(errorsMap); model.addAttribute("lifeOps", lifeOps); return LIFE_OPS_FORM_PATH; } else { lifeOps = new LifeOps(lifeOps.getActivities(), lifeOps.getInterests(), lifeOps.getCareers() ); model.addAttribute("lifeOps", lifeOps); return "redirect:/" + STKUtil.getSite().getName() + "/life-ops/results" + "/" + lifeOps.getAdvisor() + "/" + lifeOps.getDoer() + "/" + lifeOps.getInnovator() + "/" + lifeOps.getPersuader() + "/" + lifeOps.getPlanner() + "/" + lifeOps.getProblemSolver(); } } 28 WEBINAR
  • 29. CAMPBELL EWALD LIFE OPS CONTROLLER @RequestMapping(method = RequestMethod.GET, params = "advisor") public String show( @RequestParam Integer advisor, @RequestParam Integer doer, @RequestParam Integer innovator, @RequestParam Integer persuader, @RequestParam Integer planner, @RequestParam Integer problemSolver, Model model) { try { LifeOps lifeOps = new LifeOps(advisor, doer, innovator, persuader, planner, problemSolver); model.addAttribute("lifeOps", lifeOps); } catch (Exception e) { log.error("LifeOpsController.show() Exception:" + e); } return LIFE_OPS_SHOW_PATH; } 29 WEBINAR
  • 30. CAMPBELL EWALD LIFE OPS CONTROLLER @TabFactory("Settings") public void addTab(TabBuilder builder) { builder.addEdit("activitiesText", "Activities Text", "A short description for the activities fieldset"); builder.addEdit("interestsText", "Interests Text", "A short description for the interests fieldset"); builder.addEdit("careersText", "Careers Text", "A short description for the interests fieldset"); builder.addFckEditor("resultsText", "Results Text", "A short intro for the results page"); } 30 WEBINAR
  • 31. CAMPBELL EWALD LIFE OPS VIRTUAL URI MAPPING @VirtualURIMapper public class LifeOpsURIMapper { private Pattern pattern; public LifeOpsURIMapper() { this.pattern = Pattern.compile("^/life-ops/results/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]? [0-8])/([0-1]?[0-8])/?"); } public String mapping(String uri, HttpServletRequest request) { this.pattern = Pattern.compile("^/(" + STKUtil.getSite().getName() + "/)?life-ops/results/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]?[0-8])/([0-1]? [0-8])/?"); Matcher matcher = pattern.matcher(uri); if (matcher.matches()) { return matcher.replaceAll("forward:/" + STKUtil.getSite().getName() + "/life-ops/results/?advisor=$2&doer=$3&innovator=$4&persuader=$5&planner=$6&problemSolver=$7"); } return null; } } 31 WEBINAR
  • 32. CAMPBELL EWALD LIFE OPS FORM VIEW [#assign cms=JspTaglibs["cms-taglib"]] [#assign form=JspTaglibs["http://www.springframework.org/tags/form"]] <div> [@cms.editBar /] [@form.form id="life-ops-form" modelAttribute="lifeOps"] ... <fieldset> <legend>Activities</legend> ... <dl class="prop"> <dt><span>What do you like to do?</span></dt> <dd class="value"> <ul> <li> <input id="activities1" name="activities" value="D" type="checkbox" /> <label for="activities1"><strong>Set up a home computer network</strong></label> </li> <li> <input id="activities2" name="activities" value="S" type="checkbox" /> <label for="activities2"><strong>Track the path of a hurricane</strong></label> </li> ... </ul> </dd> </dl> </fieldset> 32 WEBINAR
  • 33. CAMPBELL EWALD LIFE OPS RESULTS VIEW [#assign results = [ {"name": "problemSolver", "label": "Problem Solver", "score": lifeOps.problemSolver}, {"name": "planner", "label": "Planner", "score": lifeOps.planner}, {"name": "persuader", "label": "Persuader", "score": lifeOps.persuader}, {"name": "innovator", "label": "Innovator", "score": lifeOps.innovator}, {"name": "doer", "label": "Do-er", "score": lifeOps.doer}, {"name": "advisor", "label": "Advisor", "score": lifeOps.advisor} ]] ... 33 WEBINAR
  • 34. CAMPBELL EWALD LIFE OPS RESULTS VIEW <div class="super-list"> [@cms.editBar /] <ul> [#list results?sort_by("score")?reverse as result] [#assign profileDivId = result.label?lower_case?trim?replace(' ', '-')] [#assign scoreWidth = (result.score/2)*11+"%"] [#assign contentCollectionText = result.name + "Text"] [#assign contentCollectionExtras = result.name + "Extras"] <li> <h3> <a rel="bookmark" href="#${profileDivId}" title="${result.label}"> <dfn style="width:${scoreWidth};"><strong>${result.label}</strong></dfn> </a> </h3> ... [#if contentCollectionText?exists] [@cms.contentNodeIterator contentNodeCollectionName=contentCollectionText] [@cms.includeTemplate/] [/@cms.contentNodeIterator] [/#if] [@cms.newBar contentNodeCollectionName=contentCollectionText paragraph="stkTextImage, stkTeaserGroup" /] ... </li> [/#list] </ul> </div><!-- end super-list --> 34 WEBINAR
  • 35. CAMPBELL EWALD QUESTIONS 35 WEBINAR
  • 36. CAMPBELL EWALD CONTACT INFO MATT  DERTINGER  SOLUTIONS  ARCHITECT,  INTERACTIVE  R&D,  CE  DETROIT CAMPBELL  EWALD Twi9er:  @ma9nolia SEAN  MCMAINS  SALES  ENGINEER MAGNOLIA  CMS sean.mcmains@magnolia-­‐cms.com TOBIAS  MATTSSON  SENIOR  SOFTWARE  ENGINEER  &  BLOSSOM  DEVELOPER MAGNOLIA  CMS tobias.ma9sson@magnolia-­‐cms.com 36 WEBINAR
  • 37. CAMPBELL EWALD FURTHER READING Visit the Magnolia documentation site to download Magnolia and find tutorials and guides http://documentation.magnolia-cms.com/index.html The Blossom reference documentation http://documentation.magnolia-cms.com/modules/blossom.html Blossom Sample Webapp http://documentation.magnolia-cms.com/modules/blossom.html#GettingStarted Tobias Mattsson's blog http://tobias-mattsson-magnolia.blogspot.com/ Ask your questions and see what others are doing at the Magnolia community forum http://forum.magnolia-cms.com/forum.html 37 WEBINAR