Problem z renderowaniem zawartości strony xhtml po zalogowaniu (JSF+PrimeFaces JSF+Wildfly 12.0+Java 1.8)

0

Witam,

Może opiszę sedno problemu (na razie bez bez wklejania kodu, żeby nie zaciemniać), może Ktoś z Was spotkał się z podobną sytuacją w praktyce :

  1. wywołuję stronę logowania xhtml
    .
  2. po wprowadzeniu profilu uruchamia się metoda walidacyjna kontrolera bean-a LoginBean : sprawdza czy user istnieje w bazie danych , profil zgodny
    pobiera pełne dane usera (jako obiekt) z bazy danych etc, jeśli OK to :
    .
  3. wypełniam polami usera wartości pól w klasie pomocniczej BuliderAccount poprzez instancję Obiektu
    BuilderAcccount (konstruktor przyjmujący jako argument obiekt User ) tworzonego w klasie LoginBean () / alternatywnie robię to setterami
    .
  4. sprawdzam loggerem w klasie LoginBean nowo utworzony obiekt BuilderAcccount : pola wskazuja na wartości usera pobrane z bazy danych , więc
    OK
    .
  5. na koniec metoda akcyjna jw. zwraca string = stronę prezentującą konto usera account.xhtml
    .
  6. strona renderuje się za wyjątkiem danych personalnych usera , do których to pól odwołują się poszczególne adnotacje JSF w polach account.xhtml
    np. <h:outputText value="#{buliderAccount.firstName}"/> itd dla kolejnych pól.

Problem :

Po wywołaniu strony account.xhtml nie są renderowane dane personalne usera.
.
Dlaczego ?

Pzdr.

0

Podstawowe pytanie - musisz korzystać z JSF?

0

Skoro w LoginBean jest tworzony nowy obiekt BuilderAccount to jak go przekazujesz do frontu? Przypisujesz go jakoś do buliderAccount ? Musisz go jakoś wyciągnąć z LoginBean pierw skoro tam został utworzony.

0
Kermii napisał(a):

Skoro w LoginBean jest tworzony nowy obiekt BuilderAccount to jak go przekazujesz do frontu? Przypisujesz go jakoś do buliderAccount ? Musisz go jakoś wyciągnąć z LoginBean pierw skoro tam został utworzony.

Właśnie.
Pierwotnie z LoginBean wywoływalem metodę w BuilderAccount , tam tworzył em instancje / ustawiłem settery polami usera , przekazywalem zwrotnie do LoginBean nazwę strony account gdzie była zwracana i wywoływana
.
Strona account się renderowala ale bez wartosci pól usera
.
Wiec zmieniłem sposób i instancjacja następowała w LoginBean ale to też nie działa.
.
Gdzie może być zatem błąd?

0
scibi92 napisał(a):

Podstawowe pytanie - musisz korzystać z JSF?

Obecnie już tego nie zmienię.
Ale jakie są przeciwskazania w nauce/ stosowaniu ?

0

Sprawdzałeś logi ?

0
JavaRookie napisał(a):
  1. strona renderuje się za wyjątkiem danych personalnych usera , do których to pól odwołują się poszczególne adnotacje JSF w polach account.xhtml
    np. <h:outputText value="#{buliderAccount.firstName}"/> itd dla kolejnych pól.

Skąd jest brane builderAccount? Jak defniujesz to w pliku?

0
Kermii napisał(a):

Skąd jest brane builderAccount? Jak defniujesz to w pliku?

builderAccount.(nazwa właściwości) jest brane z klasy BuilderAccount. w której definiuję listę pól właściwych odpowiadających polom usera , który został pozytywnie zwalidowany w klasie LoginBean i przekazany w metodzie do klasy BuilderAccount.
.
Pola outputText #{......} w account.xhtml odwołują się właśnie do pól private w klasie BuilderAccount z adnotacją @ViewScope.
.
Czy to nie wystarczy ?
Trzeba jeszcze coś zdefiniować np. w plikach web.xml, lub faces-config.xml ?

(uczę się, stąd niektóre moje pytania/odpowiedzi mogą się wydawać nieprofesjonalne, nieporadne - proszę o wyrozumienie.... )

0

Ale skąd bierzesz instancję klasy BuilderAccount? Sam tworzysz? Bo jeśli tak, to kontener nie rozwiąże poprawnie Twoich wyrażeń #{builderAccount.x} bo nic o tej instancji nie wie.
Może jednak jakiś kod byś pokazał...

0
JavaRookie napisał(a):
scibi92 napisał(a):

Podstawowe pytanie - musisz korzystać z JSF?

Obecnie już tego nie zmienię.
Ale jakie są przeciwskazania w nauce/ stosowaniu ?

poza tym że to stara i słaba technologia to żadnych :D
Jak nie jesteś into REST/ JS to lepszy jakiś Spring MVC z thymeleaf, nie ma jakiś udziwnień

0

Poniżej odpowiednio klasa LoginBean (logowanie, walidacja i wywołanie stromy account.xhtml):

@ManagedBean
@RequestScoped
public class LoginBean implements Serializable, Authorization, UserSessionManager {

private static final String rejectAuthMssg = "student not authorized";


Logger logger = Logger.getLogger(LoginBean.class.toString());


public UserSessionBean getUserSessionBean() {
    return userSessionBean;
}

public void setUserSessionBean(UserSessionBean userSessionBean) {
    this.userSessionBean = userSessionBean;
}

@ManagedProperty("#{userSessionBean}")
private org.primefaces.showcase.view.access.UserSessionBean userSessionBean;

public StudentService getStudentService() {
    return studentService;
}

public void setStudentService(StudentService studentService) {
    this.studentService = studentService;
}

@ManagedProperty(value = "#{studentDatabaseBean}")
private StudentService studentService;


public PasswordEncryptorBeforeDataBaseInput getPasswordEncryptorBeforeDataBaseInput() {
    return passwordEncryptorBeforeDataBaseInput;
}

public void setPasswordEncryptorBeforeDataBaseInput(PasswordEncryptorBeforeDataBaseInput passwordEncryptorBeforeDataBaseInput) {
    this.passwordEncryptorBeforeDataBaseInput = passwordEncryptorBeforeDataBaseInput;
}

@ManagedProperty(value = "#{passwordEncryptorBeforeDataBaseInput}")
PasswordEncryptorBeforeDataBaseInput passwordEncryptorBeforeDataBaseInput;


@EJB
StudentDao studentDao;


public String getLogin() {
    return login;
}

public void setLogin(String login) {
    this.login = login;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public long getId() {
    return id;
}

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

private String password;
private String login;
private long id;


public String login() {

    logger.info(String.format("Login inicjacja, login=%s password: ******", login));

    EntityManager em = studentService.getInstanceOfEntityManager();

    Student student = (new DataBaseSelectorFactory()).findSensitiveData(getLogin(), em, "login");

    try {

        String psswdFromForm = getPassword();

        logger.log(Level.INFO, "Czy pobrano studenta z bazy ? " + student.getLogin() + " : " + student.getPassword() + " : " + student.getId());

        String passwEncrypted = (new PasswordEncryptorBeforeDataBaseInput()).encryptePassword(psswdFromForm);


        if (student == null) {
            userSessionBean.showError("Błąd logowania", "Podany użytkownik nie istnieje.");

            return (null);
        }
        if (!(new LoginBean()).authorize(login, passwEncrypted, student)) {
            userSessionBean.showError("Błąd logowania", "Podano niepoprawne hasło lub login.");

            return (null);
        }

        logger.info("login,password,student validated ; sesssion put and stored correctly in HashMap.");

    } catch (Exception e) {

        userSessionBean.showError("Błąd logowania", "Please contact administrator.");

        logger.log(Level.SEVERE, "LoginBean.login - DaoException (student not found)", e);

        return (null);
    }

    logger.log(Level.SEVERE, "student ma pole imię :" + student.getFirstName());
    logger.log(Level.SEVERE, "student ma pole id :" + String.valueOf(student.getId()));
    logger.log(Level.SEVERE, "student ma pole login :" + student.getLogin());

// to wołam stronę account.xhtml

   ** return (new PersonalAccountBuilder()).buildAccount(student);**

}

public void setFieldsLoggingToZero() {
    setLogin("");
    setPassword("");
}


@Override
public boolean authorize(String login, String passwEncrypted, Student student) {

    logger.log(Level.INFO, "Argumenty w metodzie authorize : login : " + login + " : pswfromForm : " + passwEncrypted + " : hasło z bazy danych : " + student.getPassword());

    if (student.getLogin().equals(login) && student.getPassword().equals(passwEncrypted)) {

        return true;
    } else {
        logger.info(rejectAuthMssg);
        return false;
    }
}

}

Klasa PersonalAccountBuilder (budowa pól dla account.xhtml i zwrot Stringu do LoginBean) :
(W opisie słownym bez kodu - używałem nazwy BuilderAccount - myślałem , że może w ogóle nie
będzie potrzebna)

@ManagedBean
@SessionScoped
public class PersonalAccountBuilder implements Serializable {

public String getFirstName_account() {
    return firstName_account;
}

public void setFirstName_account(String firstName_account) {
    this.firstName_account = firstName_account;
}

public String getLastName_account() {
    return lastName_account;
}

public void setLastName_account(String lastName_account) {
    this.lastName_account = lastName_account;
}

public String getDowosob_account() {
    return dowosob_account;
}

public void setDowosob_account(String dowosob_account) {
    this.dowosob_account = dowosob_account;
}

public String getPesel_account() {
    return pesel_account;
}

public void setPesel_account(String pesel_account) {
    this.pesel_account = pesel_account;
}

public String getIban_account() {
    return iban_account;
}

public void setIban_account(String iban_account) {
    this.iban_account = iban_account;
}

public String getGender_account() {
    return gender_account;
}

public void setGender_account(String gender_account) {
    this.gender_account = gender_account;
}

public String getPostalCode_account() {
    return postalCode_account;
}

public void setPostalCode_account(String postalCode_account) {
    this.postalCode_account = postalCode_account;
}

public String getStreet_account() {
    return street_account;
}

public void setStreet_account(String street_account) {
    this.street_account = street_account;
}

public String getHouseNumber_account() {
    return houseNumber_account;
}

public void setHouseNumber_account(String houseNumber_account) {
    this.houseNumber_account = houseNumber_account;
}

public String getApartmentNumber_account() {
    return apartmentNumber_account;
}

public void setApartmentNumber_account(String apartmentNumber_account) {
    this.apartmentNumber_account = apartmentNumber_account;
}

public String getCity_account() {
    return city_account;
}

public void setCity_account(String city_account) {
    this.city_account = city_account;
}

public String getVoivodeship_account() {
    return voivodeship_account;
}

public void setVoivodeship_account(String voivodeship_account) {
    this.voivodeship_account = voivodeship_account;
}

public String getCounty_account() {
    return county_account;
}

public void setCounty_account(String county_account) {
    this.county_account = county_account;
}

public String getLogin_account() {
    return login_account;
}

public void setLogin_account(String login_account) {
    this.login_account = login_account;
}

public String getPassword_account() {
    return password_account;
}

public void setPassword_account(String password_account) {
    this.password_account = password_account;
}

public String getEmail_account() {
    return email_account;
}

public void setEmail_account(String email_account) {
    this.email_account = email_account;
}

public String getPrefix_account() {
    return prefix_account;
}

public void setPrefix_account(String prefix_account) {
    this.prefix_account = prefix_account;
}

public String getPhone_account() {
    return phone_account;
}

public void setPhone_account(String phone_account) {
    this.phone_account = phone_account;
}

private long id;
private String firstName_account;
private String lastName_account;
private String dowosob_account;
private String pesel_account;
private String iban_account;
private String gender_account;
private String postalCode_account;
private String street_account;
private String houseNumber_account;
private String apartmentNumber_account;
private String city_account;
private String voivodeship_account;
private String county_account;
private String login_account;
private String password_account;
private String email_account;
private String prefix_account;
private String phone_account;


public long getId() {
    return id;
}

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

public String startPersonalPage = "account";


Logger logger = Logger.getLogger(PersonalAccountBuilder.class.toString());


public String buildAccount(Student student) {


    logger.log(Level.SEVERE, "Student przekazany do PersonalAccountBuilder :" + student);


    setId(student.getId());
    setFirstName_account(student.getFirstName());
    setLastName_account(student.getLastName());
    setDowosob_account(student.getDowosob());
    setPesel_account(student.getPesel());
    setIban_account(student.getIban());
    setGender_account(student.getGender());
    setPostalCode_account(student.getPostalCode());
    setStreet_account(student.getStreet());
    setHouseNumber_account(student.getHouseNumber());
    setApartmentNumber_account(student.getApartmentNumber());
    setCity_account(student.getCity());
    setVoivodeship_account(student.getVoivodeship());
    setCounty_account(student.getCounty());
    setLogin_account(student.getLogin());
    setPassword_account(student.getPassword());
    setEmail_account(student.getEmail());
    setPrefix_account(student.getPrefix());
    setPhone_account(student.getPhone());

    logger.log(Level.SEVERE, "PersonalAccountBuilder ma pole imię :" + getFirstName_account());
    logger.log(Level.SEVERE, "PersonalAccountBuilder ma pole email :" + getEmail_account());
    logger.log(Level.SEVERE, "PersonalAccountBuilder ma pole id_account :" + String.valueOf(getId()));


    return startPersonalPage + "?faces-redirect=true" + "&includeViewParams=true";

}

}

Logi nie wykazują żadnych błędów , w loggerach są odpowiednie wartości pół obiektów : personalAccountBuilder oraz student.

?

0
scibi92 napisał(a):
JavaRookie napisał(a):
scibi92 napisał(a):

Podstawowe pytanie - musisz korzystać z JSF?

Obecnie już tego nie zmienię.
Ale jakie są przeciwskazania w nauce/ stosowaniu ?

poza tym że to stara i słaba technologia to żadnych :D
Jak nie jesteś into REST/ JS to lepszy jakiś Spring MVC z thymeleaf, nie ma jakiś udziwnień

GDYBY kolega w ogóle się uczył JSF z jakiegoś rozsądnego źródła. Ale widzę wyłącznie wrzuca słówka w googla, w poprzednim wątku szukał SessionBean i .... znalazł w primefaces. Pracowicie wkleja jakieś deprecated sprzed dwudziestu lat itd...

Moim zdaniem JSF>2.1 z CDI nie jest głupi, a czy jest na czasie się go uczyć ... nie powiem "tak", nie powiem "nie". Do jakiś "biznesówek" intensywnie edytujących dane jest niezły.
Przy uporze i chaosie kolegi to JSF jest najmniejszym problemem

0

" POZORNIE wygląda jak kod ze wzorcami, warstwami, jakięś Service, jakieś Buildery, mądre nazwy - w rzeczywistości wypruwasz wnętrzności ze wszystkiego łącznie z bebechami primefaces i kwiatkami jak EntityManager em = studentService.getInstanceOfEntityManager(); "

Nie jest z wzorców
.
Do tego kroku ( z "account.xhtml") wszystko działa dobrze tzn. rejestruje użytkowników w bazie mySQL, posiada zaawansowane walidacje np IBAN, PESEL, dow.osob, itd. wykonuje update aktywacji użytkownika na liście, wyświetla listę użytkowników
.
Musi być "coś" czego jeszcze nie wiem.
..i nie noszę urazy : każda Wasza uwaga jest cenna.

0
AnyKtokolwiek napisał(a):
scibi92 napisał(a):
JavaRookie napisał(a):
scibi92 napisał(a):

GDYBY kolega w ogóle się uczył JSF z jakiegoś rozsądnego źródła.

JavaServer Faces 2.2
Mistrzowskie programowanie
aut. Anghel Leonard z 2017 roku
.
Thinking in Java Bruce Eckel edycja polska wydanie IV.

1
JavaRookie napisał(a):

Poniżej odpowiednio klasa LoginBean (logowanie, walidacja i wywołanie stromy account.xhtml):

return (new PersonalAccountBuilder()).buildAccount(student);

Coś takiego oznacza, że na chwilę tworzysz obiekt PersonalAccountBuilder, wypełniasz go danymi z obiektu student, po czym natychmiast porzucasz go i pozwalasz mu zniknąć pod miotłą Garbage Collectora.
Widzę, że PersonalAccountBuilder jest beanem JSF, więc spróbuj go wstrzyknąć do swojego LoginBeana jakoś tak:

@ManagedProperty("#{personalAccountBuilder}")
private PersonalAccountBuilder personalAccountBuilder;

i w miejscu zacytowanej wcześniej linii wywołać na nim:

personalAccountBuilder.buildAccount(student);

Wtedy w swoim xhtmlu powinieneś móc się do niego odwoływać tak:

<h:outputtext value="#{personalAccountBuilder.firstName_account}" />

W pierwszym poście w tym wątku napisałeś, że próbowałeś tak:

<h:outputtext value="#{buliderAccount.firstName}" /> <!-- WRONG -->

Więc słowo wyjaśnienia - Twój bean, nawet kiedy już pojawi się w kontekście, ani nie nazywa się builderAccount (nie nadałeś mu żadnej nazwy explicite, więc ma domyślną nazwę pochodną od nazwy jego klasy), ani nie ma atrybutu firstName (mam nadzieję, że rozumiesz dlaczego).

Ale tak poza wszystkim - to naprawdę zły kod jest.

0

Bardzo Ci dziękuję za wskazówkę ( Jesteś Mistrzem ! )
.
Teraz funguje !
.
Z małą uwagą, co wyszło mi na adnotacjach : klasa LoginBean musi być @RequestScoped, a PersonalBuilderAccount musi być @SessionScoped.
Przy ustawieniach LoginBean = ViewScoped nic nie wyrenderuje
.
Jak widać zadawanie pytań na tym forum ma sens.

0
Wielki Ogrodnik napisał(a):

Ale tak poza wszystkim - to naprawdę zły kod jest.

..wiem, ale po 2 miesiącach nauki trudno chyba o coś lepszego.
Początki są zawsze trudne i 'jak po grudzie'.

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