JSF, Facelety i wywoływanie metod

0

Witam
Mam następujący problem: chcę wywołać funkcję javy za pomocą commandbuttona umieszczonego na stronie jsf w szablonie faceletu. Chodzi o to, aby po kliknięciu w przycisk wykonywać kod zawarty w funkcji teraz() (upraszczając problem).

Komponent zarządzający:


@ManagedBean
@SessionScoped
public class Subskrybcja {

Wiadomosc opinie = new Wiadomosc();

public String teraz() {
        
        opinie.zapisz("jakis tekst");       
        return null;
        
    }
}

klasa zapisująca dane w pliku


public class Wiadomosc {
    
    public void zapisz(String tekst) {  
            
        try {
            
            File baza = new File("C:\\wiadomosc.txt");               
            FileWriter pisarzPliku = new FileWriter(baza, true); 
            BufferedWriter pisarz = new BufferedWriter(pisarzPliku);
            pisarz.write(tekst);
            pisarz.close(); 
    
        } catch (IOException e) {
        
            e.printStackTrace();
        
        }
   
    }
    
}

Kod na stronie JSF


<h:commandButton type="button" id="przycisk" action="#{subskrybcja.teraz}" value="Przycisk"></h:commandButton>

 

Po kliknięciu w przycisk nic się nie dzieje. Testowałem różne możliwości m.in. getTeraz, setTeraz, zmieniałem zasięg na @RequestScoped i nic; onclick="#{subskrybcja.teraz}" <- to zadziałało, ale kod wykonała się przy załadowaniu strony a nie po kliknięciu w przycisk.
A może trzeba użyć listenera ?? sam już nie wiem

Co robię nie tak? Help!

0

Czy ustawileś swój backing bean w faces-config.xml?

0

Plik faces-config.xml wygląda mniej więcej tak:


<?xml version='1.0' encoding='iso-8859-2'?>

<faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">

<managed-bean>
    <managed-bean-name>subskrybcja</managed-bean-name>
    <managed-bean-class>pl.sklepinternetowy01.beans.Subskrybcja</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

</faces-config> 

0

z


<h:commandButton type="button" id="przycisk" action="#{subskrybcja.teraz}" value="Przycisk"></h:commandButton>

 

usun type="button"


<h:commandButton id="przycisk" action="#{subskrybcja.teraz}" value="Przycisk"></h:commandButton>

 

automatycznie taki input element jest typu submit. Dzieki temu wysyla sie formularze. Definicje managed-bean w faces-config.xml sa nie potrzebne. Zrobiles to juz w samej klasie dzieki annotacjom. Mozesz tez uzyc actionListener zamiast action, w tym przypadku jest to bardziej pasujace.

0

Niestety nie pomogło, dalej przycisk nie reaguje. Próbowałem także zmieniać typ zwracanej przez metodę zawartości na return "tekst" lub return ""; ale to nie to.

0

to na pewno dziala, musisz miec cos w kodzie pomieszane. Przeslij cala aplikacje, nie wiem teraz co tam jeszcze pozmieniales.

0

No więc aplikacja składa się ze strony newjsf.html (dostępnej po wpisaniu na http://localhost:8080/SklepInternetowy01/faces/newjsf.xhtml) o treści:

<?xml version='1.0' encoding='iso-8859-2' ?>
<!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:h="http://java.sun.com/jsf/html">
    
    <h:head>
        
        <title>Facelet Title</title>
        
    </h:head>
    
    <h:body>
        
        <h:commandButton id="przycisk" action="#{subskrybcja.teraz}" value="Przycisk"></h:commandButton>
        
    </h:body>
    
</html>

Z klasy zapisującej dane do pliku (pełna treść):

package pl.sklepinternetowy01.beans;

import java.io.*;

public class Wiadomosc {
    
    public void zapisz(String tekst) {  
            
        try {
            
            File baza = new File("C:\\wiadomosc.txt");               
            FileWriter pisarzPliku = new FileWriter(baza, true); 
            BufferedWriter pisarz = new BufferedWriter(pisarzPliku);
            pisarz.write(tekst);
            pisarz.close(); 
    
        } catch (IOException e) {
        
            e.printStackTrace();
        
        }
   
    }
    
}

Klasy komponentu(bean), w której znajduje się metoda teraz()

package pl.sklepinternetowy01.beans;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;

@ManagedBean
@SessionScoped
public class Subskrybcja {
    
    private String imie;
    private String nazwisko;
    private String firma;
    private String adres;
    private String mail;
    private String wiadomosc;

    Wiadomosc opinie = new Wiadomosc();
    
    
    
    
    public String teraz() {               //Dlaczego to nie działa???????????
        
            opinie.zapisz("tekst");       

        return null;        
    }
    
    
    public String getNazwisko() {
        return nazwisko;
    }

    public void setNazwisko(String nazwisko) {
        this.nazwisko = nazwisko;
    }

    public String getImie() {
        return imie;
    }

    public void setImie(String imie) {
        this.imie = imie;
    }

    public String getFirma() {
        return firma;
    }

    public void setFirma(String firma) {
        this.firma = firma;
    }

    public String getAdres() {
        return adres;
    }

    public void setAdres(String adres) {
        this.adres = adres;
    }

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    public String getWiadomosc() {
        
        return wiadomosc;
    }

    public void setWiadomosc(String wiadomosc) {
        this.wiadomosc = wiadomosc;
    }
    
    public void validateMail(FacesContext ctx, UIComponent cmp, Object value) throws ValidatorException {
        String malpa = (String) value;
        if(malpa.indexOf("@") < 0 ) {
            FacesMessage msg = new FacesMessage("Niepoprawny email (wstaw @)");
            throw new ValidatorException (msg);
       
        }
    
    }
           
}

Pliku web.xml

<?xml version="1.0" encoding="iso-8859-2"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee resources/web-app_2_4.xsd">
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>login-haslo</servlet-name>
        <servlet-class>pl.sklepinternetowy01.web.Logowanie</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>login-haslo</servlet-name>
        <url-pattern>/log.do</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>rejestr</servlet-name>
        <servlet-class>pl.sklepinternetowy01.web.Rejestracja</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>rejestr</servlet-name>
        <url-pattern>/sing.do</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>kasa</servlet-name>
        <servlet-class>pl.sklepinternetowy01.web.Kasa</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>kasa</servlet-name>
        <url-pattern>/check.do</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>zakupy</servlet-name>
        <servlet-class>pl.sklepinternetowy01.web.Koszyk</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>zakupy</servlet-name>
        <url-pattern>/cart.do</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>faces/index.html</welcome-file>
    </welcome-file-list>
    <session-config>
        <session-timeout>
            60
        </session-timeout>
    </session-config>
</web-app>

oraz zewnętrznego pliku wiadomosc.txt zlokalizowanego na dysku C:

0

Opis podobnego problemu znalazłem na JavaRanch:

http://www.coderanch.com/t/212314/JSF/java/action-method-not-invoked

tyle, że tam też pozostał on nie rozwiązany
tak jak i tu:

http://4programmers.net/Forum/Java/142220-Jsf-_nie_dzialajace_zdarzenia_akcji

0

Formularza brak

0

Co ma do tego formularz? Przecież, nie muszę używać za każdym razem formularza aby przesłać jakieś dane na serwer. Zresztą zdefiniowana wyżej metoda teraz() może doskonale sprawdzać się jako reguła nawigacyjna gdy zwraca inną wartość niż null (np. success, failure), przekazując dane mechanizmowi nawigacji bez udziału formularz.

0

MUSI BYC FORMULARZ!!! Wbuduj <h:form> </h:form> w aplikacje.

0

Rzeczywiście miałeś rację, po dodaniu formularza wszystko śmiga. Chyba jestem skazany na ten znacznik.

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