Nie rozumiem tego frameworka. Z tego co czytam to nie da sie renderowac rest api w tym. Powiedzmy, ze mam wiele grup Group, a w nich wiele uzytkownikow User. Chce po kliknieciu w daną Grupe przejsc do widoku renderujacego wszystkich uzytkownikow tej Grupy. Ogladam ten filmik jakiegos wietnamczyka
I on tam robi tak, ze klikniecie link powoduje przekierowanie do innego widoku z parametrem string, a w tym innym widoku znajduje sie tak jakby nadpisanie zmiennej obiektu napisem z tego parametru
<f:metadata>
<f:viewParam name="cat" value="#{productsByCategory.cat}"/>
</f:metadata>
To ja tez tak probuje zrobic:
index.xhtml renderuje wszystkie grupy oraz link, kazdy z linku przekierowywuje do widoku group.xhtml z innym parametrem bedacym id grupy
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xsi:schemaLocation="http://xmlns.jcp.org/jsf/core">
<f:view>
<h:dataTable value="#{groupController.allusers}" var="b">
<h:column>
<h:outputLabel value="#{b.name}"/>
<h:link outcome="group.xhtml" value="#{b.id}" includeViewParams="true">
<f:param name="group" value="#{b.id}" />
</h:link>
</h:column>
</h:dataTable>
</f:view>
</html>
Oto widok group.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
xml:lang="en" lang="en">
<ui:composition template="template.xhtml">
<ui:define name="metadata">
<f:metadata>
<f:viewParam name="group" value="#{usersByGroup.id}"/>
</f:metadata>
</ui:define>
</ui:composition>
<h:body>
<h:outputText value="users in #{usersByGroup.id}:"/>
<h:outputText value="users in #{usersByGroup.users.size}:"/>
<h:dataTable value="#{usersByGroup.users}" var="p">
<h:column>
<h:outputText value="#{p.name}"/>
</h:column>
</h:dataTable>
</h:body>
</html>
Ten obiekt usersByGroup jest zerzniety z tego obiektu od wietnamczyka, jego
jedynym zadaniem jest pobranie parametru z widoku oraz uzycie go do wywolania
metody serwisu ktora pobiera wszystkich uzytkownikow grupy o danym id
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import java.util.List;
@ManagedBean
@RequestScoped
public class usersByGroup {
private String id;
public usersByGroup(){}
public List<User> getusers() {return userservice.getAllusersFromGroup( Long.parseLong(id));}
public String getId() {return id;}
public void setId(String id) {this.id=id;}
}
Metody sie swieca w intelij, wiec wiem ze zostaje wykonywane. Potem w serwisie
wiadomo, polaczenie z baza danych pobranie rezultatow itp
package services;
import jdk.jfr.Name;
import models.Group;
import models.SessionUtils;
import models.User;
import org.hibernate.Session;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.Query;
import java.util.List;
@Named
public class UserService {
private static Session session=SessionUtils.getSession();
private static Group Group;
public static List<User> getAllUsersFromGroup(long id) {
Group=session.get(Group.class, id);
return Group.getUsers();
}
}
package models;
import lombok.Data;
import javax.persistence.*;
import java.util.List;
import java.util.Set;
@Data
@Entity(name = "Group")
@Table(name="Group")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@Column
private String shorter;
@OneToMany(mappedBy = "Group")
private List<User> Users;
}
package models;
import lombok.Data;
import javax.persistence.*;
import java.sql.Timestamp;
@Data
@Entity(name="User")
@Table(name = "User")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column
private String imagefilename;
@Column
private String name;
@Column
private String content;
@Column
private Timestamp User_time;
@ManyToOne
@JoinColumn(name="Group_id",nullable = false)
private Group Group;
}
Niestety widok group.xhtml wyglada tak ze renderuje sie <h:outputText value="users in #{usersByGroup.id}:"/>
, ale nic poza tym. Tak jakby usersByGroup.users bylo nullem. Sam serwis getById wiem ze na pewno dziala poprawnie, bo dziala z GETa