SlideShare una empresa de Scribd logo
1 de 47
Jose María Arranz Santamaría

Sitios web SPI céntricos en el servidor SEO
compatibles sin estado ... ¡ALELUYA!
jmarranz@innowhere.com
@jmarranz
http://www.innowhere.com
LA GRAN PREGUNTA

¿PERO TÚ POR QUÉ
ESTÁS LEYENDO
ESTO?
LA GRAN PREGUNTA

¡NADIE HABLA de
Single Page Interface
Server Centric SEO
Compatible Stateless!
LA PRUEBA

Buscando en
Google...

¡MIO!
¡MIO!

(3 oct 2013)
¡MIO!
¡MIO!
¡MIO!
¡MIO!
¡MIO!
¡MIO!
¡MIO!
¡MIO!
LA GRAN PREGUNTA

MIENTO,
ES EL HYPE DE
MODA...
LA GRAN PREGUNTA

AQUÍ
LA GRAN PREGUNTA

Es fácil concluir que...
LA GRAN PREGUNTA

¡SOY UN ALIEN!
LA GRAN PREGUNTA

Umm no, error,
este es mi cuñado...
LA GRAN PREGUNTA

Este soy yo
LA GRAN PREGUNTA

Dominar el buscador
de Google es nuestro
primer paso en la
invasión de la Tierra
LA GRAN PREGUNTA

La segunda búsqueda
en Google a dominar
es “Coco Loco”
LA GRAN PREGUNTA

Si esto te interesa
también a ti, entonces...
LA GRAN PREGUNTA

TÚ TAMBIÉN ERES UN
ALIEN
¿QUIEN SOY YO?

¿QUIEN SOY YO?
¿QUIEN SOY YO?

Soy código

Soy empleado

–

ItsNat

http://www.linkedin.com/in/jmarranz

–

JProxy

http://www.innowhere.com/docs/curriculum_completo.pdf

–

JNIEasy

Fui (¿soy?) empresario

–

JEPLayer

http://www.innowhere.com

–

JEPDroid

Soy “activista”

–

LAMEOnJ

–

XPDOM

–

...

“The Single Page Interface Manifesto”
http://itsnat.sourceforge.net/php/spim/spi_manifesto_en.php

y también...
¿QUIEN SOY YO?

SOY
PROGRAMADOR
Buscando el Santo Grial Web

Single Page SEO compatible server centric
stateless web framework...

o la búsqueda del
Santo Grial del Web
Buscando el Santo Grial Web

Single Page Interface
●

No recargas completas (cambios parciales)
=> mayor rendimiento
=> mejor experiencia de usuario
- no página en blanco transitoria
- no scroll al principio de la página
Buscando el Santo Grial Web

SEO compatible
●

Web crawlers capaces de recorrer nuestro sitio
web
–

Los robots ven nuestra web como paginada
(JavaScript es ignorado)

Aproximación “clásica” indeseable
=> hacer "dos webs” SPI y paginada
Buscando el Santo Grial Web

Server Centric
●

Lógica de vista y proceso de eventos
programado fundamentalmente en el servidor*
✔
✔

✔

Datos y “vista” en el mismo espacio de memoria
Lenguaje estático (Java, Scala...) o dinámico (Groovy...)
favorito
Herramientas favoritas (Eclipse, IntelliJ, NetBeans...)
➔

✔

Autocompletado, static analysis, navegación de código,
refactorización...

Código fuente puede crecer en libertad
*bueno sí, algún inconveniente tiene...
Buscando el Santo Grial Web

Stateless
●

El framework no hace uso de la sesión web
–

"share nothing" entre nodos
●
●

no necesaria sincronización de sesiones
ni afinidad de sesión (sticky sessions)
escalabilidad
horizontal lineal
Buscando el Santo Grial Web

¿Es ItsNat Single Page Interface SEO
Compatible Server Centric y Stateless?
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?

¡¡¡ SÍ !!!
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?

¡¡CÓDIGO!!
¡¡CÓDIGO!!
¡¡CÓDIGO!!
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ItsNat Core Example</title>
</head>
<body>
<h3>ItsNat Core Example</h3>
<div itsnat:nocache="true" xmlns:itsnat="http://itsnat.org/itsnat">
<div id="clickableId1">Clickable Elem 1</div>
<br />
<div id="clickableId2">Clickable Elem 2</div>
</div>
</body>
</html>
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
public class CoreExampleDocument implements EventListener {
...
public void load()
{
...
((EventTarget)clickElem1).addEventListener("click",
this,false);
public void setAsClickable(Element elem) {
}
elem.setAttribute("style","color:red;");
public void handleEvent(Event evt)
{
Text text = (Text)elem.getFirstChild();
EventTarget currTarget = evt.getCurrentTarget();
text.setData("Click Me!");
if (currTarget == clickElem1)
((EventTarget)elem).addEventListener(
{
"click",this,false);
removeClickable(clickElem1);
}
setAsClickable(clickElem2);
}
public void removeClickable(Element elem){
else
elem.removeAttribute("style");
{
Text text = (Text)elem.getFirstChild();
setAsClickable(clickElem1);
text.setData("Cannot be clicked");
removeClickable(clickElem2);
((EventTarget)elem).removeEventListener(
}
"click",this,false);
ItsNatEvent itsNatEvt = (ItsNatEvent)evt;
}
ItsNatServletRequest itsNatReq =
}
itsNatEvt.getItsNatServletRequest();
ItsNatDocument itsNatDoc = itsNatReq.getItsNatDocument();
HTMLDocument doc = (HTMLDocument)itsNatDoc.getDocument();
Element noteElem = doc.createElement("p");
noteElem.appendChild(doc.createTextNode("Clicked " +
((Element)currTarget).getAttribute("id")));
doc.getBody().appendChild(noteElem);
}

DOM
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?

http://www.innowhere.com/itsnat/servlet?itsnat_doc_name=manual.core.example
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?

✔ Single Page Interface
✔ Server Centric

¿SEO Compatible?
¿Stateless?
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?

SEO Compatible
El oscuro secreto de ItsNat: Fast Load Mode
(EN CARGA)

public void setAsClickable(Element elem)
{
elem.setAttribute("style","color:red;");
Text text = (Text)elem.getFirstChild();
text.setData("Click Me!");
((EventTarget)elem).addEventListener("click",this,false);
}

<div style="color:red;" id="clickableId1">Click Me!</div>
<div style="color:red;" id="clickableId1">Click Me!</div>

(EVENTO AJAX)

¡¡SEO!!
itsNatDoc.setAttribute2("cn_2","style","color:red;");
itsNatDoc.setAttribute2("cn_2","style","color:red;");
itsNatDoc.setTextData2("cn_2",null,"Click Me!");
itsNatDoc.setTextData2("cn_2",null,"Click Me!");
itsNatDoc.addDOMEventListener("cn_2","click","el_10",null,false,3,-1,2);
itsNatDoc.addDOMEventListener("cn_2","click","el_10",null,false,3,-1,2);
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?

SEO Compatible (cont.)
Dual links links con “doble vida”
“HTML de día, JavaScript de noche”
➔

Link normal con JavaScript desactivado (web crawlers)

➔

Disparador de eventos AJAX con JS activado

<a href="?st=overview" onclick="setState('overview'); return false;">Overview</a>
false;">Overview</a>
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?

DEMO

¡¡¡OJO FAKE!!!
¡¡¡OJO FAKE!!!

http://www.innowhere.com/insites
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?

¿¿STATELESS??

¡¡¡MENTIRA!!!
ESE EJEMPLO ES ESENCIALMENTE
STATEFUL
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?

STATELESS
●

Soporte introducido en ItsNat v1.3

●

No aprovecha todo el potencial de ItsNat

●

Pero permite escalabilidad lineal horizontal
Sin degradación por
sincronización de sesiones
✔
Sin necesidad de afinidad de
sesión
✔
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?

STATELESS (modo)
●

NO hay copia del árbol DOM del cliente en el
servidor
–
–

●

Sesión vacía
Estado visual únicamente en el cliente

Eventos AJAX => todos tipo “custom stateless”
–

Se construye bajo demanda el DOM a insertar

–

Necesario enviar info del estado visual
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?

Template para
carga inicial

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" xmlns:itsnat="http://itsnat.org/itsnat">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>ItsNat Stateless Example in Manual</title>
<script>
function sendEventStateless()
{
var counterElem = document.getElementById("counterId");
var userEvt = document.getItsNatDoc().createEventStateless();
userEvt.setExtraParam('counter',counterElem.firstChild.data);
userEvt.setExtraParam('itsnat_doc_name','manual.stless.example.eventReceiver');
document.getItsNatDoc().dispatchEventStateless(userEvt,3 /*XHR_ASYNC_HOLD*/, 1000000);
}
</script>
</head>
<body>
<h3>ItsNat Stateless Example in Manual</h3>
<h4 id="presentationId" itsnat:nocache="true"></h4>
<a href="javascript:sendEventStateless()">Send stateless event</a>

<div>
<div>Num. Events: <b id="counterId" itsnat:nocache="true">0</b></div>
</div>
<div>
<div>
<div id="insertHereId" />
</div>
</div>
</body>
</html>
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
Template documento para inserción parcial
(manual.stless.example.eventReceiver)
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" xmlns:itsnat="http://itsnat.org/itsnat">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>ItsNat Stateless Document For Stateless Event Processing</title>
</head>
<body>
<b id="counterId" itsnat:locById="true" itsnat:nocache="true">(num)</b>
<div id="insertHereId" itsnat:locById="true" itsnat:nocache="true" />
</body>
</html>
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
Template fragmento que se incluye en la inserción parcial
(manual.stless.example.fragment)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
xmlns:itsnat="http://itsnat.org/itsnat">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Fragment</title>
</head>
<body>
<h4 style="color:green"><b>Fragment...</b></h4>
<h3>Inserted!</h3>
</body>
</html>
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
Clase procesadora de carga inicial
public class StlessExampleInitialDocument
{
protected ItsNatHTMLDocument itsNatDoc;
public StlessExampleInitialDocument(ItsNatHTMLDocument itsNatDoc)
{
this.itsNatDoc = itsNatDoc;
HTMLDocument doc = itsNatDoc.getHTMLDocument();
Text node = (Text)doc.createTextNode(
"This the initial stateless page (not kept in server)");
Element presentationElem = doc.getElementById("presentationId");
presentationElem.appendChild(node);
}
}
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
Clase procesadora de eventos stateless
public class StatelessExampleForProcessingEventDocument implements Serializable,EventListener
{
protected ItsNatHTMLDocument itsNatDoc;
protected Element counterElem;
public StatelessExampleForProcessingEventDocument(
ItsNatHTMLDocument itsNatDoc, ItsNatServletRequest request, ItsNatServletResponse response)
{
this.itsNatDoc = itsNatDoc;
if (!itsNatDoc.isCreatedByStatelessEvent())
throw new RuntimeException("Only to test stateless, must be loaded by a stateless event");
// Counter node with same value (state) than in client:
String currCountStr =
request.getServletRequest().getParameter("counter");
int counter = Integer.parseInt(currCountStr);
HTMLDocument doc = itsNatDoc.getHTMLDocument();
this.counterElem = doc.getElementById("counterId");
((Text)counterElem.getFirstChild()).setData(String.valueOf(counter));
itsNatDoc.addEventListener(this);
}
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
Clase procesadora de eventos stateless (parte 2)
public void handleEvent(Event evt)
{
ItsNatEventDOMStateless itsNatEvt = (ItsNatEventDOMStateless)evt;
Text counterText = (Text)counterElem.getFirstChild();
String currCountStr = counterText.getData();
int counter = Integer.parseInt(currCountStr);
counter++;
counterText.setData(String.valueOf(counter));
Document doc = itsNatDoc.getDocument();
Element elemParent = doc.getElementById("insertHereId");
ScriptUtil scriptGen = itsNatDoc.getScriptUtil();
String elemRef = scriptGen.getNodeReference(elemParent);
ClientDocument clientDoc = itsNatEvt.getClientDocument();
clientDoc.addCodeToSend(elemRef + ".innerHTML = '';");
clientDoc.addCodeToSend("alert('Currently inserted fragment removed before');");
ItsNatServlet servlet = itsNatDoc.getItsNatDocumentTemplate().getItsNatServlet();
ItsNatHTMLDocFragmentTemplate docFragTemplate =
(ItsNatHTMLDocFragmentTemplate)servlet.getItsNatDocFragmentTemplate("manual.stless.example.fragment");
DocumentFragment docFrag = docFragTemplate.loadDocumentFragmentBody(itsNatDoc);
elemParent.appendChild(docFrag); // docFrag is empty now
¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
Clase procesadora de eventos stateless (parte 3)
// Umm we have to celebrate/highlight this insertion
Element child1 = ItsNatTreeWalker.getFirstChildElement(elemParent);
Element child2 = ItsNatTreeWalker.getNextElement(child1);
Text textChild2 = (Text)child2.getFirstChild();
Element bold = doc.createElement("i");
bold.appendChild(textChild2); // is removed from child2
child2.appendChild(bold);
child2.setAttribute("style","color:red");
// <h3 style="color:red"><i>Inserted!</i></h3>
}
}
Epílogo

+Info
●

Ejemplo stateless completo

http://itsnat.sourceforge.net/index.php?_page=support.tutorial.core_stateless

http://www.innowhere.com/itsnat/feashow_servlet?itsnat_doc_name=feashow.main&
●

Ejemplo sitio web SEO compatible stateless

http://itsnat.sourceforge.net/index.php?_page=support.tutorial.spi_stateless_site
●

Ejemplo sitio web real SEO compatible

http://asia.playstation.com/hk/en/regional/game?platform=ps3
Epílogo

Imágenes
http://2.bp.blogspot.com/-mBAlHH5OwUE/UPg7LL2ihyI/AAAAAAAAANU/Hys4TkrlNhk/s200/lego-indiana-jones8.jpg
http://mixupload.org/img/forbidden.png
http://www.pammarketingnut.com/wp-content/uploads/gmail.jpg
http://www.bfc-clan.com/PUBLIC/e107_images/custom/server-rules.jpg
http://www.mystikcreation.com/blog/wp-content/uploads/2013/07/responsive-web-design.jpg
http://jan.newmarch.name/ecommerce/stateless.gif
http://www.empowernetwork.com/workwithsheena/files/2013/09/how-to-use-an-onlne-html-editor.jpg
http://www.northeastern.edu/securenu/wp-content/uploads/2013/01/Java_Logo.jpg
http://blog.programmableweb.com/wp-content/w3c.gif
http://upload.wikimedia.org/wikipedia/commons/5/58/Dom_tree.png
http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2009/02/html1.png
http://2.bp.blogspot.com/_m39Ioh2ptw8/TAZQiFRZIVI/AAAAAAAAChI/DpUw99EcJ9o/s320/verg%C3%BCenza.jpg
http://2.bp.blogspot.com/_0s5FkH27RVs/TPQdT-74xnI/AAAAAAAAAzU/RVCd6FpGWZc/s200/verguenza.jpg
http://www.definicionabc.com/wp-content/uploads/verg%C3%BCenza.jpg
http://img.desmotivaciones.es/201102/verguenza_3.jpg
http://www.hybridcluster.com/wp-content/themes/hybridcloud/images/difficult-server-installation.jpg
http://3.bp.blogspot.com/-HiZ_0Fcc1F8/T_rZjhK4goI/AAAAAAAABUA/b61_asF8eLk/s200/empty.jpg
Hablemos

¿Preguntas?

?
?
?

?

?

?

?

?

?
?

?

?

?

?
?
?

Más contenido relacionado

La actualidad más candente

Presentación Webinar “¿Por qué Yoast y no otro plugin SEO?”
Presentación Webinar “¿Por qué Yoast y no otro plugin SEO?”Presentación Webinar “¿Por qué Yoast y no otro plugin SEO?”
Presentación Webinar “¿Por qué Yoast y no otro plugin SEO?”SiteGround España
 
Iday 2018 - Optimización de la autoridad interna
Iday 2018 - Optimización de la autoridad internaIday 2018 - Optimización de la autoridad interna
Iday 2018 - Optimización de la autoridad internaJose Lab
 
Como aplicar técnicas WPO para optimizar el crawl budget
Como aplicar técnicas WPO para optimizar el crawl budgetComo aplicar técnicas WPO para optimizar el crawl budget
Como aplicar técnicas WPO para optimizar el crawl budgetRaiola Networks
 
SEO y Wordpress: Aun podemos hacerlo mejor
SEO y Wordpress: Aun podemos hacerlo mejorSEO y Wordpress: Aun podemos hacerlo mejor
SEO y Wordpress: Aun podemos hacerlo mejorSeñor Muñoz
 
Los 12 mejores trucos para acelerar WordPress
Los 12 mejores trucos para acelerar WordPressLos 12 mejores trucos para acelerar WordPress
Los 12 mejores trucos para acelerar WordPressFernando Tellado
 
Mitos y realidades sobre WordPress
Mitos y realidades sobre WordPressMitos y realidades sobre WordPress
Mitos y realidades sobre WordPressFernando Tellado
 

La actualidad más candente (6)

Presentación Webinar “¿Por qué Yoast y no otro plugin SEO?”
Presentación Webinar “¿Por qué Yoast y no otro plugin SEO?”Presentación Webinar “¿Por qué Yoast y no otro plugin SEO?”
Presentación Webinar “¿Por qué Yoast y no otro plugin SEO?”
 
Iday 2018 - Optimización de la autoridad interna
Iday 2018 - Optimización de la autoridad internaIday 2018 - Optimización de la autoridad interna
Iday 2018 - Optimización de la autoridad interna
 
Como aplicar técnicas WPO para optimizar el crawl budget
Como aplicar técnicas WPO para optimizar el crawl budgetComo aplicar técnicas WPO para optimizar el crawl budget
Como aplicar técnicas WPO para optimizar el crawl budget
 
SEO y Wordpress: Aun podemos hacerlo mejor
SEO y Wordpress: Aun podemos hacerlo mejorSEO y Wordpress: Aun podemos hacerlo mejor
SEO y Wordpress: Aun podemos hacerlo mejor
 
Los 12 mejores trucos para acelerar WordPress
Los 12 mejores trucos para acelerar WordPressLos 12 mejores trucos para acelerar WordPress
Los 12 mejores trucos para acelerar WordPress
 
Mitos y realidades sobre WordPress
Mitos y realidades sobre WordPressMitos y realidades sobre WordPress
Mitos y realidades sobre WordPress
 

Similar a Sitios web SPI céntricos en el servidor SEO compatibles sin estado ... ¡ALELUYA!

Convierte tu Joomla! a estático, haciéndola inhackeable y ultrarrápida - Javi...
Convierte tu Joomla! a estático, haciéndola inhackeable y ultrarrápida - Javi...Convierte tu Joomla! a estático, haciéndola inhackeable y ultrarrápida - Javi...
Convierte tu Joomla! a estático, haciéndola inhackeable y ultrarrápida - Javi...joomlaes
 
Presentación RodrigoPolo.com @ Barcamp Guatemala '09
Presentación RodrigoPolo.com @ Barcamp Guatemala '09Presentación RodrigoPolo.com @ Barcamp Guatemala '09
Presentación RodrigoPolo.com @ Barcamp Guatemala '09Rodrigo Polo
 
Timerepublik
TimerepublikTimerepublik
Timerepublikbetabeers
 
Cómo volarle la peluca a tus usuarios con la velocidad de tu sitio?
Cómo volarle la peluca a tus usuarios con la velocidad de tu sitio?Cómo volarle la peluca a tus usuarios con la velocidad de tu sitio?
Cómo volarle la peluca a tus usuarios con la velocidad de tu sitio?Martin Siniawski
 
SEO para desarrolladores
SEO para desarrolladoresSEO para desarrolladores
SEO para desarrolladoresEsteve Castells
 
Optimiza WordPress y a correr - WordCamp Cantabria 2015 - @DarioBF
Optimiza WordPress y a correr - WordCamp Cantabria 2015 - @DarioBFOptimiza WordPress y a correr - WordCamp Cantabria 2015 - @DarioBF
Optimiza WordPress y a correr - WordCamp Cantabria 2015 - @DarioBFDarío BF
 
Prácticas recomendadas para SQL Server en Microsoft Azure
Prácticas recomendadas para SQL Server en Microsoft AzurePrácticas recomendadas para SQL Server en Microsoft Azure
Prácticas recomendadas para SQL Server en Microsoft AzureSpanishPASSVC
 
Rendimiento y velocidad, acelera tu sitio WordPress
Rendimiento y velocidad, acelera tu sitio WordPressRendimiento y velocidad, acelera tu sitio WordPress
Rendimiento y velocidad, acelera tu sitio WordPressLibreCon
 
Desarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsDesarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsAsier Marqués
 
El Ferrocarril Contra Los Arboles Muertos2
El Ferrocarril Contra Los Arboles Muertos2El Ferrocarril Contra Los Arboles Muertos2
El Ferrocarril Contra Los Arboles Muertos2ferdinand13
 
Session hijacking latam tour peru 2012-bv1.3
Session hijacking  latam tour peru 2012-bv1.3Session hijacking  latam tour peru 2012-bv1.3
Session hijacking latam tour peru 2012-bv1.3Josue Hideroa Zaleta
 
Arquitecturas Escalables para Aplicaciones Web - Egdares Futch, UNITEC
Arquitecturas Escalables para Aplicaciones Web - Egdares Futch, UNITECArquitecturas Escalables para Aplicaciones Web - Egdares Futch, UNITEC
Arquitecturas Escalables para Aplicaciones Web - Egdares Futch, UNITECAlejandro Corpeño
 
Los mejores trucos para aumentar la velocidad en joomla!
Los mejores trucos para aumentar la velocidad en joomla!Los mejores trucos para aumentar la velocidad en joomla!
Los mejores trucos para aumentar la velocidad en joomla!Carlos M. Cámara
 
Emprender en internet ¿Sin Google?
Emprender en internet ¿Sin Google?Emprender en internet ¿Sin Google?
Emprender en internet ¿Sin Google?Señor Muñoz
 
Optimiza tus webs a bajo costo - WCVenezuela2021
Optimiza tus webs a bajo costo - WCVenezuela2021Optimiza tus webs a bajo costo - WCVenezuela2021
Optimiza tus webs a bajo costo - WCVenezuela2021Fernando Puente
 

Similar a Sitios web SPI céntricos en el servidor SEO compatibles sin estado ... ¡ALELUYA! (20)

Convierte tu Joomla! a estático, haciéndola inhackeable y ultrarrápida - Javi...
Convierte tu Joomla! a estático, haciéndola inhackeable y ultrarrápida - Javi...Convierte tu Joomla! a estático, haciéndola inhackeable y ultrarrápida - Javi...
Convierte tu Joomla! a estático, haciéndola inhackeable y ultrarrápida - Javi...
 
Presentación RodrigoPolo.com @ Barcamp Guatemala '09
Presentación RodrigoPolo.com @ Barcamp Guatemala '09Presentación RodrigoPolo.com @ Barcamp Guatemala '09
Presentación RodrigoPolo.com @ Barcamp Guatemala '09
 
Timerepublik
TimerepublikTimerepublik
Timerepublik
 
Cómo volarle la peluca a tus usuarios con la velocidad de tu sitio?
Cómo volarle la peluca a tus usuarios con la velocidad de tu sitio?Cómo volarle la peluca a tus usuarios con la velocidad de tu sitio?
Cómo volarle la peluca a tus usuarios con la velocidad de tu sitio?
 
SEO para desarrolladores
SEO para desarrolladoresSEO para desarrolladores
SEO para desarrolladores
 
Optimiza WordPress y a correr - WordCamp Cantabria 2015 - @DarioBF
Optimiza WordPress y a correr - WordCamp Cantabria 2015 - @DarioBFOptimiza WordPress y a correr - WordCamp Cantabria 2015 - @DarioBF
Optimiza WordPress y a correr - WordCamp Cantabria 2015 - @DarioBF
 
Prácticas recomendadas para SQL Server en Microsoft Azure
Prácticas recomendadas para SQL Server en Microsoft AzurePrácticas recomendadas para SQL Server en Microsoft Azure
Prácticas recomendadas para SQL Server en Microsoft Azure
 
2014 04 padrino
2014 04 padrino2014 04 padrino
2014 04 padrino
 
Rendimiento y velocidad, acelera tu sitio WordPress
Rendimiento y velocidad, acelera tu sitio WordPressRendimiento y velocidad, acelera tu sitio WordPress
Rendimiento y velocidad, acelera tu sitio WordPress
 
Desarrollo de Mobile Web Apps
Desarrollo de Mobile Web AppsDesarrollo de Mobile Web Apps
Desarrollo de Mobile Web Apps
 
Skipfish
Skipfish Skipfish
Skipfish
 
El Ferrocarril Contra Los Arboles Muertos2
El Ferrocarril Contra Los Arboles Muertos2El Ferrocarril Contra Los Arboles Muertos2
El Ferrocarril Contra Los Arboles Muertos2
 
Session hijacking latam tour peru 2012-bv1.3
Session hijacking  latam tour peru 2012-bv1.3Session hijacking  latam tour peru 2012-bv1.3
Session hijacking latam tour peru 2012-bv1.3
 
Arquitecturas Escalables para Aplicaciones Web - Egdares Futch, UNITEC
Arquitecturas Escalables para Aplicaciones Web - Egdares Futch, UNITECArquitecturas Escalables para Aplicaciones Web - Egdares Futch, UNITEC
Arquitecturas Escalables para Aplicaciones Web - Egdares Futch, UNITEC
 
Joomla! v3 - Presentación
Joomla! v3 - PresentaciónJoomla! v3 - Presentación
Joomla! v3 - Presentación
 
Asp
AspAsp
Asp
 
Los mejores trucos para aumentar la velocidad en joomla!
Los mejores trucos para aumentar la velocidad en joomla!Los mejores trucos para aumentar la velocidad en joomla!
Los mejores trucos para aumentar la velocidad en joomla!
 
Emprender en internet ¿Sin Google?
Emprender en internet ¿Sin Google?Emprender en internet ¿Sin Google?
Emprender en internet ¿Sin Google?
 
Optimiza tus webs a bajo costo - WCVenezuela2021
Optimiza tus webs a bajo costo - WCVenezuela2021Optimiza tus webs a bajo costo - WCVenezuela2021
Optimiza tus webs a bajo costo - WCVenezuela2021
 
Introducción a Blazor
Introducción a BlazorIntroducción a Blazor
Introducción a Blazor
 

Último

La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 

Último (16)

La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 

Sitios web SPI céntricos en el servidor SEO compatibles sin estado ... ¡ALELUYA!

  • 1. Jose María Arranz Santamaría Sitios web SPI céntricos en el servidor SEO compatibles sin estado ... ¡ALELUYA! jmarranz@innowhere.com @jmarranz http://www.innowhere.com
  • 2. LA GRAN PREGUNTA ¿PERO TÚ POR QUÉ ESTÁS LEYENDO ESTO?
  • 3. LA GRAN PREGUNTA ¡NADIE HABLA de Single Page Interface Server Centric SEO Compatible Stateless!
  • 4. LA PRUEBA Buscando en Google... ¡MIO! ¡MIO! (3 oct 2013) ¡MIO! ¡MIO! ¡MIO! ¡MIO! ¡MIO! ¡MIO! ¡MIO! ¡MIO!
  • 5. LA GRAN PREGUNTA MIENTO, ES EL HYPE DE MODA...
  • 7. LA GRAN PREGUNTA Es fácil concluir que...
  • 9. LA GRAN PREGUNTA Umm no, error, este es mi cuñado...
  • 11. LA GRAN PREGUNTA Dominar el buscador de Google es nuestro primer paso en la invasión de la Tierra
  • 12. LA GRAN PREGUNTA La segunda búsqueda en Google a dominar es “Coco Loco”
  • 13. LA GRAN PREGUNTA Si esto te interesa también a ti, entonces...
  • 14. LA GRAN PREGUNTA TÚ TAMBIÉN ERES UN ALIEN
  • 16. ¿QUIEN SOY YO? Soy código Soy empleado – ItsNat http://www.linkedin.com/in/jmarranz – JProxy http://www.innowhere.com/docs/curriculum_completo.pdf – JNIEasy Fui (¿soy?) empresario – JEPLayer http://www.innowhere.com – JEPDroid Soy “activista” – LAMEOnJ – XPDOM – ... “The Single Page Interface Manifesto” http://itsnat.sourceforge.net/php/spim/spi_manifesto_en.php y también...
  • 18. Buscando el Santo Grial Web Single Page SEO compatible server centric stateless web framework... o la búsqueda del Santo Grial del Web
  • 19. Buscando el Santo Grial Web Single Page Interface ● No recargas completas (cambios parciales) => mayor rendimiento => mejor experiencia de usuario - no página en blanco transitoria - no scroll al principio de la página
  • 20. Buscando el Santo Grial Web SEO compatible ● Web crawlers capaces de recorrer nuestro sitio web – Los robots ven nuestra web como paginada (JavaScript es ignorado) Aproximación “clásica” indeseable => hacer "dos webs” SPI y paginada
  • 21. Buscando el Santo Grial Web Server Centric ● Lógica de vista y proceso de eventos programado fundamentalmente en el servidor* ✔ ✔ ✔ Datos y “vista” en el mismo espacio de memoria Lenguaje estático (Java, Scala...) o dinámico (Groovy...) favorito Herramientas favoritas (Eclipse, IntelliJ, NetBeans...) ➔ ✔ Autocompletado, static analysis, navegación de código, refactorización... Código fuente puede crecer en libertad *bueno sí, algún inconveniente tiene...
  • 22. Buscando el Santo Grial Web Stateless ● El framework no hace uso de la sesión web – "share nothing" entre nodos ● ● no necesaria sincronización de sesiones ni afinidad de sesión (sticky sessions) escalabilidad horizontal lineal
  • 23. Buscando el Santo Grial Web ¿Es ItsNat Single Page Interface SEO Compatible Server Centric y Stateless?
  • 24. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? ¡¡¡ SÍ !!!
  • 25. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? ¡¡CÓDIGO!! ¡¡CÓDIGO!! ¡¡CÓDIGO!!
  • 26. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
  • 27. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>ItsNat Core Example</title> </head> <body> <h3>ItsNat Core Example</h3> <div itsnat:nocache="true" xmlns:itsnat="http://itsnat.org/itsnat"> <div id="clickableId1">Clickable Elem 1</div> <br /> <div id="clickableId2">Clickable Elem 2</div> </div> </body> </html>
  • 28. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? public class CoreExampleDocument implements EventListener { ... public void load() { ... ((EventTarget)clickElem1).addEventListener("click", this,false); public void setAsClickable(Element elem) { } elem.setAttribute("style","color:red;"); public void handleEvent(Event evt) { Text text = (Text)elem.getFirstChild(); EventTarget currTarget = evt.getCurrentTarget(); text.setData("Click Me!"); if (currTarget == clickElem1) ((EventTarget)elem).addEventListener( { "click",this,false); removeClickable(clickElem1); } setAsClickable(clickElem2); } public void removeClickable(Element elem){ else elem.removeAttribute("style"); { Text text = (Text)elem.getFirstChild(); setAsClickable(clickElem1); text.setData("Cannot be clicked"); removeClickable(clickElem2); ((EventTarget)elem).removeEventListener( } "click",this,false); ItsNatEvent itsNatEvt = (ItsNatEvent)evt; } ItsNatServletRequest itsNatReq = } itsNatEvt.getItsNatServletRequest(); ItsNatDocument itsNatDoc = itsNatReq.getItsNatDocument(); HTMLDocument doc = (HTMLDocument)itsNatDoc.getDocument(); Element noteElem = doc.createElement("p"); noteElem.appendChild(doc.createTextNode("Clicked " + ((Element)currTarget).getAttribute("id"))); doc.getBody().appendChild(noteElem); } DOM
  • 29. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? http://www.innowhere.com/itsnat/servlet?itsnat_doc_name=manual.core.example
  • 30. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? ✔ Single Page Interface ✔ Server Centric ¿SEO Compatible? ¿Stateless?
  • 31. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? SEO Compatible El oscuro secreto de ItsNat: Fast Load Mode (EN CARGA) public void setAsClickable(Element elem) { elem.setAttribute("style","color:red;"); Text text = (Text)elem.getFirstChild(); text.setData("Click Me!"); ((EventTarget)elem).addEventListener("click",this,false); } <div style="color:red;" id="clickableId1">Click Me!</div> <div style="color:red;" id="clickableId1">Click Me!</div> (EVENTO AJAX) ¡¡SEO!! itsNatDoc.setAttribute2("cn_2","style","color:red;"); itsNatDoc.setAttribute2("cn_2","style","color:red;"); itsNatDoc.setTextData2("cn_2",null,"Click Me!"); itsNatDoc.setTextData2("cn_2",null,"Click Me!"); itsNatDoc.addDOMEventListener("cn_2","click","el_10",null,false,3,-1,2); itsNatDoc.addDOMEventListener("cn_2","click","el_10",null,false,3,-1,2);
  • 32. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? SEO Compatible (cont.) Dual links links con “doble vida” “HTML de día, JavaScript de noche” ➔ Link normal con JavaScript desactivado (web crawlers) ➔ Disparador de eventos AJAX con JS activado <a href="?st=overview" onclick="setState('overview'); return false;">Overview</a> false;">Overview</a>
  • 33. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? DEMO ¡¡¡OJO FAKE!!! ¡¡¡OJO FAKE!!! http://www.innowhere.com/insites
  • 34. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? ¿¿STATELESS?? ¡¡¡MENTIRA!!! ESE EJEMPLO ES ESENCIALMENTE STATEFUL
  • 35. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? STATELESS ● Soporte introducido en ItsNat v1.3 ● No aprovecha todo el potencial de ItsNat ● Pero permite escalabilidad lineal horizontal Sin degradación por sincronización de sesiones ✔ Sin necesidad de afinidad de sesión ✔
  • 36. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? STATELESS (modo) ● NO hay copia del árbol DOM del cliente en el servidor – – ● Sesión vacía Estado visual únicamente en el cliente Eventos AJAX => todos tipo “custom stateless” – Se construye bajo demanda el DOM a insertar – Necesario enviar info del estado visual
  • 37. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless?
  • 38. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? Template para carga inicial <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" xmlns:itsnat="http://itsnat.org/itsnat"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>ItsNat Stateless Example in Manual</title> <script> function sendEventStateless() { var counterElem = document.getElementById("counterId"); var userEvt = document.getItsNatDoc().createEventStateless(); userEvt.setExtraParam('counter',counterElem.firstChild.data); userEvt.setExtraParam('itsnat_doc_name','manual.stless.example.eventReceiver'); document.getItsNatDoc().dispatchEventStateless(userEvt,3 /*XHR_ASYNC_HOLD*/, 1000000); } </script> </head> <body> <h3>ItsNat Stateless Example in Manual</h3> <h4 id="presentationId" itsnat:nocache="true"></h4> <a href="javascript:sendEventStateless()">Send stateless event</a> <div> <div>Num. Events: <b id="counterId" itsnat:nocache="true">0</b></div> </div> <div> <div> <div id="insertHereId" /> </div> </div> </body> </html>
  • 39. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? Template documento para inserción parcial (manual.stless.example.eventReceiver) <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" xmlns:itsnat="http://itsnat.org/itsnat"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>ItsNat Stateless Document For Stateless Event Processing</title> </head> <body> <b id="counterId" itsnat:locById="true" itsnat:nocache="true">(num)</b> <div id="insertHereId" itsnat:locById="true" itsnat:nocache="true" /> </body> </html>
  • 40. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? Template fragmento que se incluye en la inserción parcial (manual.stless.example.fragment) <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" xmlns:itsnat="http://itsnat.org/itsnat"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Fragment</title> </head> <body> <h4 style="color:green"><b>Fragment...</b></h4> <h3>Inserted!</h3> </body> </html>
  • 41. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? Clase procesadora de carga inicial public class StlessExampleInitialDocument { protected ItsNatHTMLDocument itsNatDoc; public StlessExampleInitialDocument(ItsNatHTMLDocument itsNatDoc) { this.itsNatDoc = itsNatDoc; HTMLDocument doc = itsNatDoc.getHTMLDocument(); Text node = (Text)doc.createTextNode( "This the initial stateless page (not kept in server)"); Element presentationElem = doc.getElementById("presentationId"); presentationElem.appendChild(node); } }
  • 42. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? Clase procesadora de eventos stateless public class StatelessExampleForProcessingEventDocument implements Serializable,EventListener { protected ItsNatHTMLDocument itsNatDoc; protected Element counterElem; public StatelessExampleForProcessingEventDocument( ItsNatHTMLDocument itsNatDoc, ItsNatServletRequest request, ItsNatServletResponse response) { this.itsNatDoc = itsNatDoc; if (!itsNatDoc.isCreatedByStatelessEvent()) throw new RuntimeException("Only to test stateless, must be loaded by a stateless event"); // Counter node with same value (state) than in client: String currCountStr = request.getServletRequest().getParameter("counter"); int counter = Integer.parseInt(currCountStr); HTMLDocument doc = itsNatDoc.getHTMLDocument(); this.counterElem = doc.getElementById("counterId"); ((Text)counterElem.getFirstChild()).setData(String.valueOf(counter)); itsNatDoc.addEventListener(this); }
  • 43. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? Clase procesadora de eventos stateless (parte 2) public void handleEvent(Event evt) { ItsNatEventDOMStateless itsNatEvt = (ItsNatEventDOMStateless)evt; Text counterText = (Text)counterElem.getFirstChild(); String currCountStr = counterText.getData(); int counter = Integer.parseInt(currCountStr); counter++; counterText.setData(String.valueOf(counter)); Document doc = itsNatDoc.getDocument(); Element elemParent = doc.getElementById("insertHereId"); ScriptUtil scriptGen = itsNatDoc.getScriptUtil(); String elemRef = scriptGen.getNodeReference(elemParent); ClientDocument clientDoc = itsNatEvt.getClientDocument(); clientDoc.addCodeToSend(elemRef + ".innerHTML = '';"); clientDoc.addCodeToSend("alert('Currently inserted fragment removed before');"); ItsNatServlet servlet = itsNatDoc.getItsNatDocumentTemplate().getItsNatServlet(); ItsNatHTMLDocFragmentTemplate docFragTemplate = (ItsNatHTMLDocFragmentTemplate)servlet.getItsNatDocFragmentTemplate("manual.stless.example.fragment"); DocumentFragment docFrag = docFragTemplate.loadDocumentFragmentBody(itsNatDoc); elemParent.appendChild(docFrag); // docFrag is empty now
  • 44. ¿Es ItsNat SPI SEO Compatible Server Centric Stateless? Clase procesadora de eventos stateless (parte 3) // Umm we have to celebrate/highlight this insertion Element child1 = ItsNatTreeWalker.getFirstChildElement(elemParent); Element child2 = ItsNatTreeWalker.getNextElement(child1); Text textChild2 = (Text)child2.getFirstChild(); Element bold = doc.createElement("i"); bold.appendChild(textChild2); // is removed from child2 child2.appendChild(bold); child2.setAttribute("style","color:red"); // <h3 style="color:red"><i>Inserted!</i></h3> } }
  • 45. Epílogo +Info ● Ejemplo stateless completo http://itsnat.sourceforge.net/index.php?_page=support.tutorial.core_stateless http://www.innowhere.com/itsnat/feashow_servlet?itsnat_doc_name=feashow.main& ● Ejemplo sitio web SEO compatible stateless http://itsnat.sourceforge.net/index.php?_page=support.tutorial.spi_stateless_site ● Ejemplo sitio web real SEO compatible http://asia.playstation.com/hk/en/regional/game?platform=ps3
  • 46. Epílogo Imágenes http://2.bp.blogspot.com/-mBAlHH5OwUE/UPg7LL2ihyI/AAAAAAAAANU/Hys4TkrlNhk/s200/lego-indiana-jones8.jpg http://mixupload.org/img/forbidden.png http://www.pammarketingnut.com/wp-content/uploads/gmail.jpg http://www.bfc-clan.com/PUBLIC/e107_images/custom/server-rules.jpg http://www.mystikcreation.com/blog/wp-content/uploads/2013/07/responsive-web-design.jpg http://jan.newmarch.name/ecommerce/stateless.gif http://www.empowernetwork.com/workwithsheena/files/2013/09/how-to-use-an-onlne-html-editor.jpg http://www.northeastern.edu/securenu/wp-content/uploads/2013/01/Java_Logo.jpg http://blog.programmableweb.com/wp-content/w3c.gif http://upload.wikimedia.org/wikipedia/commons/5/58/Dom_tree.png http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2009/02/html1.png http://2.bp.blogspot.com/_m39Ioh2ptw8/TAZQiFRZIVI/AAAAAAAAChI/DpUw99EcJ9o/s320/verg%C3%BCenza.jpg http://2.bp.blogspot.com/_0s5FkH27RVs/TPQdT-74xnI/AAAAAAAAAzU/RVCd6FpGWZc/s200/verguenza.jpg http://www.definicionabc.com/wp-content/uploads/verg%C3%BCenza.jpg http://img.desmotivaciones.es/201102/verguenza_3.jpg http://www.hybridcluster.com/wp-content/themes/hybridcloud/images/difficult-server-installation.jpg http://3.bp.blogspot.com/-HiZ_0Fcc1F8/T_rZjhK4goI/AAAAAAAABUA/b61_asF8eLk/s200/empty.jpg

Notas del editor

  1. {}