2011-08-23 14 views
12

Tengo una página que usa una plantilla de etiqueta. Mi web.xml es muy básico.etiquetas JSP + scriptlet. ¿Cómo habilitar scriptlet?

Simplemente quiero ejecutar algún código en la página.
Y no, no estoy interesado en etiquetas u otra alternativa. Quiero usar el scriptlet de mala práctica jaja.

Hasta ahora me estoy haciendo este "error HTTP 500" error:

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

Mientras mis archivos se parecen:

/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> 

He intentado modificar web.xml para activar de forma explícita que, como este (no funciona):

<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> 

Así que, ¿cómo lo uso scriptles puros dentro de mi etiqueta' ed JSP?

editar # 1:

un código ideal sería tener este aspecto, dentro de una página que utiliza mi plantilla ('envoltorio' que el anterior):

<%@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> 

Ver? Scriptlets entre & dentro de las etiquetas ''. Eso es exactamente lo que estoy tratando de lograr.

+0

es esto en una versión local? ¿En qué contenedor de servlets se está desplegando? Parece que es un web master.xml no lo permite, ¡pero necesita más información para ayudarlo! – Codemwnci

+0

Está en el servidor dev (local) de Google App Engine (usan Jetty AFAIK). – Poni

Respuesta

16

En este caso, el contenedor no se preocupa por el valor de scripting-invalid en web.xml porque su mirar la etiqueta meta-datos para jsp:body que tiene un valor-cuerpo del contenido de scriptless. Así que cuando ves:

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

El contenedor se queja de los contenidos de JSP: cuerpo que deben estar sin script. Si desea representar el contenido scriplet en el cuerpo, puede configurarlo como un atributo de página que está afuera de la etiqueta jsp: cuerpo usando un scriptlet y luego hacerla usando EL dentro del cuerpo de este modo:

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

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

Hola, Jonathan, gracias ¡eso es lo primero! Segundo, todo el enfoque es limitante y no responde mi pregunta; ¿Cómo uso el código puro (sin etiquetas) en esta situación? – Poni

+1

Si desea deshacerse de todas las etiquetas por completo, tendrá que escribir un servlet o convertir su JSP para invocar directamente al escritor de secuencias de esta manera: <% out.write (""); %> –

+1

Bueno, todavía quieren utilizar "etiquetas" '' . Es solo que quiero implementar lógica en línea; use declaraciones "if", llame a funciones y haga cualquier otra cosa (con código) en realidad mientras conserva la capacidad de usar las etiquetas "normales" en este sistema de "etiquetas". ¿Por qué diablos tiene que ser tan complejo? En realidad, ¿quién es el chico inteligente que decidió poner un límite sin una razón sangrienta? (las preguntas no están apuntadas a ti realmente :)). – Poni

1

I' Estoy buscando una solución real para este problema, pero la solución que estoy usando es crear una etiqueta tld de estilo antiguo para guardar el fragmento de scriptlet en el contexto de la página y luego imprimirlo dentro de una etiqueta.

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> 

utilizarlo en 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 preferiría que no necesitara hacer esto, pero es una solución viable para aquellos con diseños heredados. ¡Bueno! –

4

En pocas palabras, como se ha mencionado, no se puede hacer eso. No hay una "solución", no se puede hacer.Los archivos de etiquetas son básicamente "Etiquetas simples" en el lenguaje de JSP. Las etiquetas simples son simplemente eso, etiquetas más simples que no ofrecen todas las opciones de una etiqueta JSP normal, y eso incluye el manejo de scriptlets.

Por lo tanto, no están limitando lo que puede hacer, en lugar no puede utilizar archivos de etiquetas para hacerlo. Lo que has encontrado es que eres uno de los pocos que parece disfrutar el uso de scriptlets en JSP cuando la mayoría de la comunidad los ha evitado.

Lo que he encontrado es que si necesito recurrir al código scriptlet, encierro ese código en su propio archivo de etiqueta y luego invoco la etiqueta desde el JSP. Para mis propósitos, esto ha funcionado bastante bien, y he hecho algunas etiquetas bastante sofisticadas usando solo archivos de etiquetas (en lugar de Java convencional).

Esto probablemente no funcionará para usted, ya que da la sensación de que está utilizando scriptles por regla general, más que como una excepción.

0

@Poni

Si desea utilizar la sencilla si la condición que se puede utilizar el siguiente lugar de scriplet

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

tipo de respuesta tardía, pero esto debería funcionar:

<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

Creo que esta es la mejor respuesta. –

1

sobre la base de la respuesta de @bjarnij, me pareció que para ser la mejor solución para mí:

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> 

casi lo mismo que de bjarnij, pero que tenía que poner c:set exterior de la envoltura. Funciona como un encanto para mí :)

Cuestiones relacionadas