$ {channels} пусто на странице JSP, обслуживаемой Spring MVC

#spring-boot #spring-mvc

#spring-boot #spring-mvc

Вопрос:

Я новичок в Java, используя STS 4 Eclipse, Java 8.

Я пытаюсь использовать теги JSTL для вывода некоторых значений через мой файл jsp, однако я не получаю никаких выходных данных из моего цикла forEach в list.jsp. Я получаю вывод из тега < p > непосредственно перед циклом.

Извините за большой объем кода, просто не хотел ничего пропустить.

list.jsp

 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Channels</title>
    </head>
    <body>
    <p>Channels</p> 
        <c:forEach items="${channels}" var="channel">
            <p>${channel.name}'s topic is ${channel.topic}</p>
            <p> <a href="/shows?channel=${channel.id}">Link to the channel</a></p>
        </c:forEach>
    </body>
</html>
  

ChannelController.java

 package co2103.hw1.controller;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResu<
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import co2103.hw1.Hw1Application;
import co2103.hw1.domain.Channel;

@Controller
public class ChannelController {
    public List<Channel> channels;
    
    @GetMapping("/channels")
    public String channelsList(Model model) {
        model.addAttribute("channels", Hw1Application.channels);
        return "channels/list";
    }
    
    @RequestMapping("/newChannel")
    public String newchannel(Model model) {
        model.addAttribute("channel", new Channel());
        return "channels/form";
    }
    
    @PostMapping("/addChannel")
    public String updateChannel(@ModelAttribute Channel channel, BindingResult result) {
        if (result.hasErrors()) {
            return "channels/form";
        }
        
        int id = 0;
        channel.setId(id);
        String name = null;
        channel.setName(name);
        String topic = null;
        channel.setTopic(topic);
        
        Hw1Application.channels.add(channel);
        
        return "redirect:/";
    }

    
}
  

Приложение HW1

 package co2103.hw1;

import java.util.ArrayList;
import java.util.List;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import co2103.hw1.domain.Channel;
import co2103.hw1.domain.Show;

@SpringBootApplication
public class Hw1Application {

    public static void main(String[] args) {
        SpringApplication.run(Hw1Application.class, args);
    }
    public static List<Channel> channels = new ArrayList<>();
    public static List<Show> shows = new ArrayList<>();
    
    public void run(String... args) {
        Channel channel = new Channel();
        channel.setId(0);
        channel.setName("Channel 1");
        channel.setTopic("Nothing");
        
        Show show = new Show();
        show.setTitle("Show 1");
        show.setProducer("Me");
        show.setCategory("News");
        show.setEpisodes(300);
        
        Show show2 = new Show();
        show.setTitle("Show 2");
        show.setProducer("Me2");
        show.setCategory("News2");
        show.setEpisodes(300);
        
        shows.add(show);
        shows.add(show2);
        
        channel.setShows(shows);
    }

}
  

Channel.java

 package co2103.hw1.domain;

import java.util.List;

public class Channel {
    private int id;
    private String name;
    private String topic;
    private List<Show> shows;
    
    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 getTopic() {
        return topic;
    }
    public void setTopic(String topic) {
        this.topic = topic;
    }
    public List<Show> getShows() {
        return shows;
    }
    public void setShows(List<Show> shows) {
        this.shows = shows;
    }
}
  

Комментарии:

1. Единственными тегами, которые отображаются, являются обычные теги HTML, и ничего больше.

Ответ №1:

в классе Hw1Application ==> метод public void run(строка… аргументы): вам нужно добавить в конце

  channels.add(channel)
  

Потому что в ChannelController.java вы вызвали каналы (которые пусты в w1Application и не настроены) в you @GettingMapping

Ответ №2:

Итак, ответ, который сработал для меня, заключался в реализации CommandLineRunner в моем классе Hw1Application

Hw1Application.java

 @SpringBootApplication
public class Hw1Application implements CommandLineRunner {
....
}