Why can't I use JSP EL in my custom tag?

时间:2017-04-06 17:16:54

标签: java jsp tags expression

When I use the ${} for expression language outside of my tag, it works with a number or operations and anything. But whenever I put it inside my custom tag as a value, an error shows up. I checked similar questions in the internet and tried all their solutions but none of them worked. Btw, I'm just following a tutorial in tutorialspoint.com and I believe I did everything correctly.

This is the error that shows up:

type Exception report

message /WEB-INF/view/itr.jsp (line: 72, column: 7) According to TLD or attribute directive in tag file, attribute value does not accept any expressions

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: /WEB-INF/view/itr.jsp (line: 72, column: 7) According to TLD or attribute directive in tag file, attribute value does not accept any expressions
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:41)
    org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:275)
    org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:107)
    org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1241)
    org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:879)
    org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1536)
    org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
    org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2428)
    org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:898)
    org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1536)
    org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
    org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2428)
    org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2434)
    org.apache.jasper.compiler.Node$Root.accept(Node.java:464)
    org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
    org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1853)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:217)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:585)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:363)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.openmrs.web.filter.JspClassLoaderFilter.doFilter(JspClassLoaderFilter.java:47)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.openmrs.module.web.filter.ForcePasswordChangeFilter.doFilter(ForcePasswordChangeFilter.java:60)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.openmrs.web.filter.GZIPFilter.doFilterInternal(GZIPFilter.java:64)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.openmrs.module.web.filter.ModuleFilterChain.doFilter(ModuleFilterChain.java:72)
    org.openmrs.module.owa.filter.OwaFilter.doFilter(OwaFilter.java:57)
    org.openmrs.module.web.filter.ModuleFilterChain.doFilter(ModuleFilterChain.java:70)
    org.openmrs.module.web.filter.ModuleFilter.doFilter(ModuleFilter.java:54)
    org.openmrs.web.filter.OpenmrsFilter.doFilterInternal(OpenmrsFilter.java:108)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:150)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:105)
    org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:105)
    org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:105)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

These are my code:

HelloTag.java

package org.openmrs.web.taglib;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class HelloTag extends SimpleTagSupport {

    private double value;

    public void setValue(double val) {
        this.value = val;
    }

    StringWriter sw = new StringWriter();

    public void doTag() throws JspException, IOException {
        if (value != 0) {
            /* Use message from attribute */
            JspWriter out = getJspContext().getOut();
            out.println( value );
        }
        else {
            /* use message from the body */
            getJspBody().invoke(sw);
            getJspContext().getOut().println(sw.toString());
        }
    }
}

custom.tld

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>Example TLD</short-name>
  <uri>http://java.sun.com/jsp/jstl/core_rt</uri>
  <tag>
    <name>Hello</name>
    <tag-class>org.openmrs.web.taglib.HelloTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
       <name>value</name>
    </attribute>
  </tag>
</taglib>

itr.jsp

<%@ include file="/WEB-INF/view/module/chitscore/template/include.jsp" %>
<%@ page isELIgnored="false" %>

<h1>Individual Treatment Record</h1>

<h3>Anthropometric Data</h3>
<c:set var="OPENMRS_VIEWING_PATIENT_ID" scope="request" value="${patient.patientId}"/>
<form:form action="anthropometricdata.form" method="POST" modelAttribute="anthropometricdata">
    <table>
        <form:input path="patientId" type="hidden" value="${patient.patientId}"/>
        <tr>
            <td>Height</td>
            <td><form:input path="height" /></td>
        </tr>
        <tr>
            <td>Weight</td>
            <td><form:input path="weight" /></td>
        </tr>
        <tr>
            <td>Body Mass Index</td>
            <td></td>
        </tr>
        <tr>
            <td>Waist Circumference</td>
            <td><form:input path="waistCircumference" /></td>
        </tr>
        <tr>
            <td>Hip Circumference</td>
            <td><form:input path="hipCircumference" /></td>
        </tr>
        <tr>
            <td>Waist-Hip Ratio</td>
            <td></td>
        </tr>
        <tr>
            <td>Head Circumference</td>
            <td><form:input path="headCircumference" /></td>
        </tr>
        <tr>
            <td>Chest Circumference</td>
            <td><form:input path="chestCircumference" /></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" name="action" value="Save" />
                <input type="submit" name="action" value="Cancel" />
            </td>
        </tr>
    </table>
</form:form>
<br>
<table border="1">
    <th>Height</th>
    <th>Weight</th>
    <th>Body Mass Index</th>
    <th>Waist Circumference</th>
    <th>Hip Circumference</th>
    <th>Waist-Hip Ratio</th>
    <th>Head Circumference</th>
    <th>Chest Circumference</th>
    <th>test</th>
    <c:forEach items="${anthropometricdataList}" var="anthropometricdata">
        <tr>
            <td>${anthropometricdata.height}</td>
            <td>${anthropometricdata.weight}</td>
            <td>${anthropometricdata.bmi}</td>
            <td>${anthropometricdata.waistCircumference}</td>
            <td>${anthropometricdata.hipCircumference}</td>
            <td>${anthropometricdata.waistHipRatio}</td>
            <td>${anthropometricdata.headCircumference}</td>
            <td>${anthropometricdata.chestCircumference}</td>
            <td><ex:Hello value="${ anthropometricdata.weight }"/>${1 + 2 }</td>
        </tr>
    </c:forEach>
</table>

<%@ include file="/WEB-INF/view/module/chitscore/template/footer.jsp" %>

1 个答案:

答案 0 :(得分:1)

根据Java EE Tutorial,您必须为您的代码设置rtexprvaluetrue。即。

<attribute>
   <name>value</name>
   <rtexprvalue>true</rtexprvalue>
</attribute>