26. maj 2005 - 22:49
Der er
34 kommentarer og 1 løsning
Fejl ved brug af en firePropertyChangeListener
Den siger følgende i compileren, men jeg syntes jeg anvender eksemplet rigtigt. The method addPropertyChangeListener(ScreenLogListener) is undefined for the type kunde opretKunde.java line 25
Annonceindlæg fra Cornerstones
Jeg har følgende filer screenLogListener _______________________________________ package kunde; import java.beans.*; public class ScreenLogListener implements PropertyChangeListener { public ScreenLogListener() { } public void propertyChange(PropertyChangeEvent evt) { System.err.print("Source: " + evt.getSource() + " Property name: " + evt.getPropertyName() + " Old value: " + evt.getOldValue() + " New value: " + evt.getNewValue()); } }
min kunde bean ________________________ //Pakken denne klasse er uder i hirakiet package kunde; import java.beans.*; public class kunde implements java.io.Serializable { //Variabler til klasse kunde. En bean private PropertyChangeSupport propertySupport; int id; String firmaNavn; String adresse; int tlf; String email; int status; //Tom konstruktør uden parameteroverførsler public kunde() { propertySupport = new PropertyChangeSupport(this); } //Konstruktør med parametreoverførsel (Til kunde Id parameteroverførsel) public kunde(int id) { this.id = id; } //Konstruktør med parametreoverførsel (Til fuld kunde) public kunde(int id, String firmaNavn, String adresse, int tlf, String email, int status) { this.id = id; this.firmaNavn = firmaNavn; this.adresse = adresse; this.tlf = tlf; this.email = email; this.status = status; } //Konstruktør med parametreoverførsel (Til funktion af alle kunder) public kunde(int id, String firmaNavn) { this.id = id; this.firmaNavn = firmaNavn; } //Get metoder public int getid() { return id; } public String getfirmaNavn() { return this.firmaNavn; } public String getadresse() { return adresse; } public int gettlf() { return tlf; } public int getstatus() { return status; } public String getemail() { return email; } //Set metoder public void setid(int id) { this.id = id; } public void setfirmaNanvn(String firmaNavn) { String oldId = this.firmaNavn; this.firmaNavn = firmaNavn; propertySupport.firePropertyChange("firmaNavn", oldId, firmaNavn); } public void setadresse(String adresse) { this.adresse = adresse; } public void settlf(int tlf) { this.tlf = tlf; } public void setstatus(int status) { this.status = status; } public void setemail(String email) { this.email = email; } } //afslutne braket for klassen
I min app der egentlig er en servlet vil jeg bare udskrive til konsollen de gamle og nye værdier for firmaNavn, når dette ændres ved opretelse af ny kunde
hvad er opretKunde.java line 25 ?
Det kunne f.eks. være kunde enKunde = new kunde(idIn, firmaNavnIn, adresseIn, tlfIn, emailIn, statusIn);
kunde enKunde = new kunde(kundenId, kundeFirmaNavn, kundeadresse, kundetlf, kundeEmail, status); enKunde.addPropertyChangeListener(new ScreenLogListener()); = linie 112 var det
Den siger det her __________--- The method addPropertyChangeListener(ScreenLogListener) is undefined for the type kunde opretKunde.java line 112
Måske er min kunde.java forkert, men kan ikke se hvorfor?
jeg kan heller ikke se en addPropertyChangeListener metode i kunde klassen
Nej hvor er jeg dum. Men tak for at gøre mig opmærksom på min bøler. Tales arne. Send et svar.
Hvorfor får jeg ikke skrevet noget ud i konsollen efter jeg har tilføjet metoderne. se lige min kunde klasse ________________________________________ //Pakken denne klasse er uder i hirakiet package kunde; import java.beans.*; public class kunde implements java.io.Serializable { //Variabler til klasse kunde. En bean private PropertyChangeSupport propertySupport; int id; String firmaNavn; String adresse; int tlf; String email; int status; //Tom konstruktør uden parameteroverførsler public kunde() { propertySupport = new PropertyChangeSupport(this); } //Konstruktør med parametreoverførsel (Til kunde Id parameteroverførsel) public kunde(int id) { propertySupport = new PropertyChangeSupport(this); this.id = id; } //Konstruktør med parametreoverførsel (Til fuld kunde) public kunde(int id, String firmaNavn, String adresse, int tlf, String email, int status) { propertySupport = new PropertyChangeSupport(this); this.id = id; this.firmaNavn = firmaNavn; this.adresse = adresse; this.tlf = tlf; this.email = email; this.status = status; } //Konstruktør med parametreoverførsel (Til funktion af alle kunder) public kunde(int id, String firmaNavn) { propertySupport = new PropertyChangeSupport(this); this.id = id; this.firmaNavn = firmaNavn; } //Get metoder public int getid() { return id; } public String getfirmaNavn() { return this.firmaNavn; } public String getadresse() { return adresse; } public int gettlf() { return tlf; } public int getstatus() { return status; } public String getemail() { return email; } //Set metoder public void setid(int id) { this.id = id; } public void setfirmaNanvn(String firmaNavn) { String oldId = this.firmaNavn; this.firmaNavn = firmaNavn; propertySupport.firePropertyChange("firmaNavn", oldId, firmaNavn); } public void setadresse(String adresse) { this.adresse = adresse; } public void settlf(int tlf) { this.tlf = tlf; } public void setstatus(int status) { this.status = status; } public void setemail(String email) { this.email = email; } public void addPropertyChangeListener(PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertySupport.removePropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(propertyName, listener); } } //afslutne braket for klassen
det har jeg godtnok svært ved at gennemskue kan du ikke teste din bean i en lille standalone test applikation inden du deployer den i J2EE kontekst ? så må det være noget nemmere at tracke fejlen !
ok setfirmaNavn var skrevet forkert ved ikke om det har en effekt
Virker fint med denne App, men ikke i servletten _________________ /* * Created on 2005-05-26 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package kunde; import javax.swing.*; /* * AccountBoundApp.java * * Created on 6. februar 2005, 19:57 */ /** * * @author andersb */ public class kundeApp { public static void main(String[] args) { kunde kun = new kunde(); kun.addPropertyChangeListener(new ScreenLogListener()); kun.setfirmaNavn("Test1"); String firmaNavn = JOptionPane.showInputDialog(null, "New FIRMANAVN"); while (firmaNavn != null) { kun.setfirmaNavn(firmaNavn); firmaNavn = JOptionPane.showInputDialog(null, "New FirmaNavn"); } } }
og du kigger på det sorte Tomcat eller JBoss console vindue ?
JBoss console ved kundeApp og Tomcat ved servletten
Her er min opretKunde ___________________________________ package kunde; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import db.dbConnect; import java.sql.*; import java.util.ArrayList; public class opretKunde extends HttpServlet { public void init(ServletConfig conf) throws ServletException { super.init(conf); } public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if(action.equals("opretKunde")) { int id = 0; String firmaNavn = ""; String adresse = ""; int tlf = 0; String email = ""; int status = 0; firmaNavn = request.getParameter("firmaNavn"); adresse = request.getParameter("adresse"); String tlfInput = request.getParameter("tlf"); email = request.getParameter("email"); int firmaNavnLenght = firmaNavn.length(); int adresseLength = adresse.length(); int emailLenght = email.length(); int tlfLength = tlfInput.length(); if(firmaNavnLenght <=0 || adresseLength <=0 || tlfLength <=0 || emailLenght <=0 ) { getServletConfig().getServletContext().getRequestDispatcher("/noKundeinfo.jsp").forward(request, response); } else try { tlf = Integer.parseInt(tlfInput); } catch (Exception e) { getServletConfig().getServletContext().getRequestDispatcher("/noNumber.jsp").forward(request, response); } try { dbConnect dbCon = new dbConnect(); Connection con = dbCon.getConnection(); Statement stmt = con.createStatement(); ResultSet kundeIndb = stmt.executeQuery("SELECT tlf FROM kunder WHERE tlf = '" + tlf + "'"); if(!kundeIndb.next()) { kundeIndb.close(); stmt.close(); Statement kundeInsert = con.createStatement(); int tilføjKunde = kundeInsert.executeUpdate ("INSERT INTO kunder (firmaNavn, adresse, tlf, email) VALUES ('" + firmaNavn + "', '" + adresse + "', '" + tlf + "', '" + email + "')"); kundeInsert.close(); Statement newKundeid = con.createStatement(); ResultSet newId = newKundeid.executeQuery("SELECT id FROM kunder WHERE tlf = '" + tlf + "'"); newId.next(); int getIdkunde = newId.getInt(1); newId.close(); newKundeid.close(); ID etID = new ID(getIdkunde); ArrayList idListe = new ArrayList(); idListe.add(etID); Statement getKunde = con.createStatement(); ResultSet kunden = getKunde.executeQuery("SELECT id, firmaNavn, adresse, tlf, email FROM kunder WHERE tlf = '" + tlf + "'"); while(kunden.next()) { int kundenId= kunden.getInt(1); String kundeFirmaNavn = kunden.getString(2); String kundeadresse = kunden.getString(3); int kundetlf = kunden.getInt(4); String kundeEmail = kunden.getString(5); ArrayList kundeOprettet = new ArrayList(); kunde enKunde = new kunde(kundenId, kundeFirmaNavn, kundeadresse, kundetlf, kundeEmail, status); enKunde.addPropertyChangeListener(new ScreenLogListener()); // Her skulle den gerne fange at forskellige værdier bliver ændret og skrive det gamle firmananv og herefter det nye kundeOprettet.add(enKunde); request.setAttribute("kundeOprettet", kundeOprettet); } request.setAttribute("opret", "done"); request.setAttribute("idListe", idListe); con.close(); getServletConfig().getServletContext().getRequestDispatcher("/kundeOprettet.jsp").forward(request, response); } else { Statement getOldkunde = con.createStatement(); ResultSet getkunde = getOldkunde.executeQuery("SELECT id, firmaNavn, adresse, tlf, email, status FROM kunder WHERE tlf = '" + tlf + "'"); getkunde.next(); int idIn = getkunde.getInt(1); String firmaNavnIn = getkunde.getString(2); String adresseIn = getkunde.getString(3); int tlfIn = getkunde.getInt(4); String emailIn = getkunde.getString(5); int statusIn = getkunde.getInt(6); ArrayList kundeOld = new ArrayList(); kunde enKunde = new kunde(idIn, firmaNavnIn, adresseIn, tlfIn, emailIn, statusIn); kundeOld.add(enKunde); request.setAttribute("kundeOld", kundeOld); getServletConfig().getServletContext().getRequestDispatcher("/kundeOld.jsp").forward(request, response); } } catch (Exception e) { System.err.println(e); } } } }
kunde enKunde = new kunde(kundenId, kundeFirmaNavn, kundeadresse, kundetlf, kundeEmail, status); enKunde.addPropertyChangeListener(new ScreenLogListener()); // Her skulle den gerne fange at forskellige værdier bliver ændret og skrive det gamle firmananv og herefter det nye
jo men bliver der ikke oprettet en ny instans af enKunde for hvert kald ? det nytter jo ikke meget at sætte en listener på et objekt som ryger ud af scope og bliver garbage collectet
ArrayList kundeOprettet = new ArrayList(); // opretter array list kunde enKunde = new kunde(kundenId, kundeFirmaNavn, kundeadresse, kundetlf, kundeEmail, status); // <---- opretter kunde enKunde.addPropertyChangeListener(new ScreenLogListener()); // sætter listener på kundeOprettet.add(enKunde); // tilføjer kunde til array list request.setAttribute("kundeOprettet", kundeOprettet); // gemmer array list i request men når requesten er afsluttet så ryger request objet + array list + kunde
ok men hvordan kan jeg illustrerer at hver gang man opretter en kunde så skriver det gamle firmaNavn, samt det nye i tomcat konsollen. Skla nemlig bare vise et eksempel med denne funktion.
Kan jeg flytte det ud i klassen på en snedig måde eller hvordan kan jeg gøre??
en opretKunde servlet kan vel kun udskrive et nyt navn en modificerKunde servlet kan udskrive det gamle og det nye navn hvad med en simpel løsning ? System.err.println før/efter execute af INSERT, UPDATE og DELETE ?
og jeg forsvinder snart ! :-)
Hvordan skal jeg forstå det
Godnat bare glem det. Går nok alligevel
int tilføjKunde = kundeInsert.executeUpdate ("INSERT INTO kunder (firmaNavn, adresse, tlf, email) VALUES ('" + firmaNavn + "', '" + adresse + "', '" + tlf + "', '" + email + "')"); System.err.println("vi har nu indsat " + firmaNavn); uden brug af property listener
og tilsvarende ved update den property listener en smart hvis bean objekterne eksisterer i lang tid hvis f.eks. du cachede alle kunderne i en HashMap som var gemt i application objektet så kunne du lade diverse servlet kald opdatere i den cache og bruge property listener til at styre gem i databasen med
ok hvordan er det nu man laver et array der hvor kun en bestemt type objekter kan indsættes
array med fast størrelse: X[] a = new X[N]; ArrayList dynamisk men uden type check: ArrayList[] a = new ArrayList(); dynamisk med type check Java 1.5 og nyere: ArrayList<X>[] a = new ArrayList<X>(); dynamisk med type check før Java 1.5: MinKlasseSomWrapperArrayList[] a = new MinKlasseSomWrapperArrayList();
Kurser inden for grundlæggende programmering