Как обновить thymeleaf когда обновился список
Я теперь учу SpringMVC, соединил программу с firebase realtime database. Данные отправлять научился а от с приемом есть трудности.
- ValueEventListener работает асинхронно, поэтому сначала выполняется весь код и в контроллере срабатывает return "home", а потом доходять данные с базы данных, и в thymeleaf отправляется пустой список. Callback функцию я использовал - не помогло.
- Когда данные в realtime database обновляются срабатывает ValueEventListener. Можно как то обновленный список передать в thymeleaf не обновляя страницу? Я хочу сделать что-то на подобии чата, где в бд появляется новая запись, и в участниках чата должно появляться новое сообщение не обновляя страницу.
Как мне эти две вещи реализовать?
Код:
Controller:
@Controller
public class MainController {
@Autowired
MainService service;
@GetMapping("/")
public String gotohome(Model model){
ArrayList<Msg> arrayList = service.one_more();
model.addAttribute("str", arrayList);
return "home";
}
}
MainService
@Service
public class MainService {
public ArrayList<Msg> one_more(){
ArrayList<Msg> arrayList = new ArrayList<>();
getText(new FBcallback() {
@Override
public void callback(ArrayList<Msg> list) {
for (int i = 0; i < list.size(); i++){
arrayList.add(list.get(i));
}
}
});
return arrayList;
}
public void getText(FBcallback callback){
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
ArrayList<Msg> arr = new ArrayList<>();
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
callback.callback(arr);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
home.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div th:each="el : ${str}">
<p th:text="${el.author}"></p>
</div>
</body>
</html>
Msg.java
public class Msg {
String author;
String msg;
public Msg(String author, String msg) {
this.author = author;
this.msg = msg;
}
public Msg() {
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}