wake-up-neo.com

JSP-Tags + Scriptlet. Wie aktiviere ich das Scriptlet?

Ich habe eine Seite, die eine Tag-Vorlage verwendet. Meine web.xml ist sehr einfach.

Ich möchte einfach nur Code auf der Seite ausführen.
Und nein, ich bin nicht an Tags oder anderen Alternativen interessiert. Ich möchte das Bad-Practice-Scriptlet verwenden, haha.

Bisher erhalte ich den Fehler "HTTP ERROR 500":

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

Während meine Dateien so aussehen:

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

Ich habe versucht, die Datei web.xml so zu ändern, dass sie explizit aktiviert wird (funktioniert nicht):

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

Wie verwende ich reine Scriptlets in meiner JSP mit Tags?

EDIT # 1 :

Ein idealer Code würde so aussehen , innerhalb einer Seite, die meine Vorlage verwendet ('Wrapper' wie oben):

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

Sehen? Scriptlets zwischen und innerhalb der Tags. Genau das versuche ich zu erreichen.

13
Poni

In diesem Fall interessiert sich der Container nicht für den Wert von scripting-invalid in web.xml, da er die Tag-Metadaten für jsp:body betrachtet, die den Wert für body-content von scriptless haben. Wenn Sie also sehen:

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

Der Container beschwert sich über den Inhalt von jsp: body, der kein Skript enthalten darf. Wenn Sie Scriptlet-Inhalt im Text rendern möchten, können Sie ihn mit einem Scriptlet außerhalb des Tags jsp: body als Seitenattribut festlegen und dann mit EL im Body wie folgt rendern:

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

<jsp:body>
${stuff}
</jsp:body>
19
jonathan.cone

Späte Antwort, aber das sollte funktionieren:

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

Einfach gesagt, wie gesagt, das geht nicht. Es gibt keine "Korrektur", es kann nicht gemacht werden. Tag-Dateien sind im Grunde "einfache Tags" in der JSP-Sprache. Einfache Tags sind genau das. Einfachere Tags, die nicht alle Optionen eines normalen JSP-Tags bieten, und auch die Handhabung von Scriptlets.

Sie schränken also nicht ein, was Sie tun können, sondern können keine Tag-Dateien dafür verwenden. Sie haben festgestellt, dass Sie einer der wenigen sind, der Scriptlets in JSP zu verwenden scheint, wenn die meisten Communitys sie vermieden haben.

Ich habe festgestellt, dass ich, wenn ich auf Scriptlet-Code zurückgreifen muss, diesen Code in seine eigene Tag-Datei einbetten und dann das Tag von der JSP aus aufrufen muss. Für meine Zwecke hat dies ziemlich gut funktioniert, und ich habe einige recht anspruchsvolle Tags nur mit Tag-Dateien (anstatt mit herkömmlichem Java) erstellt.

Das funktioniert wahrscheinlich nicht für Sie, da ich das Gefühl habe, dass Sie in der Regel Scriptlets verwenden und nicht als Ausnahme.

4
Will Hartung

Basierend auf der Antwort von @bjarnij habe ich festgestellt, dass dies die beste Lösung für mich ist:

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>

Fast das gleiche wie bei bjarnij, aber ich musste c:set außerhalb des Wrappers platzieren. Funktioniert wie ein Zauber für mich :)

2
Hans Araya

Ich suche nach einer wirklichen Lösung für dieses Problem, aber die von mir verwendete Problemumgehung besteht darin, ein altes tld-Tag zu erstellen, um das Scriptlet-Fragment im Seitenkontext zu speichern und es dann innerhalb eines Tags zu drucken.

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>

Verwenden Sie es 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>
1
Ali Shakiba

Unten ist der Code, den ich verwendet habe, um Scriplet-ähnliche Codes in JSPX-Seiten einzufügen.

Der Code funktioniert auch beim Bearbeiten der von Spring-Roo erstellten Vorlagenseiten.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:c="http://Java.Sun.com/jsp/jstl/core"
    xmlns:fn="http://Java.Sun.com/jsp/jstl/functions"
    xmlns:jsp="http://Java.Sun.com/JSP/Page"
    xmlns:spring="http://www.springframework.org/tags"
    xmlns:util="urn:jsptagdir:/WEB-INF/tags/util" id="footer" version="2.0">
    <jsp:directive.page contentType="text/html;charset=UTF-8" />
    <jsp:output omit-xml-declaration="yes" />


    <jsp:declaration> String t; </jsp:declaration>
    <jsp:scriptlet> 
    <![CDATA[
        t="Declared and Initialized From Scriplet";
    ]]>
    </jsp:scriptlet>


    <jsp:scriptlet> 
    <![CDATA[
    for(int i=0;i<3;i++){
    ]]>
    </jsp:scriptlet>
            <jsp:expression>t+i</jsp:expression> <![CDATA[ iteration &nbsp;&nbsp;<br/>]]>
    <jsp:scriptlet> 
    <![CDATA[
    }
    ]]>
    </jsp:scriptlet>
</div>

Hinweis: Die richtige Kombination von <jsp:declaration>,</jsp:declaration> und <jsp:expression> zusammen mit <![CDATA[... ]]> führt den Trick aus.

Nachfolgend finden Sie Referenzlinks:

0

@Poni

Wenn Sie die einfache if-Bedingung verwenden möchten, können wir anstelle von Scriptlet Folgendes verwenden

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