2011-08-23 14 views
12

Ho una pagina che utilizza un modello di tag. My web.xml è molto semplice.Tag JSP + scriptlet. Come abilitare lo scriptlet?

Voglio semplicemente eseguire un codice nella pagina.
E no, non sono interessato ai tag o ad altre alternative. Voglio usare lo scriptlet di cattiva pratica haha.

Finora Mi viene questo "Errore HTTP 500" errore:

Scripting elements (%!, jsp:declaration, %=, jsp:expression, %, jsp:scriptlet) are disallowed here. 

Mentre i miei file assomigliano:

/WEB-INF/web.xml

<?xml version="1.0" encoding="utf-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 

    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

/WEB-INF/tags/wrapper.tag

<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%> 
<%@ attribute name="title" required="true" type="java.lang.String"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html> 
<head> 
<title>${title}</title> 
</head> 

<body> 
    <jsp:doBody /> 
</body> 
</html> 

index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@taglib prefix="t" tagdir="/WEB-INF/tags"%> 

<t:wrapper> 
    <jsp:attribute name="title">My nice title</jsp:attribute> 

    <jsp:body> 
    <h1><%="some code generated text"%></h1> 
    </jsp:body> 
</t:wrapper> 

ho cercato di modificare web.xml per consentire esplicitamente, come questo (che non funziona):

<jsp-config> 
    <jsp-property-group> 
     <url-pattern>*.jsp</url-pattern> 
     <scripting-invalid>false</scripting-invalid> 
    </jsp-property-group> 
    <jsp-property-group> 
     <url-pattern>*.tag</url-pattern>     
     <scripting-invalid>false</scripting-invalid> 
    </jsp-property-group> 
</jsp-config> 

Allora, come faccio a utilizzare scriptlet puri nel mio tag' ed JSP?

EDIT # 1:

Un codice ideale sarebbe simile a questa, all'interno di una pagina che utilizza il mio modello ('involucro' come sopra):

<%@page import="java.util.Calendar"%> 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@taglib prefix="t" tagdir="/WEB-INF/tags"%> 

<t:wrapper> 
    <jsp:attribute name="title">My nice title</jsp:attribute> 

    <% 
     final int day_of_week = Calendar.getInstance().get(
       Calendar.DAY_OF_WEEK); 
     if (day_of_week == Calendar.SATURDAY) 
     { 
    %> 
    <jsp:body> 
    <h1>Have a nice Saturday (<%=Integer.toString(day_of_week)%>)!</h1> 
    </jsp:body> 
    <% 
     } 
     else 
     { 
    %> 
    <jsp:body> 
    <h1>Have a nice rest-of-the-week (<%=Integer.toString(day_of_week)%>)!</h1> 
    </jsp:body> 
    <% 
     } 
    %> 
</t:wrapper> 

Vedi? Scriptlet tra & all'interno dei tag "". Questo è esattamente quello che sto cercando di ottenere.

+0

è presente su una versione locale? A quale servlet container stai distribuendo? Sembra che sia un master web.xml non lo consente, ma ha bisogno di più informazioni per aiutarti! – Codemwnci

+0

È su Google App Engine (usano il server dev (locale) di Jetty AFAIK). – Poni

risposta

16

In questo caso, il contenitore non si preoccupa del valore di scripting-invalid in web.xml perché la sua guardando il tag meta-dati per jsp:body che ha un valore corpo contenuto di scriptless. Quindi, quando vedete:

Scripting elements (%!, jsp:declaration, %=, jsp:expression, %, jsp:scriptlet) are disallowed here. 

Il contenitore si lamenta del contenuto di jsp: corpo che deve essere privo di script. Se si vuole il rendering del contenuto scriptlet nel corpo, è possibile impostarla come attributo pagina di fuori del jsp: tag body utilizzando uno scriptlet e poi il rendering utilizzando EL all'interno del corpo in questo modo:

<% request.setAttribute("stuff", object); %> 

<jsp:body> 
${stuff} 
</jsp:body> 
+1

Ciao Jonathan grazie che è il primo! In secondo luogo, l'intero approccio è limitante e non risponde alla mia domanda; Come faccio ad usare codice puro (senza tag di sorta) in questa situazione? – Poni

+1

Se si vuole sbarazzarsi di tutti i tag completamente, potrete sia necessario a dare una servlet o JSP convertire il vostro per richiamare lo scrittore flusso direttamente in questo modo: <% out.write (""); %> –

+1

Bene, voglio ancora utilizzare "tag" come "". È solo che voglio implementare la logica inline; usa le istruzioni "if", chiama le funzioni e fai qualsiasi altra cosa (con il codice), pur mantenendo la possibilità di usare i tag "regolari" in questo sistema di "tag". Perché diavolo deve essere così complesso? In realtà, chi è il ragazzo intelligente che ha deciso di mettere un limite per nessuna ragione insanguinata? (le domande non ti sono indirizzate davvero :)). – Poni

1

I' Sto cercando di trovare una soluzione reale per questo problema, ma la soluzione che sto utilizzando è quella di creare un tag tld vecchio stile per salvare il frammento dello scriptlet nel contesto della pagina e quindi stamparlo all'interno di un tag.

public class PushTag extends BodyTagSupport { 
    private String key; 
    public int doStartTag() throws JspException { 
     return EVAL_BODY_BUFFERED; 
    } 
    @Override 
    public int doAfterBody() throws JspException { 
     pageContext.setAttribute(PREFIX + key, getBodyContent().getString()); 
     return SKIP_BODY; 
    } 
    public String getKey() { 
     return key; 
    } 
    public void setKey(String key) { 
     this.key = key; 
    } 
    private static final String PREFIX = PushTag.class.getPackage().getName() 
      + "."; 
    private static final long serialVersionUID = 1L; 
} 

public class PopTag extends BodyTagSupport { 
    private String key; 
    @Override 
    public int doStartTag() throws JspException { 
     try { 
      String bc = (String) pageContext.getAttribute(PREFIX + key); 
      if (bc != null) { 
       pageContext.getOut().write(bc); 
      } 
     } catch (Exception e) { 
      throw new JspException("Error:" + e.getMessage()); 
     } 
     return super.doStartTag(); 
    } 
    public String getKey() { 
     return key; 
    } 
    public void setKey(String key) { 
     this.key = key; 
    } 
    private static final String PREFIX = PopTag.class.getPackage().getName() 
      + "."; 
    private static final long serialVersionUID = 1L; 
} 

pushpop.tld

<taglib> 
    <tlib-version>1.2</tlib-version> 
    <jsp-version>2.1</jsp-version> 
    <short-name>q</short-name> 
    <uri>http://dev.example.com/jsp/taglib/</uri> 
    <tag> 
     <name>push</name> 
     <tag-class>x.web.PushTag</tag-class> 
     <body-content>JSP</body-content> 
     <attribute> 
      <name>key</name> 
      <required>true</required> 
      <type>java.lang.String</type> 
     </attribute> 
    </tag> 
    <tag> 
     <name>pop</name> 
     <tag-class>x.web.PopTag</tag-class> 
     <body-content>JSP</body-content> 
     <attribute> 
      <name>key</name> 
      <required>true</required> 
      <type>java.lang.String</type> 
     </attribute> 
    </tag> 
</taglib> 

utilizzarlo in jsp:

<%@ taglib prefix="x" uri="http://example.com/jsp/taglib/" %> 

<x:push key="scriptful"><%= "We Love SCRIPTLETS!" %></x:push> 

<t:wrapper><x:pop key="scriptful"/></t:wrapper> 
+0

JSP 2 preferirebbe non aver bisogno di farlo - ma una soluzione praticabile, per quelli con design legacy. Buona! –

4

in poche parole, come detto, non si può fare questo. Non c'è "correzione", non può essere fatto.I Tag File sono fondamentalmente "Simple Tag" in JSP parlance. I tag semplici sono proprio questo, tag più semplici che non offrono tutte le opzioni di un normale tag JSP e che includono la gestione degli scriptlet.

Quindi, non sono vincolanti cosa si può fare, invece non è possibile utilizzare i file di tag per farlo. Quello che hai scoperto è che sei uno dei pochi che sembra divertirsi usando gli scriptlet in JSP quando la maggior parte della comunità li ha evitati.

Quello che ho trovato è che se ho bisogno di ricorrere al codice scriptlet, inserisco quel codice nel proprio file di tag e poi invoco il tag dal JSP. Per i miei scopi questo ha funzionato abbastanza bene, e ho realizzato alcuni tag piuttosto sofisticati usando solo file di tag (piuttosto che Java convenzionale).

Questo probabilmente non funzionerà per voi, come ho la sensazione che si sta utilizzando scriptlets di regola, piuttosto che come eccezione.

0

@Poni

Se si desidera utilizzare il semplice se la condizione si può utilizzare la seguente invece di scriptlet

<c:if test="${!empty flashMsg}"> 
    <p>your content</p> 
</c:if> 
5

tipo di risposta in ritardo, ma questo dovrebbe funzionare:

<t:wrapper> 
    <jsp:attribute name="title">My nice title</jsp:attribute> 
    <c:set var="bodyContent"> 
     <% 
      final int day_of_week = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); 
      if (day_of_week == Calendar.SATURDAY) 
      { 
     %> 
     <h1>Have a nice Saturday (<%=Integer.toString(day_of_week)%>)!</h1> 
     <% 
      } 
      else 
      { 
     %> 
     <jsp:body> 
     <h1>Have a nice rest-of-the-week (<%=Integer.toString(day_of_week)%>)!</h1> 
     </jsp:body> 
     <% 
      } 
     %> 
    </c:set> 
    <jsp:body> 
     ${bodyContent} 
    </jsp:body> 
</t:wrapper> 
+0

Penso che questa sia la migliore risposta. –

1

sulla base della risposta di @bjarnij, ho trovato questo per essere la soluzione migliore per me:

myJSP.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %> 

<c:set var="bodyContent"> 
    <% 
     //Your content with scriplets and everything 
    %> 
</c:set> 

<t:wrapper> 
    <jsp:body> 
     ${bodyContent} 
    </jsp:body> 
</t:wrapper> 

Quasi la stessa di bjarnij di, ma ho dovuto mettere c:set al di fuori della confezione. Funziona come un fascino per me :)

Problemi correlati