jak pisać klient w JSF?

0

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

1
  1. Napisz, że na pewno musisz. JSF tak naprawdę nikt nie rozumie, a najbardziej nie ogarniają ludzie, którzy go promują (czyli architekci, którzy największy kod w jsf co napisali to było hello world).
  2. Metody sie swieca w intelij, wiec wiem ze zostaje wykonywane. ? ale, że jak ?? to, że się świecą, to znaczy pewnie, że są referowane - to nie znaczy, że wykonane
  3. Tym niemniej - zasadź tu debug:
public List<User> getusers() {return userservice.getAllusersFromGroup( Long.parseLong(id));}

Ewentualnie przy pomocy D.U.P.A debuggingu wyświetl jakie jest id, oraz co zwraca serwis.

  1. Sam serwis getById wiem ze na pewno dziala poprawnie, bo dziala z GETa albo nie wkleiłaś tego kodu, albo magia, bo nie masz żadnego GET w tym kodzie.
1

Może zamiast przekuwać podkowy na miecze poszukaj kursu "JSF rest client"?

albo "jsf rest service", bo w sumie nie do końca wiem czego szukasz...

1
lambdadziara napisał(a):

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.

Też jestem zdzwiony, że w 2020 padło takie pytanie.

Co do użytkowników w grupach, to w Primefaces są hiper-drzewka. Nigdy nie używałem, ale są.

lambdadziara napisał(a):
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;

Na mix importów JPA, ogólnie EE, i hibernate mi się zaświeca pomarańczowe światełko.
Wieki temu były jakieś powody, przez JPA nie było dostępu do czegoś, ale ztcw zostało to nadgonione

Edit: timestamp bym robił w JPA inaczej

0

dupadebugging: metoda getUsers zostaje wykonana, lista userow nie jest pusta, kazdy user posiada niepusta wartosc content. Jednak ta wartosc nie zostaje drukowana w stronie jsf. Zostaje wydrukowana tylko pierwsza linijka <h:outputText value="Users in #{usersByGroup.getUsers.size}:"/> juz nie zostaje wydrukowane choc przez dupa debug wnioskuje ze size tej Listy wynosi 1

<f:view>
    <h:outputText value="Users in  #{usersByGroup.id}:"/>
    <h:outputText value="Users in  #{usersByGroup.getUsers.size}:"/>

    <h:dataTable value="#{usersByGroup.getUsers}" var="p">
        <h:column>
            <h:outputLabel value="#{p.getContent}"/>
        </h:column>
    </h:dataTable>
</f:view>

PS dodalam adnotacje @named do klasy UsersByGroup i teraz cos sie zmienilo bo strona nie renderuje sie w ogole, dostaje errora Caused by: java.lang.NumberFormatException: null
at java.base/java.lang.Long.parseLong(Long.java:670)
at java.base/java.lang.Long.parseLong(Long.java:832)

2

Ok.
zamiast
#{usersByGroup.getUsers.size}:"/>
wstaw
#{usersByGroup.users.size}:"/>

i analogicznie .content. zamiast .getContent.

1

Tak apropro, jak Ci się udało utworzyć encję Group i odpowiadającą jej tabelkę Group, ja nie umiem, masz magicznego Hibernate i MySql

1 użytkowników online, w tym zalogowanych: 0, gości: 1