Странные ошибки для пользовательского тега в файле JSP, генерирующем динамическое содержимое

Итак, я работаю над написанием веб-программы на JSP и сервлетов Java с использованием архитектуры MVC, где мне нужно перечислить кучу элементов, которые я извлекаю из базы данных на странице JSP, используя собственный тег forEach. Я написал класс тега:

package ps6;

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

public class ForEachTag extends SimpleTagSupport {

    private Object[] items;
    private String attributeName;

    public void setItems(Object[] items) {
        this.items = items;
    }

    public void setVar(String attributeName) {
        this.attributeName = attributeName;
    }

    public void doTag() throws JspException, IOException {

        for (int i=0; i < items.length; i++) {
            getJspContext().setAttribute(attributeName, items[i]);
            getJspBody().invoke(null);
        }
    }
}

Файл .tld:

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>auction</short-name>

    <tag>
        <description>Outputs a list or something</description>
        <name>forEach</name>
        <tag-class>ps6.ForEachTag</tag-class>
        <body-content>scriptless</body-content>

        <attribute>
            <description>The array of elements</description>
            <name>items</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <description>The name of the variable to which each entry is assigned</description>
            <name>var</name>
            <required>true</required>   
        </attribute>
    </tag>
</taglib>

Сервлет для работы:

package ps6;

import java.io.*;
import java.sql.Connection;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ViewAuctions
 */
@WebServlet("/ViewAuctions")
public class ViewAuctions extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public ViewAuctions() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String[][] items = getItems();
        request.setAttribute("items", items);

        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/viewAuctions.jsp");
        dispatcher.forward(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    private String[][] getItems() {

        try {
            Connection connection = DB.openConnection();
            Statement statement = connection.createStatement();

            String query = "SELECT * FROM items WHERE open='1';";
            ResultSet results = statement.executeQuery(query);

            results.last();
            int numItems = results.getRow();
            results.first();
            int numCols = 5;
            String[][] items = new String[numItems][numCols];

            for (int r=0; r < numItems; r++) {

                items[r][0] = results.getString("itemNum");
                items[r][1] = results.getString("username");
                items[r][2] = results.getString("title");
                items[r][3] = results.getString("description");
                items[r][4] = results.getString("highBid");

                results.next();
            }

            return items;

        }
        catch (SQLException sqle) {
            throw new RuntimeException("Error accessing database: " + sqle);
        }

    }

}

и, наконец, сам файл .jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>See what's for sale</title>
</head>
<body>
<%@ taglib uri="/WEB-INF/auction.tld" prefix="auction" %>

<h1>Open Auctions:</h1>

<table border="1">
<tr><th>Item No.</th><th>Auction Owner</th><th>Title</th><th>Description</th><th>Highest Bid</th></tr>
<auction:forEach items="${items}" var="row">
<tr><auction:forEach items="${row}" var="data">
    <td>${data}</td>
</auction:forEach>
</tr>
</auction:forEach>
</table>

Но я продолжаю получать эти ошибки, которых я действительно не понимаю:

org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 16 in the jsp file: /WEB-INF/viewAuctions.jsp
Syntax error on token "[", delete this token
13: 
14: <table border="1">
15: <tr><th>Item No.</th><th>Auction Owner</th><th>Title</th><th>Description</th><th>Highest Bid</th></tr>
16: <auction:forEach items="${items}" var="row">
17: <tr><auction:forEach items="${row}" var="data">
18:     <td>${data}</td>
19: </auction:forEach>


An error occurred at line: 16 in the jsp file: /WEB-INF/viewAuctions.jsp
Ljava.lang.Object cannot be resolved to a type
13: 
14: <table border="1">
15: <tr><th>Item No.</th><th>Auction Owner</th><th>Title</th><th>Description</th><th>Highest Bid</th></tr>
16: <auction:forEach items="${items}" var="row">
17: <tr><auction:forEach items="${row}" var="data">
18:     <td>${data}</td>
19: </auction:forEach>


An error occurred at line: 16 in the jsp file: /WEB-INF/viewAuctions.jsp
Syntax error on token ";", delete this token
13: 
14: <table border="1">
15: <tr><th>Item No.</th><th>Auction Owner</th><th>Title</th><th>Description</th><th>Highest Bid</th></tr>
16: <auction:forEach items="${items}" var="row">
17: <tr><auction:forEach items="${row}" var="data">
18:     <td>${data}</td>
19: </auction:forEach>


An error occurred at line: 16 in the jsp file: /WEB-INF/viewAuctions.jsp
The method getValueFromPropertyEditorManager(Class<?>, String, String) in the type JspRuntimeLibrary is not applicable for the arguments ()
13: 
14: <table border="1">
15: <tr><th>Item No.</th><th>Auction Owner</th><th>Title</th><th>Description</th><th>Highest Bid</th></tr>
16: <auction:forEach items="${items}" var="row">
17: <tr><auction:forEach items="${row}" var="data">
18:     <td>${data}</td>
19: </auction:forEach>


An error occurred at line: 16 in the jsp file: /WEB-INF/viewAuctions.jsp
Syntax error, insert ")" to complete Expression
13: 
14: <table border="1">
15: <tr><th>Item No.</th><th>Auction Owner</th><th>Title</th><th>Description</th><th>Highest Bid</th></tr>
16: <auction:forEach items="${items}" var="row">
17: <tr><auction:forEach items="${row}" var="data">
18:     <td>${data}</td>
19: </auction:forEach>

Мне действительно не помешала бы помощь в расшифровке того, что означают эти ошибки или на что они вообще ссылаются. В строке, которую он упоминает, нет символов, на которые он жалуется, и я не вижу, откуда могут браться ошибки, и я не смог найти никакой помощи, погуглив ошибку. Мы будем очень признательны за любое понимание.


person Community    schedule 05.04.2011    source источник
comment
Почему вам недостаточно стандартного JSTL forEach?   -  person Costi Ciudatu    schedule 05.04.2011
comment
Я не знал о стандарте, в моем учебнике он не упоминался. Не могли бы вы показать мне, как импортировать JSTL?   -  person    schedule 06.04.2011
comment
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Затем вы можете использовать ‹c:forEach...›, который также работает с коллекциями и имеет несколько больше возможностей, чем ваша реализация. Вам необходимо включить файлы jstl.jar и standard.jar в каталог WEB-INF/lib.   -  person Costi Ciudatu    schedule 06.04.2011


Ответы (2)


Это может произойти из-за неправильного объявления вашего дескриптора web.xml. Попробуйте установить правильную версию для вашего Servlet API (вероятно, 2.4) и правильную схему, если она не установлена ​​должным образом.

person Costi Ciudatu    schedule 05.04.2011
comment
Да, это было так. Мне понадобилась целая вечность, чтобы понять, что такое правильное объявление, но в конце концов я добрался до него. - person ; 06.04.2011
comment
Я не представлял, что это будет так сложно, так как мог бы помочь вам с образцом с самого начала (извините за это). Но так как это было трудно найти, было бы хорошо опубликовать здесь то, что сработало для вас, чтобы другие могли увидеть полный ответ. Отдельно см. мой комментарий об использовании JSTL, так как это действительно правильный ответ для вашего варианта использования. - person Costi Ciudatu; 06.04.2011

Я не уверен, что именно пошло не так, но похоже, что движок JSP ошибочно вставил двоичное представление типа Object[] ([Ljava.lang.Object;) в исходный код. Попробуйте объявить аргумент setItems() как Object.

person axtavt    schedule 05.04.2011