2011-01-09 10 views
15

Quando si cerca di creare una pagina HTML con JSPX si dovrà affrontare le seguenti difficoltà:Come produrre HTML valido con JSPX? (Non XHTML)

  • JSPX riduce al minimo i tag che non si vuole che, per esempio <div class="foo"></div> diventa <div class="foo"/> che viene interpretato in modo diverso dai browser
  • I tag JSPX devono essere chiusi, mentre alcuni tag HTML devono rimanere chiusi, ad esempio <script...>. Il tag auto-chiuso <script.../> non è riconosciuto da IE e Firefox.
  • Specificando HTML5 doctype (<!DOCTYPE html>)
  • Inline JavaScript

Questa domanda è una risposta a qualche altro che tutte si riducono allo stesso problema. Non sono riuscito a trovare una risposta esaustiva, quindi sto postando il risultato delle mie scoperte.

domande correlate:

+0

JSP/JSPX è una tecnologia obsoleta. Considerare Facelets. Correlato: http://stackoverflow.com/questions/2935759/is-it-possibile-per-utilizzare-sanguefile-con-html-4-5 – BalusC

risposta

24

JSPX è perfettamente adatta per la produzione di HTML e XHTML.

Si riduce alla comprensione della natura XML di questa lingua. JSPX è XML mentre HTML non lo è. Una delle implicazioni è che il parser JSPX "minimizza" i tag vuoti perché XML non distingue tra tag a chiusura automatica e tag vuoti. Ciò causa i problemi dei tag <script...> e <div></div>. Tuttavia, vale la pena notare che mentre i file JSPX devono essere XML validi, , l'output che producono non è. Quindi è perfettamente corretto avere un file JSPX che produca HTML (non solo XHTML). In effetti, è possibile utilizzare JSPX per produrre qualsiasi output testuale come CSV, CSS o JS anche se sarebbe piuttosto scomodo.

Tenuto conto di quanto sopra, la soluzione più pulita sembra essere la creazione di un taglib personalizzato con tag come htmlScript, htmlDiv, ecc Questi tag possono essere utilizzati in questo modo:

<html:div styleClass="foo" selfClosing="false">${message}<html:div> 

suo output HTML conterrebbe il tag di chiusura, a prescindere dal contenuto:

<div style="foo"></div> 
<div style="foo">Hello</div> 

Un taglib come questo sarebbe consentono di creare pagine HTML con JSPX senza usare piuttosto brutte soluzioni alternative.

Creazione di pagine HTML sembra essere una delle applicazioni più comuni di JSPX. È piuttosto sorprendente che non ci sia una libreria HTML standard. JSF ne ha uno, ma se usi JSP pulito non ti aiuterà. Potrebbe esserci una biblioteca di terze parti che colma questa lacuna, ma non sono riuscita a trovarne una.

Se non avete voglia di scrivere il vostro taglib, un approccio alternativo è quello di utilizzare CDATA:

<![CDATA[<script type="text/javascript" src="/js/jquery-1.4.4.min.js">]]> 

o:

<![CDATA[<script type="text/javascript" src="/js/jquery-1.4.4.min.js"></script>]]> 

Altre proposte nelle questioni correlate dovevano mettere un commentare o vuoto <jsp:text> all'interno <script> che fornisce lo stesso risultato:

<script type="text/javascript" src="/js/jquery-1.4.4.min.js"><!-- Prevent self-closing --></script> 

(come ha osservato Ralph, quanto sopra non funziona con WebSphere) o:

<script type="text/javascript" src="/js/jquery-1.4.4.min.js"><jsp:text></jsp:text></script> 

CDATA si rivela utile anche in alcuni altri casi. Uno di questi è la stampa del doctype HTML5 (<!DOCTYPE html>). JSPX non ti consente di inserire la dichiarazione DOCTYPE nel tuo documento perché non è un XML valido. JSPX deifora anche il tag jsp: output ma stampa l'attributo SYSTEM anche quando è vuoto. Una soluzione è quella di avvolgere il DOCTYPE nel CDATA all'inizio di una pagina:

<![CDATA[<!DOCTYPE html>]]> 

CDATA può anche essere utilizzato per incapsulare JavaScript inline. Mentre questo produce l'analisi di errore a causa della "<" segno:

<script type="text/javascript"> 
    var x = 7 < 5; 
</script> 

questo funzionerà bene:

<script type="text/javascript"> 
    <![CDATA[ 
    var x = 7 < 5; 
    ]]> 
</script> 

noti che CDATA nel JSPX uscite tutto così com'è ma valuta comunque espressioni EL. Così il seguente:

<![CDATA[ 
<jsp:expression>"asd " + "def"</jsp:expression> 
${1 + 2} 
]]> 

produce:

<jsp:expression>"asd " + "def"</jsp:expression> 
3 

Spero che questo aiuti :)

+1

- Non funziona per Websphere – Ralph

+0

Il secondo tag dovrebbe essere un tag di chiusura?? Non ho familiarità con jspx. – mwcz

+1

Si noti che solo "" sarà sufficiente al posto di "". –

0

Il metodo consigliato è:

< script type = "text/javascript" >

// <! [CDATA [

//your javascript goes here 
    function myFuncy(){ 
     if(a > b || a >= b && b && c){ 
      X; 
     } 
    } 

//]] >

</script >

Problemi correlati