SlideShare ist ein Scribd-Unternehmen logo
1 von 77
Downloaden Sie, um offline zu lesen
© 2013 SpringOne 2GX. All rights reserved.
Spring & Web
Content Management
Tobias Mattsson & Daniel Lipp
Magnolia International
2
3
4
Sr. Software Engineer, Magnolia
Lead developer of Magnolia’s Spring integration
Spring Framework user since 2005
Tobias Mattsson
5
Daniel Lipp
Sr. Software Engineer, Magnolia
17 years of experience as software architect and Java developer
Grateful to Spring for inspiring improvements to JEE 6
®
7
8
@magnolia_cms
#magnolia_cms
9
Spring
Spring MVC
Code, beautiful code
Dependency Injection
Integrations
Business logic
10
CMS
Security
Multi-lingual
User interface
Image manipulation
Content versioning
11
CMS
Security
Multi-lingual
User interface
Image manipulation
Content versioning
Spring
Spring MVC
Code, beautiful code
Dependency Injection
Integrations
Business logic
12
USES IFRAMES
LIKE IT'S 1999 13
Magnolia + Spring = Blossom 14
@Template
15
or, "How Blossom is Built"
TEMPLATEREQUEST CONTENT
CMS
16
TEMPLATEREQUEST CONTENT
CMS + Blossom
17
CONTROLLER
MODEL
VIEW
Page Template
@Controller
@Template(id="myModule:pages/main", title="Main")
public class MainTemplate {
   @RequestMapping("/main")
   public String render(ModelMap model) {
       return "pages/main";
   }
}
18
PAGES CONTAIN 0:n AREAS
19
PAGE
PAGES CONTAIN 0:n AREAS
19
PAGE
AREA
A
R
E
A
AREA
PAGES CONTAIN 0:n AREAS
19
PAGE
AREA
A
R
E
A
AREA
AREAS HAVE 0:n COMPONENTS
COMPONENT
COMPONENT
Etiam porta sem malesuada magna mollis
euismod. Duis mollis, est non commodo
luctus, nisi erat porttitor ligula, eget lacinia
odio sem nec elit.
COMPONENT
Etiam porta sem malesuada magna mollis
euismod. Morbi leo risus, porta ac consectetur
ac, vestibulum at eros. Aenean lacinia
bibendum nulla sed consectetur. Aenean eu
leo quam. Pellentesque ornare sem lacinia
quam venenatis vestibulum. Lorem ipsum
dolor sit amet, consectetur adipiscing elit. Sed
posuere consectetur est at lobortis.
C
O
M
P
O
N
E
N
T
Area Template
@Controller
@Template(id="myModule:pages/main",title="Main Template")
public class MainTemplate {
   @Controller
   @Area("main")
   public static class MainArea {
       @RequestMapping("/main/mainArea")
       public String render() {
           return "areas/main";
       }
   ...
20
Component Template
@Controller
@Template(id="myModule:components/shoppingCart",
         title="Shopping Cart")
@TemplateDescription("Shopping cart")
public class ShoppingCartComponent {
   @RequestMapping("/shoppingCart")
   public String handleRequest() {
       ...
       return "components/shoppingCart";
   }
...
21
Views 22
Rendering an Area
FreeMarker
[@cms.area name="main" /]
JSP
<cms:area name="main" />
23
Rendering Components in an Area
FreeMarker
[#list components as component]
   [@cms.component content=component /]
[/#list]
JSP
<c:forEach items="${components}" var="component">
   <cms:component content="${component}" />
</c:forEach>
24
About Magnolia CMS
100% Java/J2EE compliant
Best of breed open technology stack, including:
JSR-283 / JCR 2.0
Vaadin / GWT
Servlet API
HTML5
Highly Customizable
25
Java Content Repository
26
“… defines an abstract model and a Java
API for data storage and related services
commonly used by content-oriented
applications.” – JSR-283
Magnolia
JCR API
Persistence Manager
Jackrabbit Hierarchical
content repository
In memoryDatabaseFile system
or or
27
Why JCR?
28
Hierarchical
Event Notification
(Observation)
Role-based
security
Locking
Fine-grained content
and large binaries
Full-text
Search
Structured
Queries
Referential
Integrity
TransactionalSchema-less or
Strongly-typed
Versioning
29
Dialogs
30
GWT with server-side state
Component-based UI
Cross-browser compatibility (via GWT)
Rich component library
Fast development pace
Fluent Builder-style API
@TabFactory("Content")
public void contentTab(UiConfig cfg, TabBuilder tab) {
tab.fields(
cfg.fields.text("heading").label("Heading"),
cfg.fields.richText("body").label("Text body"),
cfg.fields.websiteLink("categoryLink").label("Link"),
cfg.fields.basicUpload("image").label("Image"),
cfg.fields.checkbox("inlineImage").label("Inline Image")
 );
}
31
Page Template with Dialog
@Controller
@Template(title="Article", id="myModule:pages/article")
public class ArticleTemplate {
   @TabFactory("Content")
   public void contentTab(UiConfig cfg, TabBuilder tab) {
       tab.fields(cfg.fields.text("title").label("Title"));
   }
}
32
Page Template with Dialog
@Controller
@Template(title="Article", id="myModule:pages/article")
public class ArticleTemplate {
   @TabFactory("Content")
   public void contentTab(UiConfig cfg, TabBuilder tab) {
       tab.fields(cfg.fields.text("title").label("Title"));
   }
} <title>${content.title}</title>
<!-- In the view -->
32
@Controller
@Template(title="Article", id="myModule:pages/article")
public class ArticleTemplate {
@Area("main")
@Controller
public static class MainArea {
@TabFactory("Content")
public void contentTab(UiConfig cfg, TabBuilder tab) {
tab.fields(
cfg.fields.text("heading").label("Heading"),
cfg.fields.text("border").label("Border width")
);
Area Template with Dialog 33
@Controller
@Template(title="Article", id="myModule:pages/article")
public class ArticleTemplate {
@Area("main")
@Controller
public static class MainArea {
@TabFactory("Content")
public void contentTab(UiConfig cfg, TabBuilder tab) {
tab.fields(
cfg.fields.text("heading").label("Heading"),
cfg.fields.text("border").label("Border width")
);
Area Template with Dialog 33
@Controller
@Template(title="Article", id="myModule:pages/article")
public class ArticleTemplate {
@Area("main")
@Controller
public static class MainArea {
@TabFactory("Content")
public void contentTab(UiConfig cfg, TabBuilder tab) {
tab.fields(
cfg.fields.text("heading").label("Heading"),
cfg.fields.text("border").label("Border width")
);
Area Template with Dialog 33
<div id="main"
style="border:${content.border}px solid #000">
<h2>${content.heading}</h2>
<c:forEach items="${components}" var="component">
<cms:component content="${component}" />
</c:forEach>
</div> <!-- In the view -->
Component Template with Dialog
@Controller
@Template(title="Text", id="myModule:components/text")
public class TextComponent {
@RequestMapping("/text")
public String render() {
return "components/text";
}
@TabFactory("Content")
public void contentTab(UiConfig cfg, TabBuilder tab) {
tab.fields(
cfg.fields.text("heading").label("Heading"),
cfg.fields.richText("body").label("Text body")
34
Component Template with Dialog
@Controller
@Template(title="Text", id="myModule:components/text")
public class TextComponent {
@RequestMapping("/text")
public String render() {
return "components/text";
}
@TabFactory("Content")
public void contentTab(UiConfig cfg, TabBuilder tab) {
tab.fields(
cfg.fields.text("heading").label("Heading"),
cfg.fields.richText("body").label("Text body")
34
<h1>${content.heading}</h1>
<p>${cmsfn:decode(content).body}</p>
<!-- In the view -->
YouTube Video Component
@Controller
@Template(title="YouTube Video", id="myModule:components/youtube")
@TemplateDescription("Embed a YouTube video")
public class YoutubeComponent {
@RequestMapping("/youtube")
public String render(Node node, ModelMap model) throws RepositoryException {
model.put("videoId", node.getProperty("videoId").getString());
return "components/youtube";
}
@TabFactory("Content")
public void contentTab(UiConfig cfg, TabBuilder tab) {
tab.fields(
cfg.fields.text("videoId").label("Video ID")
);
}
}
35
YouTube Video Component
@Controller
@Template(title="YouTube Video", id="myModule:components/youtube")
@TemplateDescription("Embed a YouTube video")
public class YoutubeComponent {
@RequestMapping("/youtube")
public String render(Node node, ModelMap model) throws RepositoryException {
model.put("videoId", node.getProperty("videoId").getString());
return "components/youtube";
}
@TabFactory("Content")
public void contentTab(UiConfig cfg, TabBuilder tab) {
tab.fields(
cfg.fields.text("videoId").label("Video ID")
);
}
}
35
<iframe width="100%" height="400" src="//www.youtube.com/
embed/${videoId}" frameborder="0" allowfullscreen></iframe>
<!-- In the view -->
Dialogs and the Class Hierarchy
public abstract class BasePageTemplate {
@TabFactory("Meta")
public void metaTab(UiConfig cfg, TabBuilder tab) {
tab.fields(
cfg.fields.text("metaAuthor").label("Author"),
    cfg.fields.text("metaKeywords").label("Keywords"),
    cfg.fields.text("metaDescription").label("Description")
   );
 }
}
36
Dialogs and the Class Hierarchy
public abstract class BasePageTemplate {
@TabFactory("Meta")
public void metaTab(UiConfig cfg, TabBuilder tab) {
tab.fields(
cfg.fields.text("metaAuthor").label("Author"),
    cfg.fields.text("metaKeywords").label("Keywords"),
    cfg.fields.text("metaDescription").label("Description")
   );
 }
}
36
<head>
<meta name="description" content="${content.metaDescription}"/>
<meta name="keywords" content="${content.metaKeywords}" />
 <meta name="author" content="${content.metaAuthor}" />
</head> <!-- In the view -->
Dynamic Dialog
@Template(id="myModule:components/bookCategory", title="Book category")
@TemplateDescription("A list of books in a given category.")
@Controller
public class BookCategoryComponent {
   @Autowired
   private SalesApplicationWebService service;
   @RequestMapping("/bookcategory")
   public String render(ModelMap model, Node content) throws RepositoryException {
       String category = content.getProperty("category").getString();
       model.put("books", service.getBooksInCategory(category));
       return "components/bookCategory";
   }
@TabFactory("Content")
   public void contentTab(UiConfig cfg, TabBuilder tab) {
       Collection<String> categories = service.getBookCategories();
       tab.fields(
cfg.fields.select("category").label("Category").options(categories)
       );
   }
}
37
Dynamic Dialog
...
@TabFactory("Content")
public void contentTab(UiConfig cfg, TabBuilder tab) {
Collection<String> categories = service.getBookCategories();
tab.fields(
cfg.fields.select("category").label("Category").options(categories)
 );
}
...
38
Input Validation
...
public void contentTab(UiConfig cfg, TabBuilder tab) {
tab.fields(
cfg.fields.text("name").label("Name").required(),
cfg.fields.text("email").label("Email")⏎
.validator(cfg.validators.email())
);
}
...
39
Page Template Availability
@Controller
@Template(title="Article", id="myModule:/pages/article")
public class ArticleTemplate {
   ...
   @Available
   public boolean isAvailable(Node node) {
       return node.getPath().startsWith("/articles/");
   }
}
40
Available Components
@Controller
@Area("promos")
@AvailableComponentClasses({TextComponent.class,
                           ShoppingCartComponent.class})
public static class PromosArea {
   @RequestMapping("/main/promos")
   public String render() {
       return "areas/promos";
   }
}
41
Area Inheritance
@Controller
@Area("promos")
@Inherits
@AvailableComponentClasses({TextComponent.class,
                           ShoppingCartComponent.class})
public static class PromosArea {
   @RequestMapping("/main/promos")
   public String render() {
       return "areas/promos";
   }
}
42
SERVLET
CONTAINER
RENDERING
FILTER
RENDERING
ENGINE
BLOSSOM
DISPATCHER
SERVLET
CONTROLLER
43
How Blossom Works
Magnolia
Server
Data
Workflow
STK
Modules
Magnolia Core
Custom
module
Custom
module
DMS
Imaging
Custom
Theme
Module JAR
- templates
- resources
44
Web container (Tomcat)
Web Archive
Magnolia CMS
Filter chain CMS
Context Security Cache Aggregation
Hierarchical content
repository
Content
Custom
filter
Request
Rendering
Rendering
engine
Response
45
Form Submission
/* Standard annotations omitted */
public class ContactFormComponent {
@RequestMapping(value="/contact", method=RequestMethod.GET)
 public String viewForm(@ModelAttribute ContactForm contactForm) {
return "components/contactForm";
}
@RequestMapping(value="/contact", method=RequestMethod.POST)
public String handleSubmit(@ModelAttribute ContactForm contactForm, ⏎
BindingResult result) {
new ContactFormValidator().validate(contactForm, result);
if (result.hasErrors()) {
return "components/contactForm";
}
return "redirect:/home/contact/thankyou.html";
}
46
But wait a minute …
47
Caused by: org.springframework.web.util.NestedServletException: Reque
java.lang.IllegalStateException
at org.springframework.web.servlet.FrameworkServlet.processRequest(F
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkS
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at info.magnolia.module.blossom.render.BlossomDispatcherServlet.forw
at info.magnolia.module.blossom.render.BlossomTemplateRenderer.rende
... 92 more
Caused by: java.lang.IllegalStateException
… the response has been sent.
Controller Pre-execution
48
C M V
PAGE
C M V
Area
C M V
Component
C M V
Component
C M V
Component
C
CPE Implementation 49
Code in View
<form>
<blossom:pecid-input />
<input type=”text” name=”email” />
...
HTML Output
<form>
<input type=”hidden” name=”_pecid”
value=”ff6cefa6-d958-47b1-af70-c82a414f17e1” />
<input type=”text” name=”email” />
...
Spring Web MVC
+
Content
50
Spring Web Flow
51
REQUEST LANDING
PAGE
SPRING
WEB FLOW
Spring Web Flow
52
REQUEST LANDING
PAGE
FORM
SUBMIT?
SPRING
WEB FLOW
Deployment & Scaling 53
Author
Magnolia
Public A
Magnolia
Public B
Magnolia
Firewall
Activate
Internal Network Internet
LoadBalancer
JCR
JCR
JCR
54
55
Backend
Application
DB
Author
Magnolia
JCR
Public
Magnolia
JCRPublic
Magnolia
JCR
Clustering
Dealing with Change 56
Filter Chain in JCR
57
Configuring Spring Beans 58
<blossom:observed-bean
default-class="com.sample.DiscountService"
path="/modules/myModule/beans/discountService" />
example.com/vanity
59
Changing Resources Live
60
CSS
FreeMarker
Images
Javascript
Views
What Do You Win? 61
62
63
64
Shorter
Learning
Curve
MVC
Use Existing
Spring Apps &
Components
@Annotations
Loose
Coupling
Dependency
Injection
Code-driven
Dialogs
Test-driven
Development
Spring
IdiomsSecurity
Scalability
Mobile
& Touch
Faster
Development
Staging
Maglev
64
Shorter
Learning
Curve
MVC
Use Existing
Spring Apps &
Components
@Annotations
Loose
Coupling
Dependency
Injection
Code-driven
Dialogs
Test-driven
Development
Spring
IdiomsSecurity
Scalability
Mobile
& Touch
Faster
Development
Staging
Questions?
Maglev
Want to Learn More?
65
Talk to us in the exhibit hall
Attend Blossom Q & A webinar on Sept. 26
http://magnolia-cms.com/blossom-qa
Visit http://magnolia-cms.com/spring
Dashboard for all things Spring in Magnolia
Thank You!
66
Image Credits
67
#2: "Long Drive" by Nicholas A. Tonelli (CC-BY 2.0)
#3: "Sluggish" by Nicholas A. Tonelli (CC-BY 2.0)
#4: Still from "The Matrix"
#7: "South Beach Miami Sunset" by Justin Ornellas (CC-BY 2.0)
#14: "HBW - Magnolia Edition" by Nana B Agyei (CC-BY 2.0)
#16: "Worker" designed by James Fenton from The Noun Project
#16: "Database" designed by Ed Jones from The Noun Project
#16: "Document" designed by Timur Zima from The Noun Project
#22: "Three levels" by Paolo Fefe (CC-ND 2.0)
#43:"Headset" designed by Benoît Bâlon from The Noun Project
#43: "Engine" released into the Public Domain
#43: "Flower" designed by Danilo Gusmão Silveira from The Noun Project
#43: "Video Game Controller" designed by "Michael Rowe" from The Noun Project
#51: "Anvil" designed by Masrur Mahmood from The Noun Project
#52: "Hand" designed by Mikhail Bazilevsky from The Noun Project
#53: "NYC Steam" by Don O'Brien (CC-BY 2.0)
#56: "Floods 2013: Riverfront Ave" by Ryan Quan (CC-SA 2.0)
#61: "3 Strikes for £2.50" by Julian Frost (CC-BY 2.0)
68
Trademarks
Other trademarks are the property of their respective owners.
Magnolia
The Pulse are trademarks of
Magnolia International Limited.}

Weitere ähnliche Inhalte

Was ist angesagt?

Spring 3.x - Spring MVC
Spring 3.x - Spring MVCSpring 3.x - Spring MVC
Spring 3.x - Spring MVC
Guy Nir
 
Java Server Faces + Spring MVC Framework
Java Server Faces + Spring MVC FrameworkJava Server Faces + Spring MVC Framework
Java Server Faces + Spring MVC Framework
Guo Albert
 
Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and serverIntroducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
Spike Brehm
 

Was ist angesagt? (20)

Spring 3.x - Spring MVC - Advanced topics
Spring 3.x - Spring MVC - Advanced topicsSpring 3.x - Spring MVC - Advanced topics
Spring 3.x - Spring MVC - Advanced topics
 
MVC on the server and on the client
MVC on the server and on the clientMVC on the server and on the client
MVC on the server and on the client
 
Spring MVC Basics
Spring MVC BasicsSpring MVC Basics
Spring MVC Basics
 
Spring 3.x - Spring MVC
Spring 3.x - Spring MVCSpring 3.x - Spring MVC
Spring 3.x - Spring MVC
 
Multi client Development with Spring
Multi client Development with SpringMulti client Development with Spring
Multi client Development with Spring
 
Java Server Faces + Spring MVC Framework
Java Server Faces + Spring MVC FrameworkJava Server Faces + Spring MVC Framework
Java Server Faces + Spring MVC Framework
 
Modular applications with montage components
Modular applications with montage componentsModular applications with montage components
Modular applications with montage components
 
Spring Portlet MVC
Spring Portlet MVCSpring Portlet MVC
Spring Portlet MVC
 
Spring 4 Web App
Spring 4 Web AppSpring 4 Web App
Spring 4 Web App
 
Multi Client Development with Spring
Multi Client Development with SpringMulti Client Development with Spring
Multi Client Development with Spring
 
Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and serverIntroducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
 
The slick YAML based configuration by file in Magnolia 5.4
The slick YAML based configuration by file in Magnolia 5.4The slick YAML based configuration by file in Magnolia 5.4
The slick YAML based configuration by file in Magnolia 5.4
 
Design Patterns in ZK: Java MVVM as Model-View-Binder
Design Patterns in ZK: Java MVVM as Model-View-BinderDesign Patterns in ZK: Java MVVM as Model-View-Binder
Design Patterns in ZK: Java MVVM as Model-View-Binder
 
Marrying HTML5 and Angular to ADF - Oracle OpenWorld 2014 Preview
Marrying HTML5 and Angular to ADF - Oracle OpenWorld 2014 PreviewMarrying HTML5 and Angular to ADF - Oracle OpenWorld 2014 Preview
Marrying HTML5 and Angular to ADF - Oracle OpenWorld 2014 Preview
 
Spring MVC Annotations
Spring MVC AnnotationsSpring MVC Annotations
Spring MVC Annotations
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
Java Web Programming [7/9] : Struts2 Basics
Java Web Programming [7/9] : Struts2 BasicsJava Web Programming [7/9] : Struts2 Basics
Java Web Programming [7/9] : Struts2 Basics
 
Jdbc
JdbcJdbc
Jdbc
 
Jsf intro
Jsf introJsf intro
Jsf intro
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 

Andere mochten auch

Content Management With Apache Jackrabbit
Content Management With Apache JackrabbitContent Management With Apache Jackrabbit
Content Management With Apache Jackrabbit
Jukka Zitting
 

Andere mochten auch (12)

Magnolia CMS 5.0 - Architecture
Magnolia CMS 5.0 - ArchitectureMagnolia CMS 5.0 - Architecture
Magnolia CMS 5.0 - Architecture
 
You Can't Buy Agile
You Can't Buy AgileYou Can't Buy Agile
You Can't Buy Agile
 
Mean Time to Sleep: Quantifying the On-Call Experience
Mean Time to Sleep: Quantifying the On-Call ExperienceMean Time to Sleep: Quantifying the On-Call Experience
Mean Time to Sleep: Quantifying the On-Call Experience
 
Using Magnolia in a Microservices Architecture
Using Magnolia in a Microservices ArchitectureUsing Magnolia in a Microservices Architecture
Using Magnolia in a Microservices Architecture
 
Flexible search in Apache Jackrabbit Oak
Flexible search in Apache Jackrabbit OakFlexible search in Apache Jackrabbit Oak
Flexible search in Apache Jackrabbit Oak
 
Data replication in Sling
Data replication in SlingData replication in Sling
Data replication in Sling
 
Apache Jackrabbit
Apache JackrabbitApache Jackrabbit
Apache Jackrabbit
 
Integrating multiple CDNs at Etsy
Integrating multiple CDNs at EtsyIntegrating multiple CDNs at Etsy
Integrating multiple CDNs at Etsy
 
RESTful Web Applications with Apache Sling
RESTful Web Applications with Apache SlingRESTful Web Applications with Apache Sling
RESTful Web Applications with Apache Sling
 
Apache Jackrabbit @ Swiss Open Source Awards 2011
Apache Jackrabbit @ Swiss Open Source Awards 2011Apache Jackrabbit @ Swiss Open Source Awards 2011
Apache Jackrabbit @ Swiss Open Source Awards 2011
 
Content Management With Apache Jackrabbit
Content Management With Apache JackrabbitContent Management With Apache Jackrabbit
Content Management With Apache Jackrabbit
 
Oak, the architecture of Apache Jackrabbit 3
Oak, the architecture of Apache Jackrabbit 3Oak, the architecture of Apache Jackrabbit 3
Oak, the architecture of Apache Jackrabbit 3
 

Ähnlich wie Spring and Web Content Management

Rp 6 session 2 naresh bhatia
Rp 6  session 2 naresh bhatiaRp 6  session 2 naresh bhatia
Rp 6 session 2 naresh bhatia
sapientindia
 
Spring design-juergen-qcon
Spring design-juergen-qconSpring design-juergen-qcon
Spring design-juergen-qcon
Yiwei Ma
 
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
jpalley
 
Asp.Net 2.0 Presentation
Asp.Net 2.0 PresentationAsp.Net 2.0 Presentation
Asp.Net 2.0 Presentation
sasidhar
 

Ähnlich wie Spring and Web Content Management (20)

Rp 6 session 2 naresh bhatia
Rp 6  session 2 naresh bhatiaRp 6  session 2 naresh bhatia
Rp 6 session 2 naresh bhatia
 
Sviluppare applicazioni cross-platform con Xamarin Forms e il framework Prism...
Sviluppare applicazioni cross-platform con Xamarin Forms e il framework Prism...Sviluppare applicazioni cross-platform con Xamarin Forms e il framework Prism...
Sviluppare applicazioni cross-platform con Xamarin Forms e il framework Prism...
 
Developing Next-Gen Enterprise Web Application
Developing Next-Gen Enterprise Web ApplicationDeveloping Next-Gen Enterprise Web Application
Developing Next-Gen Enterprise Web Application
 
AEM Sightly Deep Dive
AEM Sightly Deep DiveAEM Sightly Deep Dive
AEM Sightly Deep Dive
 
MVVM & Data Binding Library
MVVM & Data Binding Library MVVM & Data Binding Library
MVVM & Data Binding Library
 
بررسی چارچوب جنگو
بررسی چارچوب جنگوبررسی چارچوب جنگو
بررسی چارچوب جنگو
 
Spring design-juergen-qcon
Spring design-juergen-qconSpring design-juergen-qcon
Spring design-juergen-qcon
 
Migration from ASP to ASP.NET
Migration from ASP to ASP.NETMigration from ASP to ASP.NET
Migration from ASP to ASP.NET
 
Overview of atg framework
Overview of atg frameworkOverview of atg framework
Overview of atg framework
 
Intro lift
Intro liftIntro lift
Intro lift
 
PPT on javascript ajax and css and some points related to server
PPT on javascript ajax and css and some points related to serverPPT on javascript ajax and css and some points related to server
PPT on javascript ajax and css and some points related to server
 
Synopsis
SynopsisSynopsis
Synopsis
 
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
 
ASP.NET Lecture 4
ASP.NET Lecture 4ASP.NET Lecture 4
ASP.NET Lecture 4
 
Exploring Symfony's Code
Exploring Symfony's CodeExploring Symfony's Code
Exploring Symfony's Code
 
Red Hat Agile integration Workshop Labs
Red Hat Agile integration Workshop LabsRed Hat Agile integration Workshop Labs
Red Hat Agile integration Workshop Labs
 
Modern android development
Modern android developmentModern android development
Modern android development
 
Optimizing Code Reusability for SharePoint using Linq to SharePoint & the MVP...
Optimizing Code Reusability for SharePoint using Linq to SharePoint & the MVP...Optimizing Code Reusability for SharePoint using Linq to SharePoint & the MVP...
Optimizing Code Reusability for SharePoint using Linq to SharePoint & the MVP...
 
OrchardCMS module development
OrchardCMS module developmentOrchardCMS module development
OrchardCMS module development
 
Asp.Net 2.0 Presentation
Asp.Net 2.0 PresentationAsp.Net 2.0 Presentation
Asp.Net 2.0 Presentation
 

Mehr von Zak Greant

Open Web Vancouver:The Age Of Literate Machines
Open Web Vancouver:The Age Of Literate MachinesOpen Web Vancouver:The Age Of Literate Machines
Open Web Vancouver:The Age Of Literate Machines
Zak Greant
 
Go Open 08: FLOSS What And Why
Go Open 08: FLOSS What And WhyGo Open 08: FLOSS What And Why
Go Open 08: FLOSS What And Why
Zak Greant
 

Mehr von Zak Greant (11)

Sponsoring the MariaDB Foundation
Sponsoring the MariaDB FoundationSponsoring the MariaDB Foundation
Sponsoring the MariaDB Foundation
 
Magnolia App Developer Roundtable
Magnolia App Developer RoundtableMagnolia App Developer Roundtable
Magnolia App Developer Roundtable
 
The Ecology of Free Software and Open Source
The Ecology of Free Software and Open SourceThe Ecology of Free Software and Open Source
The Ecology of Free Software and Open Source
 
Magnolia Community Day 2012
Magnolia Community Day 2012Magnolia Community Day 2012
Magnolia Community Day 2012
 
The Impact of the Net on Lawyer-Client Relationships
The Impact of the Net on Lawyer-Client RelationshipsThe Impact of the Net on Lawyer-Client Relationships
The Impact of the Net on Lawyer-Client Relationships
 
The Age of Literate Machines - AFUP Forum PHP
The Age of Literate Machines - AFUP Forum PHPThe Age of Literate Machines - AFUP Forum PHP
The Age of Literate Machines - AFUP Forum PHP
 
Growth and Play at Mozilla (Draft)
Growth and Play at Mozilla (Draft)Growth and Play at Mozilla (Draft)
Growth and Play at Mozilla (Draft)
 
Open Web Vancouver:The Age Of Literate Machines
Open Web Vancouver:The Age Of Literate MachinesOpen Web Vancouver:The Age Of Literate Machines
Open Web Vancouver:The Age Of Literate Machines
 
Open Innovation & Open Source: Lessons Learned in the Mozilla Community
Open Innovation & Open Source: Lessons Learned in the Mozilla CommunityOpen Innovation & Open Source: Lessons Learned in the Mozilla Community
Open Innovation & Open Source: Lessons Learned in the Mozilla Community
 
Go Open 08: FLOSS What And Why
Go Open 08: FLOSS What And WhyGo Open 08: FLOSS What And Why
Go Open 08: FLOSS What And Why
 
The Age Of Literate Machines: FOSSNUT 2008Q1
The Age Of Literate Machines: FOSSNUT 2008Q1The Age Of Literate Machines: FOSSNUT 2008Q1
The Age Of Literate Machines: FOSSNUT 2008Q1
 

Kürzlich hochgeladen

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
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
Earley Information Science
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Kürzlich hochgeladen (20)

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
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
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
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
 
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
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
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?
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
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
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
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
 
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...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
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
 

Spring and Web Content Management