为什么我无法从 tld 文件导入此函数?

问题描述 投票:0回答:1

我正在遵循 Klausen JaveEE 书中的教程。 这是一个简单的网络应用程序,它接受一个数字作为用户输入并检查它是否是素数。

我有一个 JSP 文件 (index.jsp) 和一个名为 PrimeBean 的 javabean 中的静态方法 isPrime(long n) 。 我已在 .tld 文件中注册了该方法,并从 jsp 页面调用它。

我已经在jsp页面顶部的<%>标签中导入了核心标签库和注册的功能。

但我收到此错误 - 但无法找出原因。

属性前缀“fun”不对应于任何导入的标签库

.tld 文件的位置是 \WEB-INF lds unctions.tld

以下是项目的目录结构:

tld 文件是:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
  
  <tlib-version>1.0</tlib-version>
  <short-name>fun</short-name>
  <uri>/WEB-INF/tlds/functions</uri>
  
  <function>
      <name>isPrime</name>
      <function-class>funtions.beans.PrimeBean</function-class>
      <function-signature>boolean isPrime(long)</function-signature>
  </function>

</taglib>

index.jsp 文件是:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%taglib prefix="fun" uri="/WEB-INF/tlds/functions.tld" %>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <jsp:useBean id="primeBean" scope="request" class="functions.beans.PrimeBean"/>
        <jsp:setProperty name="primeBean" property="primeNum"/>
        <h1>Prime Number</h1>
        <form name="form1"  method="post">
            <p>Enter a prime: <input type="text"  name="primeNum"  value="${primeBean.primeNum}"/></p>
            <br>
            <input type="submit"  value="OK"/>
        </form>
            
            <p>
                <c:choose>
                    <c:when test="${fun:isPrime(primeBean.primeNum)}">
                        is a prime
                    </c:when>
                    
                    <c:otherwise>
                        is not prime
                    </c:otherwise>
                </c:choose>
            </p>
    </body>
</html>

javabean PrimeBean 是:

package functions.beans;

import java.io.Serializable;

/**
 *
 * @author mazee
 */
public class PrimeBean implements Serializable {
    private long primeNum = 0;
    
    public PrimeBean() { }
    
    public long getPrimeNum() {
        return primeNum;
    }
    
    public void setPrimeNum(long n) {
        this.primeNum = n;
    }
    
    // a function that uses a bean field as an argument must be static
    public static boolean isPrime(long n) {
        if (n == 2 || n == 3 || n == 5 || n == 7) {
            return true;
        }
        
        // test for large primes
        for (long t = 3,  m = (long) Math.sqrt(n) + 1; t <= m; t +=2) {
            if (n % t == 0) {
                return false;
            }
        }
        
        return true;
    }
    
}

我已经检查了 .tld 文件 - 它似乎是正确的。 我已经检查过该标签已导入 jsp 页面顶部的 <%> 标签中。 我已经检查过代码与教程中的相同。

但是...我不确定我是否在 .tld 和 .jsp 文件中正确指定了 uri。

function jsp tags tld
1个回答
0
投票

tld 应由 taglib

<URI>
标记中定义的值引用。那么它应该被定义为

<%taglib prefix="fun" uri="/WEB-INF/tlds/functions" %>

© www.soinside.com 2019 - 2024. All rights reserved.