Почему тэг ничего не выводит

Я написал view, но <c:forEach> не работает. Выводит только заголовок страницы

<!DOCTYPE html>
<html>
<body>

<h2>All Employees</h2>

<br>

<table>
    <tr>
        <th>Name</th>
        <th>Surname</th>
        <th>Department</th>
        <th>Salary</th>
    </tr>

    <c:forEach var="empl" items="${allEmps}">

    <tr>
        <td>${empl.name}</td>
        <td>${empl.surname}</td>
        <td>${empl.department}</td>
        <td>${empl.salary}</td>
    </tr>

</c:forEach>

</table>

</body>

</html>

введите сюда описание изображения

вот мой контроллер:

package com.maksimov.spring.mvc_hibernate_aop.controller;

import com.maksimov.spring.mvc_hibernate_aop.dao.EmployeeDAO;
import com.maksimov.spring.mvc_hibernate_aop.entity.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
public class MyController {

    @Autowired
    private EmployeeDAO employeeDAO;

    @RequestMapping("/")
    public String showAllEmployees(Model model){

        List<Employee> allEmployees = employeeDAO.getAllEmployees();
        model.addAttribute("allEmps", allEmployees);

        return "all-employees";
    }
}

класс Employee:

package com.maksimov.spring.mvc_hibernate_aop.entity;

import jakarta.persistence.*;

@Entity
@Table(name = "employees")
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;
    @Column(name = "name")
    private String name;
    @Column(name = "surname")
    private String surname;
    @Column(name = "department")
    private String department;
    @Column(name = "salary")
    private int salary;

    public Employee() {
    }

    public Employee(String name, String surname, String department, int salary) {
        this.name = name;
        this.surname = surname;
        this.department = department;
        this.salary = salary;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", surname='" + surname + '\'' +
                ", department='" + department + '\'' +
                ", salary=" + salary +
                '}';
    }
}

класс DAO:

package com.maksimov.spring.mvc_hibernate_aop.dao;

import com.maksimov.spring.mvc_hibernate_aop.entity.Employee;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Repository
public class EmployeeDAOImpl implements EmployeeDAO {
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    @Transactional
    public List<Employee> getAllEmployees() {

        Session session = sessionFactory.getCurrentSession();

        Query<Employee> query = session.createQuery("from Employee", Employee.class);
        List<Employee> allEmployees = query.getResultList();

        return allEmployees;
    }
}

View работает, но не выполняет <c:forEach>. Я уже пробовал добавлять тег

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

но после добавления начинает выдавать ошибку


Ответы (1 шт):

Автор решения: Roman C

Тэг <c:forEach> относится к библиотеке тэгов JSTL. То, что тэг не работает объясняется тем, что отсутствует определение библиотеки taglib, а также возможно в проекте не хватает зависисимости от библиотеки с имплементацией тэгов JSTL. Я уже писал в этом ответе Ошибка подключении JSTL зависимости в Maven как надо использовать JSTL на странице JSP. Если SpringBoot версии 3.2 и выше, то версия сервлетов будет 6.0, это необходимо для Jakarta EE:

Неправильно:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Правильно:

<%@ taglib prefix="c" uri="jakarta.tags.core" %>

Ну а сама библиотека находится в репозитории:

Нужно только использовать Meven для сборки и подключить следующие зависимости:

<dependency>
     <groupId>jakarta.servlet.jsp.jstl</groupId>
     <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
     <version>3.0.0</version> 
</dependency>

<dependency>
     <groupId>org.glassfish.web</groupId>         <artifactId>jakarta.servlet.jsp.jstl</artifactId>
     <version>3.0.1</version>
</dependency>
→ Ссылка