2. WEBINAR
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
3. 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
4. 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
7. WEBINAR
CAMPBELL
EWALD
A LITTLE PHILOSOPHY
7
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
8. 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
9. 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
12. WEBINAR
CAMPBELL
EWALD
BLOSSOM + RESTEASY
RESTEasy provided nice
JAX-RS client
Aligned with Magnolia CMS
roadmap
Allowed business
components to be loosely-
coupled to CMS
12
Navy Web Service Registry
Business Component 1
Business Component 2
Business Component 3
Business Component n
Navy.com
Navy Custom Module
Blossom
14. 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
15. 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
16. 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
18. 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
19. 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
26. 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
27. 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
30. 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
31. 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
32. 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
36. 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
37. 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