Hirdetés

Keresés

Új hozzászólás Aktív témák

  • modder
    aktív tag

    És ez így is van.

    class Termek{
    private String nev;
    private double ar;
    private double menny;

    public Zoldseg(String nev, double ar) {
    this.nev = nev;
    this.ar = ar;
    menny = 0.0;
    }

    public String getNev() {
    return nev;
    }

    public double getAr() {
    return ar;
    }

    public double getMenny() {
    return menny;
    }

    public void setMenny(double menny) {
    menny += menny;
    }

    }

    public class Raktar {
    Vector<String> aru = new Vector<String>();

    public void felvitel() {
    String nev = Console.readLine("Kérem adja meg az áru nevét: ");
    Termek aru = new Temek(nev, 0.0);
    if (zoldsegek.contains(aru)) {
    System.out.println("Az áru már létezik!");
    return;
    }
    double ar = Console.readDouble("Adja meg az áruárát: ");
    double menny = Console.readDouble("Adja meg az áru mennyiségét (kg): ");
    aru.add(new Termek(nev, ar));
    }

    A Termek osztály még nincs kész és valszeg nem is jó.

    Te minket itt át akarsz verni ezzel a kóddal!

  • modder
    aktív tag

    Köszönöm a tanácsokat. :R Igen, érdekel komolyabban a programozás. Amúgy a tanárnőnk is mindig mondja, hogy a tervezés egy nagyon fontos szempont, én is így gondolom, csak adatbázisokhoz még nem sok közöm volt, pont azért is próbáltam ki a vizsgaprogramban. Nem gondoltam, hogy ennyire szerteágazó az adatbázisok világa, de legalább ez a kis fejlesztés erre is ráébresztett. :)

    Az adatbázisok nagyon kemény állatok. Külön tudomány.

  • modder
    aktív tag

    Azért mert sokkal jobba támogatottsága. Ha kijön valami új technológia, és kellene hozzá valami IDE-támogatás, akkor az az alap, hogy eclipse-hez megírják, míg netbeans-hez néha. És akkor sikerült távol maradni a flame-től

    Egyébként szerintem is tendencia, hogy Eclipse-et többen is használják, mint platformot. Előbb találok plugint egy technológiához eclipse-re, mint netbeansre. Példának okáért Activiti.org BPMN designer, vagy mondjuk Android SDK

  • modder
    aktív tag

    Mi az az elv amiért nem használsz netbeanst? Én eclipse-es vagyok, de van hogy IDE flame warba kerülök a netbeanses haverommal, és egyikünk se tud értelmes érveket felhozni. :D Azt észrevettem, hogy a tapasztalt java fejlesztők kerülik a netbeanst, helyette intellij ideát, vagy eclipset használnak, de a miértre nem tudom a választ.

    mert a netbeans egy sz*r :D

  • modder
    aktív tag

    Egy kis érdekességként beteszed ide egy "fejtörőt". A lényeg az lenne, hogy mindenki fordító és netes keresgélés nélkül oldja meg a saját tudásából és írja be, hogy mit írna ki a program. Mindenkinek a saját lelkiismeretére bízom, hogy betartja e a játékszabályokat. Pár nap után beírom a helyes eredményt, de ha nagyon triviális és mindenki tudni fogja, akkor elnézést.

    (Kattintásra nagyobb lesz)

    1704
    6709

  • modder
    aktív tag

    Egy kis érdekességként beteszed ide egy "fejtörőt". A lényeg az lenne, hogy mindenki fordító és netes keresgélés nélkül oldja meg a saját tudásából és írja be, hogy mit írna ki a program. Mindenkinek a saját lelkiismeretére bízom, hogy betartja e a játékszabályokat. Pár nap után beírom a helyes eredményt, de ha nagyon triviális és mindenki tudni fogja, akkor elnézést.

    (Kattintásra nagyobb lesz)

    Én első blikkre azt mondanám, hogy a tranziens adattagot nem fogja egyedül kiírni a fájlba. A static mellett és ellen is szólna érv, most azt, hogy azt kiírja a fájlba, mert miért ne, aztán vissza is olvassa :D

    szerk: tévedtem, a statikus tagot nem írja ki

  • modder
    aktív tag

    Szerintem, nem.
    Gyárilag csak olyanok vannak ott, amiket valóban kerülnénk programunk futásakor. Ezek a kivételek szinte bármelyik programsornál előfordulhatnak, míg a többi csak jól behatárolható helyeken (pl. IOException) De persze megint tudom a kivételt is, hisz sokszor tudatosan használjuk őket. Pl. egy többszöri if (x == null) vizsgálat helyett hagyjuk, hogy beszaladjon a NullpointerException-be, ami majd egy alkalmas helyen elkapunk és kezelünk.
    És azt se feledjük, ezek a magyarázatok csak próbálják leírni az egész kivételkezelést!

    mindneki olyan checked exceptionökkel rakja tele a kódját, amilyenekkel akarja. Csak ne nekem kelljen rajta dolgoznom :D

  • modder
    aktív tag

    Hasznossága vitatott, általában nem használják jól

    Hát öööö, Javában kötelező kiírni a dobott kivételt a függvény szignatúrába, mást nem nagyon tehetsz, ha nem akarod a függvényen belül lekezelni.

    Na floatr megelőzött, és teljesen igaza van.

    Nem voltam elég világos. A checked exception-ök hasznosságára gondoltam. És ugye throws-t csak a checked exception-ökre kötelező kiírni. Ezeket ugye aztán nyilván vagy lekezeled, vagy tovább dobod (akkor megint kell egy throws)

    Aki nem hiszi, hogy vitatott kérdés a checked exception-ök használata, az járjon utána :D

    Azért mondtam, hogy sokan nem használják jól, mert rohadt sokszor van egy api vagy lib, és tele vannak a metódusok checked pl. IOException-nel. Na hát annak aztán nagyon sok értelme van.

  • modder
    aktív tag

    Aminek létrehozásakor már a konstruktornak is átadhatod a cause-t. (én így szoktam)

    Igen, bizony, nagyon jól mondod :))

  • modder
    aktív tag

    sziasztok,

    a throws lényegét leírná valaki? mikor használjuk és mit csinál? :)

    a throws kulcsszót (E/3-ban) metódus szignatúrába írjuk az argumentumlista után.

    void doSuchThing(int arg0) throws BusinessException {
    ...
    }

    Javában az Exception osztályból származtatott kivételek checked exceptionök. Ez azt jelenti, hogy ha egy metódus ilyen exceptiont dob, akkor meg kell jeleníteni a metódus szignatúrában a fenti módon, különben fordítási hiba lép fel. Ez elvileg arra jó, hogy a programozó felkészülhet arra, hogy milyen kivételeket generálhat egy metódus, illetve köteles is azt lekezelni, mert ha nem kapod el, vagy dobod tovább, akkor szintén fordítási hiba.

    Hasznossága vitatott, általában nem használják jól

    [ Módosította: Qru ]
  • modder
    aktív tag

    Hát nem tudtam javamra fordítani, de ezt sikerült összetákolnom a beolvasáshoz.

    Mivel a beolvasást feladaton belül csináltam az előző esetben így nem teljesen vagyok tisztában hogy, [itt] mit rontottam el.

    Azért köszönöm a segítséget.

    félreértetted. A konstruktorban csak értéket adsz:
    this.cim = cim;
    this.eloado = eloado;
    this.hossz = hossz;

    A ciklusos részeket ugyanúgy a feladat függvényében csináld meg, ahogy eddig.

    A parse(line) metódus meg annyit csinál, hogy kiveszi a sorból ezt a 3 értéket, és visszaad egy Szamot

  • modder
    aktív tag

    Nekem szimpatikusabb az, ha beolvassa először a memóriába és azon kezd el dolgozni.

    Mindegy szerintem, mert ígyis-úgyis lineáris keresést kell alkalmazni, akár be is olvashatja. Azt szerettem volna demonstrálni, hogy nem feltétlenül kell beolvasni, ami akár hasznos is lehet, ha később az életben ugyanezt a feladatot kapja egy akkora fájllal, amit már nem illik beolvasni a memóriába.

  • modder
    aktív tag

    Sziasztok.

    Kezdő programozó vagyok.

    Szeretném segítségeteket kérni ebben a feladatban.

    Összeállítottunk egy zenelejátszási listát, amelyben N zeneszám van. A listában a lejátszás sorrendjében szerepelnek az előadók neve (egy szó), a dal címe (egy szó) és a hosszúsága másodpercekben. (Ugyanaz az előadó, ugyanazzal a dallal csak egyszer szerepel.)
    a) Szerepel-e egy adott E előadó a listán?
    b) Igaz-e, hogy a lejátszási listán egyre rövidebb számok kerülnek előadásra?
    c) Ha a lejátszási listát végtelenítjük, melyik dalt halljuk kezdéshez képest K másodperc múlva?
    d) Az azonos című dalok közül melyik a leghosszabb?

    Az A-t sikerült megoldanom. (Van már saját Listám ami következő oszlopokat tartalmazza:
    Másodperc | Előadó | Dal) Az első feladatot sikerült tömb nélkül megoldanom. De a többihez kelleni fog, és nem tanultuk hogyan kell több adatsorból álló tömböt tölteni fájlból.

    Előre is bocsánat ha ez nem ide tartozik, de egyedül nem hiszem, hogy megtudnám őket oldani.

    egyszerűbbé teheted az életed, ha csinálsz egy típust a számoknak
    class Szam {
    String eloado;
    String cim;
    int hossz; //masodperc

    public Szam(String eloado, String cim, int hossz) {
    // ertekadas a tagvaltozoknak
    }
    }

    Felteszem, hogy sikerült beolvasnod a sorokat. Biztonság kedvéért http://stackoverflow.com/questions/5868369/how-to-read-a-large-text-file-line-by-line-using-java Ha el akarod őket menteni a memóriában, akkor pl. (pszeudokód)

    List<Szam> szamok = new ArrayList<Szam>();

    while ((line = br.readLine()) != null) {
    Szam aktualisSzam = parse(sor);
    szamok.add(aktualisSzam);
    }

    De elárulom neked, hogy ez egyik feladathoz sem kell.
    B)
    Szam elozoSzam = br.readLine(); // elso sor
    while ((line = br.readLine()) != null) { // tobbi sor
    Szam aktualisSzam = parse(sor);
    if ( elozoSzam.hossz < aktualisSzam.hossz ) {
    // nem igaz
    }
    elozoSzam = aktualisSzam;
    }

    C) hasonlóan, de egy int-ben összegzed a számok hosszát (ha a sorok végére értél, elölről kezded, tehát két ciklust kell egymásba ágyaznod). A ciklusból kilépési feltétel az, a osszHossz >= K. Akkor az abban a ciklusban beolvasott szám lesz a keresett.

    D) Itt már kell egy Map
    Map<String,Szam> perCim = new HashMap<String,Szam>();

    Végigmész a sorokon, és megnézed, hogy az aktuális szám címével van-e szám a mapban. perCim.get(cim) != null. Ha nincs, beteszed.
    Ha van, akkor megnézed, hogy az aktuális hosszabb-e, mint a bentlévő, és a feltételnek megfelelően cseréled.

    Ja, és köszönet, nagyobb nyelvtani hibák nélkül, tagolással, és az írásjelek megfelelő használatával tetted fel a kérdést. Ritkaságszámban megy az ilyen :D

  • modder
    aktív tag

    Mondjuk elsőnek ezen rágd végig magad: [link]
    Vagy az Ansgter Erszébet féle objektumorientált javás könyv (valaki itt pár napja leírta a pontos címét is)

    Azt, hogy miképp teszed magadévá a tudást, miképp szerzel némi gyakorlatot az nem szigorúan java kérdés. Általában egy gyakorlati tudásról elmondható, hogy úgy teszel szert rá, hogy csinálod, csinálod és csinálod. Persze jó, ha az elején van ami/aki vezeti a kezedet.
    Jómagam, amikor a jelenlegi melóhelyemre kerültem nem javáztam semmit sem. Itt egy Java SE tanfolyamot végigültem, miközben már feladatokkal bombáztak. Azóta meg meg ebből élek úgy, hogy közben sok-sok új technikával, technológiával meg kellett ismerkednem. De ezek már mind specifikusan az adott feladathoz kapcsolódóan jöttek elő. Tehát itt már nincsenek konkrétumok. Mindent úgyse fogsz tudni magadévá tenni. De újra mondom, amit az SE tartalmaz abból szinte minden kell, akármerre mész is.

    Annyit hagy kössek bele a félreértések elkerülése végett, hogy nem minden kell, amit a Java SE tartalmaz.
    Ezen a [link]-en a General purpose packages az, amit tényleg tudni kell használni, de Special purpose packages már feladatspecifikus, pedig az is a Java SE része.

    Egy egyszerű példával élve, ha webfejlesztéssel akar valaki foglalkozni, fölösleges magába erőltetnie a Java Swing tudást.

  • modder
    aktív tag

    Akkor kérdezem itt:

    Suliban fél éve tanulunk Java-ban programozni (előző szemeszterekben c,c++ volt már), és ez végre tetszik is, de még nagyon kezdő szinten vagyok.
    Lehet hülyén fog hangzani, de mi mindent kell tudni, mennyit kell gyakorolni, mennyire tapasztaltnak kell lennie ahhoz, hogy egy jobb java-programozói állást találj? Vagy mikor mondhatja az ember magáról azt, hogy "na én java programozó vagyok"? (jöhet saját tapasztalat is akár, tipp, minden...akár pm-ben, akár ide)
    Jelenleg csak a jéghegy csúcsát látom az egész programozásból, nem vagyok még benne eléggé, de el tudnám magamat képzelni az 5. év után, hogy akár programozó legyek, ezért lenne szükségem pár ilyen helyrerázó infóra, pofra, hogy hogy is néz ki ez valójában.
    Ha esetleg tudtok pár jó oldalt vagy akár könyvet ajánlani, jöhet minden :)

    Remélem érthető volt a mondandóm,
    A válaszokat köszi előre is,

    szeretem ezeket a kérdéseket, mert lehet rájuk olyan szép ezoterikus válaszokat adni :D

  • modder
    aktív tag

    Sziasztok!

    Befotózott, gépelt jegyzet pixeleinek javításához kerestem programot, de semmi értelmeset nem találtam, úgyhogy megírom magamnak. Annyi lenne az egész, hogy ha sötét árnyalatú pixelt talál, azt frissíti feketére, ha világosabbat, azt fehérre (a későbbi nyomtatáshoz...). Színes képek vannak, infranview-val próbáltam fekete-fehérre alakítani, de botrányosan xar minőségben csinálta, volt, hogy a fél oldalt kiöntötte feketével, volt, hogy egész szavakat tüntetett el.

    Java-ban milyen osztályt lehet ilyen pixel manipulációra használni? (még nem döntöttem miben írom, de ha nem muszáj nem csinálom assembly-ben :) )
    Előre is köszi a segítséget.

    hát ez elég naivan hangzik. GIMP vagy fotoshop, vagy imagemagick

  • modder
    aktív tag

    Eclipse Ketler, JAVA EE alkalmazásokhoz szánt verzió, új projektnél a Runtime meghatározásánál meg kell adni egy alkalmazásszervert, ami nálam egy Glassfish, letöltöttem a glassfish 4.0-ás verzióját, kéri is a helyét az Eclipse, meg is találja benne a szervert, de itt írja azt a wizard, hogy csak JRE-t talált, egy 1.6-ost ami alapból fent van a gépen, és én adtam hozzá egy 1.7-et de az is csak JRE, így nem enged továbbmenni, mert írja, hogy JDK kell neki.

    printscreen: [link]

    JDK - Java Development Kit - Java programok fordításához szükséges környezet
    Szerintem ebben a JRE is benne van
    http://www.oracle.com/technetwork/java/javase/downloads/index.html

    JRE - Java Runtime Environment - Java programok futtatásához szükséges környezet
    http://www.oracle.com/technetwork/java/javase/downloads/index.html

    Java EE SDK - JDK és/vagy Glassfish
    Itt látod, hogy a négy csomagban mi van benne: lehet JDK-val vagy anélküllel
    Ugye glassfish nélkül nem lehet, mert maga a Glassfish adja a Java EE (Java SE fölötti) runtime-ot.
    http://www.oracle.com/technetwork/java/javaee/downloads/index.html

    Java Glassfish Server - Glassfish + JRE
    Egész biztos vagyok benne, hogy ebben nem lesz JDK, csak JRE
    https://glassfish.java.net/download.html

    Neked melyik kell?
    Ha Java SE programokat akarsz fejleszteni, akkor elég egy JDK. Ha Java EE platformot akarsz fejleszteni, akkor Java SDK (JDK-val vagy anélkül, ha ki akarod tudni cserélni a JDK-t, mert olyan igényeid vannak)

  • modder
    aktív tag

    Sziasztok.

    Kérnék tőletek egy kis segítséget. Szakdolgozatot kell írnom, igazából csak téma választásban vagyok tanácstalan, nincs semmilyen ötletem hogy mégis milyen programot írhatnék. Órákon keresztül böngésztem mindenhol és gondolkoztam ezen a dolgon, de nem jutottam semmire.. :( Nagyon örülnék ha valakinek esetleg lenne ötlete milyen programot valósíthatnék meg. Bármilyen területen mondhattok ötleteket, annyi a lényeg még, hogy legyen egy adatbázis a program mögött.

    Remélem tudtok segíteni. :R

    http://groovy.codehaus.org/Compile-time+Metaprogramming+-+AST+Transformations

    bár ez nem az a tipikus sakkprogram dolog, viszont menő.

  • modder
    aktív tag

    Megpróbálom akkor még egyszer. :R
    Van három osztály:
    A osztály
    B osztály
    C osztály

    A B osztály a háttérben fut, ha kap Blueotoothon keresztül egy XML fájlt akkor C osztályból létrehoz egy új példányt, ami az XML-t parseolja. A C osztály az eredményt egy interfészen keresztül adja át az A osztálynak.

    Ha A osztályból példányosítanám a C osztályt, akkor tudom hogy kellene megoldani(pl a C osztály konstruktorában átvenni az A osztály által implementált interfészt, majd azon keresztül visszaüzenni).
    De mivel itt B osztályból példányosítok ezért nem tudom, hogy hogyan kellene.

    Remélem így világosabb :R .

    Igen, itt a kérdés, hogy A osztályt ki példányosítja. Ha B, vagy már egyébként létre van hozva, és B ismeri, akkor:

    public interface A {
    public void processObject(Object o);
    }

    public interface C {
    /**
    * processXml(String xml, A a) feldolgozza az xml-t, és az eredményt átadja
    * a-nak A#processObject(Object o)-n keresztül
    */
    public void processXml(String xml, A a);
    }

    class B {
    A a;
    public void newXml( String xml ) {
    new C().processXml(xml,a);
    }
    }

    public class CImpl {
    public void processXml(String xml, A a) {
    Object o = parseXml(xml);
    a.processObject(o);
    }
    }

    Ha C-ben még szükséged van A-ra, akkor a C konstruktorában is átadhatod, de ez így tisztább, jobban látni a függőséget. Az eredeti kérdés interfészekre vonatkozott. Azt nem tudod meghatározni interfészekkel, hogy a C#processXml() implementációja mi legyen, ezért JavaDoc-ban szokták definiálni, hogy miylen további felelőssége van egy metódusnak.

  • modder
    aktív tag

    Java Glassfish SSL konfigurálásban tud valaki segíteni?

    A cél az hogy egy Servlet SSL-en fogadni tudjon HTTPS üzeneteket illetve indítani is(egyenlőre kliens hitelesítés nélkül).
    Sima Servletet már csináltam, és Java kliens felől is használtam már Two-way SSL-t.
    Ezen leírás alapján próbálok kicsiholni valamit, de nem sok sikerrel.
    Igazából nem is értem, hogy működik, mert a keystorenak meg kell adni a jelszót, hogy betudja olvasni ha kliensből akarok titkosítani.
    Na mármost, ha a Glassfishben akarok hozzáadni egy keystore-t akkor ott sehol nem kell megadni a keystore jelszavát.

    lehet, hogy webes adminból nincsen rá lehetőség, de emlékeim szerint a domains.xml-ben ott van a default jelszó 'changeit' a keystore definíciójánál

  • modder
    aktív tag

    Sziasztok
    aknakeresőt próbálok csinálni, de elakadtam ott,hogy amikor egy üres mezőre kattintunk akkor a körülötte lévők is benyomódjanak.

    buttonfield[i][j].setActionCommand("0");
    ActionListener al = new MyActionListener(buttonfield[i][j]);
    buttonfield[i][j].addActionListener(al);

    ez történik ha egy darab olyanra kattintunk ami alatt "0" szerepel, azaz nincs körülötte akna, a MyActionListenerben meg így ez történik : if (ae.getActionCommand().equals("0")) {
    t.setText("");
    t.setBackground(Color.lightGray);
    t.setEnabled(false);
    }

    tudom, hogy rekurzívan kéne, csak egyszerűen nem jövök rá, hogy hogyan tudom az első gomb hatására benyomni a többit.
    if (y>0 &&field[y-1][x]==0) tobbitfelfordit(field, y-1, x);
    if (y<width && field[y+1][x]==0) tobbitfelfordit(field, y+1, x);
    if (x>0 && field[y][x-1]!==0)tobbitfelfordit(field, y, x-1);
    if (x<lenght && field[y][x+1]==0) tobbitfelfordit(field, y, x+1);
    }

    és még tovább kéne futnia mivel még az üres mezők utáni mezőnek is fel kéne fordulnia, illetve nemtudom, hogyan kéne leírni h forduljanak ezek fel.

    felfordit(field) {
    // ha nem nulla, vissza is ter, a
    // szomszedokhoz korbeer a rekurziv hivas
    // masik iranybol
    x = field x pozicioja a tombben;
    y = field y pozicioja a tombben;

    if (field.getActionCommand().equals("0")) {
    t.setText("");
    t.setBackground(Color.lightGray);
    t.setEnabled(false);

    // szomszedok felforditasa
    if (y>0)
    felfordit(buttonField[x][y-1]);
    if (y<height-1)
    felfordit(buttonField[x][y+1]);
    if (x>0)
    felfordit(buttonField[x+1][y]);
    if (x<width-1)
    felfordit(buttonField[x-1][y]);
    }
    }

  • modder
    aktív tag

    Köszönöm, már jön is! :)

    ez még elég brutál http://www.visual-paradigm.com/product/?favor=vpuml
    csak fizetős... de harminc napig ingyenes

  • modder
    aktív tag

    Néhány nap leforgása alatt egy nagyobbacska vállalatirányítási rendszer különbözői moduiljaiból és ezek különböző verzióiból >5-tel kell általában valamilyen módon foglalkoznom, fejlesztenem, kódot analizálnom. Ritka az, amikor pár napig egy dologgal tudok foglalkozni. Ezek az alkalmazások általában egyenként is elég nagyok és inhomogének technológiailag, szeretem őket strukturálni. Ha mindent egy workspace-be beletennék, egy (véletlen/kényszerű) teljes rebuild, vagy az eclipse újraindulás, típus újraindexelés, lookup, keresés, fájdalmasabb művelet volna.

    ja, értem.

  • modder
    aktív tag

    Az eclipse nem egy notepad azért, 10 mp kifejezetten jó szerintem. Ha napi 50-szer megnyitod az eclipse-et, ami nem hiszem, hogy jellemző, akkor egy gyorsabb indulással megspórolnál napi néhány percet..
    Nekem van hogy hetekig megy egy workspace-em, nyitva van 5-10 workspace egyidőben.. 10 mp indulás legyen a legnagyobb bajod.
    Túrtam egy linket azért [link], ha gondolod, próbáld ki.

    miért használtok 5-10 workspace-t? főleg egyidőben

  • modder
    aktív tag

    Tudtommal jó eséllyel, ha nem használsz semmit az újabb Servlet API-ból. Azért volt egy-két konfigurációs változás is...

    A legegyszerűbb ha letöltesz egy hatost és megpróbálod, nem sokból tart.

    Más:

    Nekem is lenne egy kérdésem a közösbe.

    Adott egy webalkalmazás WAR csomagban, ami egy properties fájlból konfigurálható (DB elérés, SMTP, útvonalak, stb.). Ezt jelenleg a classpathon tárolom (fájlszinten a WEB-INF/classes alá kerül a Maven által).

    A kérdés egyszerű: hova és hogyan kellett volna tennem ahhoz, hogy ha új verziót adok ki a cuccból, a WAR-ban lévő propfájl ne vágja felül az ügyfél adatait? Nem én üzemeltetem és nyilvánvaló okokból nem kapom meg az ő konfigjukat, amiket a deployolt alkalmazásban módosítottak.

    Gyors megoldásként gondoltam arra, hogy a fájlt kiveszem a WAR-ból, így a Tokcat redeploy nem fog a kinn lévőhöz nyúlni. De mi lett volna a helyes megoldás?

    általános megoldás, hogy kiveszed a WAR-ból, és az alkalmazásodban egy system propertyben definiált útvonalról töltöd be. pl. 'tealkalmazasod.properties=/var/opt/tealkalmazasod/alkalmazas.properties'

    A system property-t beállítod a tomcat konfigurációjában.

  • modder
    aktív tag

    Sziasztok!

    Google Code-ról checkout-oltam egy projektet.(minesweeper-gdx) Hogyan tudom Eclipse-be importálni a projektet?

    Csináltam egy új workspace-t, rámentem a file->import->general->import existing projects into workspace. Kiválasztottam a mappát ahová lementettem, de semmi sem jelenik meg :(

    Ötlet?

    új projekt from source. existing csak akkor működik, ha már van .project fájl a könyvtárban

  • modder
    aktív tag

    nemtudom, csak fórumok alapján a keytoollal generáltam valamit, az létrehozott egy keystore fájlt. De még mindig nem értem az egészet úgyhogy nem tudom mi az a jks, (meg azt sem hogy minek ez a marháskodás egy ssl klienshez). Szervernél még érthető lenne...

    http://en.wikipedia.org/wiki/Public-key_infrastructure

    Mi az a cacerts file:
    http://docs.acl.com/ax/300/index.jsp?topic=/com.acl.ax.admin.help/system_administration/t_importing_certificates_into_the_java_cacerts_file.html

    Ha a java SSL kilensed a default cacerts truststore-t használja, és olyan szerverrel kommunikálsz, ami self-signed certificate-et vagy olyan használ, aminek az aláírója nincsen benne a cacerts fileban, akkor nem tudja hitelesíteni a szervert.

  • modder
    aktív tag

    Akkor most megyek és eltüzelem az eddigi szakirodalmakat amiben a StringBuildert erőltették...

    szép mentés :D

  • modder
    aktív tag

    (#4241) Superhun : sb.replace(0,sb.length,"x"); Tudom nem szép....

    (#4243) modder : Nyilván mindenre azt lehet mondani, hogy "attól függ..."
    Én alapvetően erre a helyzetre akartam reagálni.:
    String s = "egy";
    ...
    s = "ketto"; // innentől kezdve ott ül a memóriában elérhetetlenül, hogy "egy" ami majd egyszer ki lesz takarítva.
    Amíg ez egyszer van addig oké nem nagy érvágás...de alkalmazás szinten már halmozódhat a dolog. Nem törvényszerű nyilván...

    A példa amit írtál az kicsit erőltetett...egy szóval nem mondtam, hogy String helyett általánosan StringBuilder-t kell használni...pláne nem olyan helyzetben amit vázoltál. Ha tudom, hogy lesz egy szövegem ami nem fog megváltozni akkor persze String, de ha valamivel "műveleteket" szeretnék végezni akkor StringBuilder.

    és hogyan olvasod ki az értékét? toString() -gel...

  • modder
    aktív tag

    (#4235) Karma : Ezt jó tudni. Kösz.

    (#4236) Superhun : Oké, de amíg a másik String referencia nélkül ott kallódik memóriában valahol addig egy másik területen újabb memória kerül lefoglalásra az új String esetében. A StringBuilder-nél pedig marad ahol van. Ha szükséges bővíti, ha nem akkor marad amennyi volt. Ez valahogy takarékosabbnak tűnik nekem...Rosszul gondolom?

    Esküszöm, nem értem, mit akarsz mondani Superhun válaszára.

    De pár tény:
    1) A JVM k*rva okos és tele van optimalizációval. Memória allokációnak alig van költsége, persze sok kis objektum lassíthatja a GC-t. Megoldás: arra az objektumra ne veszítsük el a referenciát, amit újra fogunk használni. Ennek megkönnyítésére szoktak memory poolokat implementálni Javában úgy, ahogy C++-ban is. De ezeket elég speckó esetekben szokták használni, amikor a sebesség van mindenek felett.
    2) literálokra referencia mindig ugyanarra a memóriaterületre mutat. for() { String s = "nyorr"; } nem fog új objektumot létrehozni minden egyes iterációban
    3) Olyan mikro-optimalizációról beszélünk, aminél egy adatbázis lekérdezés nagyságrendekkel lassabb: semmi értelme gondolkodni rajta

    Ciklusban String összefűzést StringBuilderrel, mert azt a compiler tudtommal nem ismeri fel, ellenben a "egy" + "ketto" + $valami.toString; kóddal, amit StringBuilderre cserél (vagy StringBuffer, most hirtelen nem emlékszem, melyik a thread-safe)

    Nem látom értelmét String helyett StringBufferben tárolni a stringet.

    Szerk.:
    Közben rájöttem, mit akartál mondani, de elég veszélyes. Ha Stringbuilderben tárolod a stringeket, akkor a StringBuilder mutable, és olyan helyen is megváltoztathatod a String értékét, ahol nem akarod. pl.:

    StringBuilder strTime = getTimeInString();
    page1.setLastVisited(strTime);

    majd később:
    StringBuilder strTime = getTimeInString();
    page2.setLastVisited(strTime);

    no shit, lastVisited szintén frissült page1-re, mert ugyanaz az objektum. Nem hiába találták ki, hogy a String immutable.

  • modder
    aktív tag

    Nekünk pedig 4 éven keresztül azt tanították suliban, hogy ahhoz, hogy valaki jó programozó legyen, előbb algoritmust kell tudni írni, (ami MINDENKÉPP folyamatábra [struktogram]) nyelvfüggetlenül, és, hogy program írás előtt írjuk azt meg, utána kezdünk csak bele a tényleges kódolásba.

    Keresgéltem, találtam is párat, arra voltam kíváncsi, hogy tud-e valaki azokon kívül valami jót :K

    előbb algoritmust kell tudni írni, (ami MINDENKÉPP folyamatábra [struktogram])

    Volt, amikor én is csináltam folyamatábrát olyan problémára, aminek nehezemre esett a megértése, de egyébként az esetek 90%-ában, kigondolsz egy algoritmust, amit egyből le is kódolsz, aztán finomítod, hogy a végén az elvárásoknak megfelelően működjön. Egyből le is tudod tesztelni, hogy működik-e.

    Szóval a gyakorlatban minden problémát folyamatábrával kezdeni fasság.

    Amúgy meg az aknakereső pont olyan egyszerű, mint a faék. Legalábbis generálni:
    Random leteszel aknákat, majd sorba mész az aknamezőn, és minden mezőhöz (ami nem akna), rendelsz egy számot, ami azt jelzi, hogy a közvetlen szomszédai közül hány mezőn van akna. Rettentő nehéz.

    Ami kihívást okozhat, az az aknák eloszlása, hogy szépen csoportosan legyenek.

  • modder
    aktív tag

    Mi a különbség => és >= között?

    Ugyanis mikor ezt írtam:
    x >= 10 && x <= 20
    Semmi gond.

    Viszont itt:
    x => 10 && x <=20
    The operator && is undefined for the argument type(s) int, boolean

    nincs olyan operátor, hogy =>
    (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html)
    mondjuk a hibaüzenet lehetne jobb is

  • modder
    aktív tag

    Aha, most megnéztem a forrást, a Files.copy() metódus ugyanezt csinálja, 8KB bufferrel.

    Valszeg igazatok lehet, viszont akkor nagyon sok kérés érkezhet az OS-hez, ha feltorlódik.

    én azt figyeltem meg régebben, ha total commanderben sok apró fájlt másolok, nagyon visszaesik a teljesítmény pár megabyte-ra.

  • modder
    aktív tag

    Primitíveknél igen, de összetett objektumoknál már számíthat. Főleg, hogy fájl írás/olvasás is van. Mekkora heap van beállítva? Jó lenne tudni, hogy mennyi fájlról van szó. És a buffered streamek használata sem lenne rossz.

    az csak egy referencia, semmit nem számít, hol deklarálod. Akkor lenne értelme, ha az egész streamet újra fel lehetne használni.

    n00n:
    meg kellene nézni, rendesen bezáródnak-e a filehandlerek.
    a close()-okat pedig mindig finally blokkba.

    pl a bytebuffer tömböd tényleg ki lehetne szedni a cikluson kívülre, az lehet, sokat segítene.

  • modder
    aktív tag

    te most éppen miről beszélsz? Nem azt írtam be hogy nem működik, hanem azt hogy nem működik, és mivel van probléma és hogyan...

    infora állított thresholddal nem küld semmit az info-ról, sem warn-ról csak errorról és fatalról.
    Ugyan olyan threshold beállítással fájlba minden kiír, mailba viszont nem.

    Ne csak kötekedj, olvasd el miről van szó.

    Jó, nem fogok leállni veled vitázni, csak legközelebb légyszi ne csak azt írd, hogy nem megy, hanem a körülményeket is, főleg ha segítséget vársz

  • modder
    aktív tag

    ezen már rég túlvagyunk, és nincs is szükség az ott írtakra...
    most ott tartunk hogy fatal-on és error-on kívül miért nem hajlandó mást is küldeni, ha egyszer a threshold info-n van.

    http://www.tutorialspoint.com/log4j/log4j_logging_levels.htm

    For the standard levels, we have ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF

    Ha a thresholdot INFO-ra teszed, akkor a DEBUG-ot nem engedi tovább.

    Amúgy meg RTFM és azon nem javítasz a helyzeteden, hogy sértődötten beírod, hogy "nem működik", csak a 3. rákérdezésre adsz valami infót, amiből az ember leszűrhet valamit.

  • modder
    aktív tag

    Sziasztok.
    Tudtok javasolni akár online, akár könyv formában olyan Java leírást ami a konkurenciáról szól részletesen? Érdekelne, hogy bizonyos feladatokat, hogy lehetne megoldani multi-threadelve.
    A Java Concurrency In Practice már felkeltette a figyelmemet, de nem tudom mennyire lehet friss anyag. :F
    Előre is köszönet. :R

    Helló, Java 6-ban jött be nagyon sok minden, ami megkönnyíti a több szálú programok fejlesztését, és a Java Concurrency in Practice ezt taglalja. Nagyon jó alap. jó tömény könyv. Persze Java 7-ben biztosan volt pár feljesztés a több szálú programozás terén, de közel nem annyi, mint amit a hatos verzóba nyomtak bele. Én csak ajánlani tudom. De amúgy kétszer el kell olvasni, hogy megragadjon, plusz nem árt, ha ki is próbálod amiket ír, mert nagyon sok tudásanyag van benne, amit könnyű elfelejteni.

  • modder
    aktív tag

    A következőt nem értem a Java alapú webalkalmazások szűrőjénél, hogy miért kapja meg a legutolsóként alkalmazott szűrő az előállított választ és megy végig fordított sorrendben a szűrőkön? Lehet alap dolog, de nem tiszta :/

    "A kérés mindig először a webkonténerhez érkezik, amely előfel-
    dolgozást végezhet a kérésen. Ezután a webkonténer ellenőrzi a kérés
    URL alapján, hogy kell-e szűrőt alkalmaznia a kérésre. Az URL mintára
    illeszkedő szűrőket a webkonténer egymás után alkalmazza a kérésre.
    Ha mindez hibamentes volt, akkor a szűrők után átkerül a kérés a cél
    webkomponenshez, a mi esetünkben ez most egy szervlet. A szervlet
    az előállított választ a legutolsóként alkalmazott szűrőhöz továbbítja,
    majd végigmegy fordított sorrendben a szűrőkön, és végül visszakerül a
    webkonténerhez." [forrás]

    http://viralpatel.net/blogs/tutorial-java-servlet-filter-example-using-eclipse-apache-tomcat/

    A filter kódjában chain.doFilter(req, res); a következő filtert hívja meg, legvégül a szervletet. Buta megfogalmazás. Nem végig megy fordított sorrendben a szűrőkön, egyszerűen visszatér mindegyik szűrő chain.doFilter(req, res); metódusával, így tehát amit ez után a sor után írsz, az mindig a sorban következő szűrő (legvégül a szervlet) meghívása UTÁN történik.
    Így lehet az előállított választ módosítani.

  • modder
    aktív tag

    [link]

    Idézek a saját hozzászólásomból:

    Nyilvánvalóan nem hiba az ArrayList<?> deklaráció, de a statikus típus interfészként deklarálása good practice. Az implementáció egyszerű változtathatósága miatt. Nem is az osztályváltozókban van komolyabb jelentősége, hanem a getter/setter metódusoknál.

    És még valami. Amíg magadnak vagy egy kvázi zárt csapatban dolgozol, addig nincs ezzel gond. Amint pl. API-t kezdesz írni, akkor csak interface. És a doksiban kell leírni a runtime típust.

    Oké, de a vitatott kódban az ArrayList pont csak az objektum belső használatára van.

  • modder
    aktív tag

    Sosem tudhatod, hogy mikor kell implementáció típust cserélni. Jobb mindenre felkészülni.

    Ezt a témát pár száz hsz-sal korábban már végigjártuk, és én még mindig tartom magam ahhoz, hogy osztályon belül nyugodtan lehet konkrét implementációt deklarálni pl.: ArrayList<T>. Azért van ennyiféle implementáció, mert mindegyik másra jó. Semmi haszna nem lenne, ha az ember nem tudná kihasználni a lehetőségeit.

    Ugyanakkor a burkoló osztálynak nem szabad visszaadnia konkrét List<T> implementációt. ahhoz nagyon jó ok kell.

  • modder
    aktív tag

    Ja valami kód is:
    package com.corejsf;

    public class User {
    private String name;
    private String password;

    public User(String name, String password){
    this.name = name;
    this.password = password;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public String getPassword() {
    return password;
    }

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

    package com.corejsf;

    import java.io.Serializable;
    import java.util.*;
    import javax.faces.bean.*;

    @ManagedBean(name="userbean")
    @SessionScoped
    public class UserBean implements Serializable{
    private String name;
    private String password;
    private String userListToString;
    private static List userList = new ArrayList();
    private User user;

    public String addUser(){
    user = new User(name, password);
    userList.add(user);
    userListToString = userList.toString();
    if (userList.contains(user)){
    return "thankYou";
    }
    else {
    return "loginFail";
    }
    }

    public String loginUser(){
    user = new User(name, password);
    userListToString = userList.toString();
    if(userList.contains(user)){
    return "thankYou";
    }
    else{
    return "loginFail";

    }
    }

    public String getUserListToString() {
    return userListToString;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public String getPassword() {
    return password;
    }

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

    Illetve a private static List userList = new ArrayList();-t tedd inkább egy @ApplicationScoped bean-be nem static-ként, mert semmi garancia nincs rá, hogy egy konkurens felhasználó, akit másik http worker szál szolgál ki szerver oldalon, ugyanazt fogja látni a userList-ből.

  • modder
    aktív tag

    Honnan jön a space-t tartalmazó URL? Adott, igazodni kell valamihez vagy Ti állítjátok elő?

    Amúgy bennem felmerült a kérdés, hogy az URL-nek a domain után következő elérési út szegmenseinek
    /ize/bigyo/mappa/kiskutya.html
    tehát az ize, bigyo, mappa, kiskutya.html-nek is url encode-oltnak kell-e vajon lennie külön-külön?

  • modder
    aktív tag

    Egyébként tisztábban megoldani úgy tudod, hogy az URL osztály helyett a URI-t használod.

    ez elég hasznos link volt

  • modder
    aktív tag

    String urlstring ="http://www.valami.com/u/mappa1/mappa2/ez egy spacesmappa/teszt.fil";
    System.out.println(URLEncoder.encode(urlstring,"UTF-8"));

    Az eredménye pedig: http%3A%2F%2Fwww.valami.com%2Fu%2Fmappa1%2Fmappa2%2Fez+egy+spaces+mappa%2Fteszt.fil

    javaslom, hogy olvasd el, mire jó az URLEncoder osztály http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLEncoder.html

    " for converting a String to the application/x-www-form-urlencoded MIME format"

  • modder
    aktív tag

    akkor próbáld meg így:
    byte[] md5StringToByte = new byte[md5String.size()/2];

    for( int i = 2; i < md5String.size(); i+=2 ){
    String stringByte = md5String.substring(i-2,i);
    md5StringToByte[i/2 - 1] = Byte.parseByte(stringByte, 16);
    }

    összehasonlítod az md5StringToByte tömböt az eredetivel. Nem vagyok benne biztos, hogy a stringben a helyiértékek ugyanabban a sorrendben követik egymást, mint a byte tömbben, mert most nem tudom végiggondolni :D

    szerk.: ez eléggé pseudo kód, valszeg nem is a leggyorsabb, de kiindulási alapnak szerintem jó

    ja, meg persze ez arra vonatkozik, ha minden byteot egy két karakter hosszú 16-os számrendszerbeli számként ábrázolsz. Ha Base64 kódolásban van, akkor elég csak valami apache-commons-szal dekódolni Base64-ből

  • modder
    aktív tag

    nem, nincs kettőspont. (Érdekes standard lehet, mert úgy még sehol sem láttam, legtöbbször egyben van, max space van közöttük)

    akkor próbáld meg így:
    byte[] md5StringToByte = new byte[md5String.size()/2];

    for( int i = 2; i < md5String.size(); i+=2 ){
    String stringByte = md5String.substring(i-2,i);
    md5StringToByte[i/2 - 1] = Byte.parseByte(stringByte, 16);
    }

    összehasonlítod az md5StringToByte tömböt az eredetivel. Nem vagyok benne biztos, hogy a stringben a helyiértékek ugyanabban a sorrendben követik egymást, mint a byte tömbben, mert most nem tudom végiggondolni :D

    szerk.: ez eléggé pseudo kód, valszeg nem is a leggyorsabb, de kiindulási alapnak szerintem jó

  • modder
    aktív tag

    kb 2 órája azzal szenvedek, hogy egy string formában lévő md5 hashet összehasonlítsak egy byte tömb formában lévővel. Eddig sehogy sem sikerült.

    byte tömböt BigIntegerbe rakva, nem jó mert a biginteger levágja az elejéről a nullákat.
    Arrays.equals-nak soha semmi nem egyenlő.

    konkrétan milyen formátumban van az MD5 hash stringben?
    AB:AB:AB:AB formátumban, ami kvázi standardnak számít?

  • modder
    aktív tag

    Nekem is tetszik, bár nem kedvelem az ötletet, hogy a GUI-t programkódban állítsuk elő, a deklaratív, JSF-es megoldás nekem jobban tetszik ebből a szempontból.

    Van deklaratív lehetőség is a GWT-ben :) UIBinder.

    Egyeébként ha GWT, akkor csak a sztenderd GWT...minden keretrendszer drámaian rontja a teljesítményt, ráadásul mindegyik bevezeti a saját kis megoldásait, amitől már teljes az inkompatibilitás.

    Jól hangzik. Mekkora kereslet van GWT programozókra?

  • modder
    aktív tag

    Egyetértek.

    Ezért hanyagolom én speciel a JSF-et többek között. DOM fa nagyság és third party library-k :)
    Richfacessel voltak nagyon rossz tapasztalatok...aztán lett GWT és JSP..ahogy éppen az adott feladat megkívánja.

    Persze, a GWT-ről lehetne komoly vitát nyitni, de okosan kell használni és akkor nincs gond :)

    GWT-ről azt hallottam, hogy nem annyira intuitív a használata, amin a Vaadin sokat segít. Nekem is tetszik, bár nem kedvelem az ötletet, hogy a GUI-t programkódban állítsuk elő, a deklaratív, JSF-es megoldás nekem jobban tetszik ebből a szempontból. Viszont Vaadinban nekem is tetszik, hogy már-már desktop szerű guit lehet létrehozni.

  • modder
    aktív tag

    Szóval a JSF hátránya nem a nagy DOM fa

    Minden weboldal hátrány a nagy DOM fa. Alapvetően egyetértek a leírtakkal, de a nagy DOM-tól a hidegrázás szokott kerülgetni. Saját CSS, satöbbi miatt.

    A nagy DOM sajnos a kódgenerálás hátulütője, de szerintem nem akkora probléma. Egy üzleti alkalmazásnál sokkal fontosabb a funkcionalitás és a konzisztens "look-and-feel". Pixeltologatás kevésbé. Mennyit lehetne nyerni vele, ha kézzel állítaná össze valaki a html kódot, az eredeti DOM 30%-a lenne elhagyható? A böngészők gyorsak, a szerverek gyorsak, a hálózati forgalom GZip tömörítéssel megy, a renderelésben pár ms-et nyer vele az ember.

    A probéma akkor van, amikor generált layoutba bele kell nyúlni saját CSS-sel, ahogy mondtad. Pl. icefaces minden köré <span> taget generál, így sokszor az xhtml-be tett style vagy styleClass elem nem azt a DOM elemet fogja változtatni, amire számítok, szóval ja, ebben igazat adok. Csak azt mondom, hogy ez nem a legfőbb probléma. -- bár annak, aki csak ezt csinálja lehet, hogy az :D

    Egyébként pedig szerintem, ha egy egyedi megjelenésű oldalt kell készíteni, akkor csak az alap <h:> tagek és sima xhtml kód jöhet szóba a faceletben. Ennek egyébként megvan az az előnye is, hogy nem kell fogni a fejünket, amikor fejlesztés közepén derül ki, hogy bugos egy 3rd party komponens library egyik eleme :D

  • modder
    aktív tag

    Én arra gondoltam, hogy a fájlok fent vannak a szervern zipekben (minden fájl külön zipben), emellett van egy text fájl ami az összes zipben lévő fájl hashét tartalmazza.
    A program elindul, a júzer rányom a letöltésre, behasheli az összes fájlt a célmappában, és összehasonlítja a szerveren lévő hashlistával. És csak azt a zipet tölti le és csomagolja ki amelyikben lévő fájl nem egyezik a júzerével.

    Csak hát ezt még meg kéne írni, és gondoltam hátha már valakinek szüksége volt ilyenre, és van rá lib.

    ezt a hashelést a szerveren egy egyszerű shell script is megoldja, azon kell gondolkodni, hogy mi van az almappákkal, azt hogyan kezeled le. meg azon, hogy ha jól értem ez egy egyszerű FTP szerver lenne? vagy mi szolgálná ki a klienst a szerver oldalon? ..szóval azon, hogy hogyan triggereled szerver oldalon, hogy ok, akkor most csináld meg a file-ok hashét. Bár ez akár lehet egy állandóan futó program is, ami változtatás esetén újra generálja a zip fájlt, amiben a többi fájl hashét tárolod. De amúgy egyszerű elgondolás, fapados, de biztos működne, én azonban ha egy mód van rá, mindenképpen legalább egy szervletet futtatnék szerver oldalon, mert jóval szofisztikáltabb megoldást és későbbi kiterjeszthetőséget biztosít.

  • modder
    aktív tag

    Kb mindegyik jo, amit fentebb ajanlottak. En speciel JSF-et szeretem, mert ha ranezel egy [richfaces] vagy [primefaces] showcase-re, akkor latod, hogy nagyon bonyolult ajaxos komponenseket is berakhatsz az oldaladba 5-10 sor koddal. Hatranya viszont, hogy altalaban oriasi DOM fakat general, igy lassu lehet.

    Meg a hátránya, hogy ha valami olyan dolgot akarsz megcsinálni, amit nem támogat közvetlenül a component library, akkor kicsit a mélyére kell ásni a dolgoknak, hogyan tudsz megvalósítani JSF-ben egy javascriptes, ajaxos feature-t annak ellenére is, hogy séróból lekódolod a javascript részét, és egy egyszerű servlettel támogatott backendet.

    Plusz a JSF tanulási görbéje eléggé lapos, ha egy kicsit is bonyolultabb dolgot kell megcsinálni, például 3 input mezőből kettőt egyszerre kell validálni, és annak függvényében automatikusan kitölteni a 3. input mezőt, az már nem triviális feladat, és aki gyakorlatlan, egy napot is elszenvedhet ilyennel.

    Szóval a JSF hátránya nem a nagy DOM fa, hanem az, hogy rohadtul érteni kell hozzá, és egyáltalán nem egyszerű. Mivel az egyszerűség kitétel volt, ezért nem ajánlom.

    Én speciel szeretem hogy komponens alapú, és szépen különválasztja a megjelenítési logikát a controller logikától, plusz nem kell foglalkoznom a form változók kinyerésével szerver oldalon, a 3rd party komponens library-k pedig eléggé eye-candy dolgokat tudnak. (viszont ha valamelyik komponens bugos, akkor vagy az eredeti forráskódja alapján csinálsz egy saját komponenst a bugfix-szel, vagy lefejleszted magadnak. Illetve például az Icefaces táblázatai és fája nagyon jól néz ki, de ha több száz elemet akarsz megjeleníteni, akkor baszhatod, mert memóriazabáló a szerver oldalon, és lassú, mint a dög)

  • modder
    aktív tag

    Oks, köszi. :R

    Egy másik kérdés, mindenkinek:
    Melyik webes frameworkot ajánlanátok kisebb weboldalak létrehozására? Eredetileg ezért választottam a Grails-t, és esetleg gyors tanulási lehetőséggel bír, vagy sokan használják :).
    Spring-et ide túlnagynak érzem. (Pl.: egyszerű blog oldal) Vagy inkább sima JavaEE-t használjon az ember?

    Hali, szerintem simán el lehet érni jó eredményeket szimplán servlet + stringtemplate ( http://www.stringtemplate.org/ ) kombinációval. Én még nem próbáltam, de kollégám szerint nagyon jó. A frankó az, hogy nem erőlteti rá a framework a saját technológiáit, hanem azt használsz amit szeretnél. Servlet a Controller szerepben, Stringtemplate a view szerepben, Model szerepben pedig vagy saját DAO-kat írsz JDBC-vel, vagy akármit gyakorlatilag használhatsz backendnek.

    Egyébként pedig a Play frameworköt nagyon dícsérik, csak az a bökkenő, hogy ahhoz Scalát érdemes használni, amit nem egy-két nap megtanulni, szerintem.

  • modder
    aktív tag

    ismer valaki valami libet verziókövetésre java-ban? Valami olyan kéne hogy egy tárhelyen legyenek fájlok, titkosítva, és a javas kliens a felhasználónál letölti ezeket, de csak akkor ha az adott fájl változott, vagy nincs még letöltve, és persze ezt úgy hogy a tárhely csak tárhely, sima fájlszerver http-n.

    vagy nem specifikáltad eléggé nekünk, vagy ez egyáltalán nem egy bonyolult feladat. Sőt, ezt nem is nevezném a klasszikus értelemben vett verziókövetésnek.

    Ha csak ennyi kell, ezt egy szimpla szervlettel megoldhatod. Amikor a felhasználó kér egy fájlt, get-ben elküldi az általa ismert utolsó módosítási időt vagy a fájl hashét. A szervlet megnézi, hogy a szerveren lévő fájlnak a módosítási ideje későbbi-e, mint a requestben található, vagy nem egyezik-e a hash. Ha a fájl módosult, akkor visszaküldi a response-ban.
    Pont ugyanígy működnek a cache mechanizmusok is http-ben. Erről a két megoldásról tudok. Kicsit utána kell nézi, lehet, hogy Jetty is tudja ezt alapból (lévén, hogy ő egy HTTP server) csak a HTTP headerekben van az info, mert egy decens szerver már csak tudja.
    Persze ehhez egyenként kell lekérdezgetni a fájlokat.
    Azt sem mondtad, hogy mennyi fájlról lenne szó, és hogy a kliens tudja-e alapból a fájl elérési útját. El kell-e tárolni a korábbi verziókat?

  • modder
    aktív tag

    Ez a diagram azt is mutathajta, hogy sok helyen keresnek EE fejlesztőt, de nem találnak, mert lassan mindenki átmegy Springre. Sokkal jobban mutatna egy olyan grafikon, hogy hány helyen használnak Springet aktívan és hány helyen EE-t :)

    Ha már flame, legyen kövér :)

    Lehet, hogy igazad van. Arra viszont jól emlékszem, hogy a Spring developerek, akikkel eddig találkoztam, mind melegek voltak. EGYTŐL-EGYIG! :Y :D

  • modder
    aktív tag

    Struts2 vs Spring? Nem összehasonlíthatóak :)

    Szerintem a Spring lassan platform lesz

    Ez a lényeges mondat. Annyi módosítással, hogy szerintem már az! :)

    Miért Spring? Azért, mert nem kell hozzá applikációs szerver. Egy sima Tomcat/Jetty-vel is simán elszalad, ami egy EE alkalmazásról nem mondható el. Sőt, egy jól megírt Spring alkalmazás fut servlet konténerben és applikációs szerverben is. Mindamellett ugyanazt a funkcionalitást nyújtja, mint egy EE konténer (jó, dinamikus kontext nincs, de embert nem láttam még, aki használta volna)

    Nem akarok flame-t nyitni!!

    Pedig kihúzod a gyufát! :DDD

    Az a baj, hogy nem tudom megítélni, hogy helyes-e az alábbi diagram, ami azt mutatja, hogy a Java EE-re a kereslet nagyobb mértékben nőtt, mint Springre, vagyis fejlesztőre.

    http://www.indeed.com/jobtrends?q=%22Spring+framework%22%2C+%22Java+EE%22&l=&relative=1

    (De igazából nem tudom eldönteni, hogy mennyire hiteles ez a diagram)

    DE. A Spring egy jó framework, máskülönben nem használnák, és szerintem innovatívabb is, mint a Java EE, gyorsabban mozog az új technológiák felé. Mindkét keretrendszert nagyon sok helyen használják. De az eredeti kérdéshez visszatérve, ha konkrétan tudja valaki, hogy Springgel kell/akar foglalkozni, akkor azt tanulja előbb, és ne a Java EE-t

  • modder
    aktív tag

    Sziasztok !

    Ha ezen végigmegyek : http://docs.oracle.com/javaee/6/tutorial/doc/docinfo.html és utána spring-et szeretnék használni akkor a felhasználása mennyiben tér el? Úgy gondolom, hogy a tutorialok sora Java SE -> Java EE (a fent emlitett) -> Spring-es tutorial ... jól gondolom?

    Helló,

    Nem.
    A spring Java EE-től független technológia. Ugyanarra találták ki, mint ami ma a Java EE, még az előtt, hogy a Java EE igazán használható lett volna. Helyettesítő technológiák.

    Ugyanakkor, ha készítesz egy Springes alkalmazást, megvan a lehetőséged, hogy Java EE technológiákat használj benne. Például a JPA egy Java EE specifikáció, de mára annyira kiforrott (és persze mert java standard), Springes alkalmazásokban is használják ORM rétegnek.

    Ha elsősorban Springet akarsz használni, akkor spring tutoriallal kezdd. Csak akkor olvass Java EE tutorialt, ha olyan technológiába ütközöl.

  • modder
    aktív tag

    Sziasztok!

    RSS csatornákat szeretnék feldolgozni. XML olvasásához XMLEventReader-t vagy DOM-ot alkalmazzak inkább? Továbbá abban segítsetek, hogy nem tudom milyen módon keressek rá amivel az xml-ből egy node-ot kiveszek és annak a tagjait dolgozom fel.

    mobal,

    Hali,

    http://en.wikipedia.org/wiki/Java_API_for_XML_Processing Ez egy jó összefoglalónak tűnik, hogy melyik API mire való. az XMLEventReader azt hiszem StAX specifikus dolog.

    A DOM ugye fogja az egész dokumentumot és beparsolja egy DOM fába.
    A SAX az egy push parser: ahogy parsolja a dokumentumokat, új tag-eket, és attribútumokat talál, callback metódusokat hívogat, amiket az alkalmazásod implementál, és el tudod dönteni, hogy mit akarsz csinálni az éppen aktuális információval.
    A StAX parser hasonló, csak ott az alkalmazás kívülről irányítja a parsolást: lépteti a parsert előre.

    Nyilván egy szálban tökre mindegy, hogy push vagy pull, szerintem akkor lehet érdekes ez, amikor van egy parsoló szál és egy feldolgozó szál.

    A legegyszerűbb a DOM, mert miután a parser készített belőle egy objektum modellt, a tag-ek objektumok hierarchiájaként fog megjelenni, és szépen a saját metódusain keresztül kereshetsz/iterálhatsz benne, meg is változtathatod. Továbbá, ami nagyon hasznos lehet számodra, hogy XPath lekérdezésekkel le tudod kérni csak azokat a node-okat, amikre szükséged van: http://www.ibm.com/developerworks/library/x-domjava/#3

    Az, hogy melyiket válaszd eléggé függ attól, hogy mit akarsz elérni:
    Ha nem fontos a sebesség: Ha egy asztali alkalmazást csinálsz, semmit nem fogsz profitálni a StAX parserrel a DOM-hoz képest, nem lesz akkora a különbség. Hatalmas RSS-nél mondjuk (hasraütés) pár száz ms-t veszítesz. (DOM)

    Ha fontos a sebesség: Egy google readerszerű alkalmazást akarsz, ami éjjel nappal olvassa az RSS-t, és mondjuk párhuzamosan amennyit tud. Akkor nem mindegy, hogy a végső reprezentáció és az eredeti XML között fel akarsz-e építeni és tárolni ideiglenesen a memóriában egy DOM fát.
    Esetleg fontos a gyors válasz: te real-time akarod beparszolni az RSS-t, és minél gyorsabban pl. betolni adatbázisba a tartalmát vagy más reprezentációban tárolni. (SAX)

    Streaming: Ez kapcsolódik az előzőhöz: az RSS-t egyből más reprezentációban akarod elmenteni gyorsan, vagy továbbküldeni a hálózaton. (StAX)

    Kell-e minden adat: elképzelhető, hogy nem kell az RSS-ből minden adat, csak a link neve például, akkor a többi adat teljesen fölösleges, fölösleges is tárolni őket, a parsolás folyamán csak azokat az adatokat tárolod le, amik szükségesek. (StAX)

    Én azt mondom, amíg nem hatalmas mennyiségű RSS feedről, rettentő reszponzív alkalmazásról, streamingről, vagy nagyon kevés memóriáról van szó, addig használj DOM-ot.

  • modder
    aktív tag

    Még olvasom (nagyon érdekel a téma amúgy), egy elírást észrevettem: szerintem steep learning curve-öt akartál írni, nem shallow-t :N

    Igen, volt már erről vita, és arra jutottunk, hogy a steepet rosszul használják. Az emberek legtöbbször úgy értik, hogy aminek meredek a tanulási görbéje, azt nehéz megtanulni (gondolom azért, mert ami meredek, arra nehéz felmászni :D). A wikipedia is ezt írja http://en.wikipedia.org/wiki/Learning_curve#In_culture
    De azt is írja, hogy a félreértés elkerülése végett érdemes inkább 'long' és 'short' learning curve-t írni

  • modder
    aktív tag

    Sziasztok, ismét írtam egy blogpostot arról, hogyan érdemes használható EJB-ket gyártani, ha gondoljátok olvassátok el, és mondjátok el a véleményeteket, ha hülyeséget írtam :U

    http://palkonyves.blogspot.hu/2013/03/how-to-design-clean-business-tier-with.html

  • modder
    aktív tag

    Mondjuk az se véletlen, hogy a parserek általában InputStreamekre/Readerekre épülnek ;)

    Ettől függetlenül köszi a kiegészítést, a scope és a szándék tényleg fontos.

    Most, hogy mondod a példám kicsit kifordított a konvencióhoz képest, de más nem jutott eszembe. :)

  • modder
    aktív tag

    Ez egy fontos tervezési elv kicsiben. Amikor a változót később használod, nem függ így a kódod attól, hogy a változó konkrétan egy HashMapet takar, csak hogy megfelel a Map interfésznek - más szóval kulcs-érték párokat tudsz tárolni benne.

    Így a későbbi kód módosítása nélkül kicserélheted például TreeMapre (ami hashtábla helyett piros-fekete fában tárolja az értékeket), ha a helyzet úgy kívánja. Vagy akár egy tömbre, amiben lineáris kereséssel túrod ki a megfelelő értéket. A lényeg az, hogy milyen szolgáltatást nyújt, nem az, hogy konkrétan hogyan oldja meg.

    Azért mondom, hogy kicsiben, mert egy függvényen belül ennek nincs nagy jelentősége, maximum szoktatod magad csak az interfészek deklarálásához. Nagyobb programban viszont, ahol komponensek kapcsolódnak egymáshoz, ez már kritikussá válik. És jönnek olyan finomságok, mint Dependency Inversion.

    Karma írta: "A lényeg az, hogy milyen szolgáltatást nyújt, nem az, hogy konkrétan hogyan oldja meg."

    Igazából ez a legfontosabb dolog. Amit még hozzá tennék, hogy kontextusfüggő vagy scope függő, hogy a statikus típusa a változónak Map vagy TreeMap legyen-e.

    Amikor az osztályod (osztályaid) külső interfészét tervezed meg, akkor a hívó kliens kódnak nem kell tudnia hogy milyen konkrét implementációt (TreeMap vagy HashTable) ad vissza az osztályod egy függvénye, csak azt, hogy a visszaadot érték Map tulajdonságú.

    De az osztályon belül fontos lehet, hogy konkrét típust deklarálj. Például egy JSON feldolgozó osztályt csinálsz, és szeretnéd, ha a hívó kliens egyszerűen egy OutputStreambe tudja írni a feldolgozandó JSON stringet. Neked azonban kell egy módszer a JSON feldolgozó osztályban, amivel ki tudod nyerni az OutputStreambe írt adatot. Az OutputStream interfészben nincsen deklarálva semmilyen metódus, amivel adatot ki tudnál nyerni (nem is arra való). De a ByteArrayOutputStreamben vissza tudod kérni a beírt adatot byte[] tömbként.

    Konkrét példa:

    public class MyJsonParser {
    private ByteArrayOutputStream jsonByteStream = new ByteArrayOutputStream();

    public OutputStream getOutputStream() {
    return (OutputStream) jsonByteStream;
    }

    public JsonObject parse() {
    // fontos tudni hogy ez egy ByteArrayOutputStream hogy használhassuk a toByteArray() metódusát
    byte[] jsonBytes = jsonByteStream.toByteArray();
    JsonObject jObject = new JsonObject();
    // parszoljuk a json stringet
    return jObject;
    }
    }

    public class Application {
    public static void main(String[] argv) {
    MyJsonParser parser = new MyJsonParser();

    // kit érdekel a konkrét implementációja az OutputStreamnek én csak írni akarok bele?
    OutputStream parserOutputStream = parser.getOutputStream();
    parserOutputStream.write( argv[0].getBytes() );

    JsonObject jObject = parser.parse();
    }
    }

    Ezt csak azért írtam le, mert nem örök igazság, hogy csak interfész típust deklarálunk. :)

  • modder
    aktív tag

    Üdv!

    XML fájlok parsolásához tudtok ajánlani hatékony külső libeket?

    Nem vagyok egy nagy XML vadállat, csak mostanában kellett. Attól függ, hogy akarod használni.
    ha entitást akarsz generálni az xml-ből oda-vissza, akkor JAXB (Metro, de inkább Eclipse Moxy implementációt használd, mert kevésbé bugos).
    Ezt nagyon egyszerű használni.

    Ha több kontroll kell, akkor pl StAX API.

    Én most a kettőt együtt használtam, mert alá kellett írni az eredeti xml üzenetet, ami sokféle típusú lehet. szóval fogtam, jaxb-vel legenerelátam az üzenet xml-t, szintén jaxb-vel legeneráltam a signature objektumból az xml-t, majd StAX-szal a kettőből összeheggesztettem egy nagyon egyszerű xml-t, ami a kettőt tartalmazza.

  • modder
    aktív tag

    Sziasztok,

    Problémám akadt glassfish környezetben.

    JSP + Servlet technikát alkalmazok.

    JSP:
    <select name="car_makes" multiple>
    <option value="1">egyik</option>
    <option value="2">masik</option>
    <option value="3">harmadik</option>
    </select>

    Servlet:
    System.out.println("Gyártók: "+request.getParameter("car_makes");
    Csak az első bejelölt opciót adja vissza mint azt a getParameter() metódusnév sugallja is.
    Hogy lehet ezt a jellegű multiple select problémát feloldani?

    cső

    http://docs.oracle.com/javaee/5/api/javax/servlet/ServletRequest.html#getParameterValues%28java.lang.String%29

    egyébként multiple="multiple" legyen az (x)html kódban, mert az a szabvány nem támogatja az érték nélküli attirbútumokat, szóval nem köteles minden böngészőben működni ...ásszem :)

  • modder
    aktív tag

    Persze, ha az alkalmazás Spring-es...:D

    Azért gondoltam, hogy nem Springes, mert ahhoz elég egy Tomcat (vagy egy Jetty történetesen), mert semmit nem használ alapból a Java EE stackből :)

  • modder
    aktív tag

    az a gondom, hogy eddig javaban csak ablakban / konsolon futó programokat írtam (azt is kb 3-4 éve) és most kell gyorsan átnyargalnom grassfish-es webes mókára :(

    a dokumentációs linket köszönöm ... bár ezen lesz idő mire átrágom magam :( , de neki látok

    plusz abszolút hülye (talán a hét hülye kérdése) kérdés még. nagyon leegyszerűsítve ugye a javanal fordított kódot futtatunk (.jar és .class fájlok) na most ha van egy glashfises projektem amihez nincsennek meg a java források akkor ha jól gondolom szívtam mert ahhoz hogy a kódba bele nyúljak ahhoz nekem a forráshoz is szükségem van. amiből majd én új (jar,class) fájlokat fordítok és a glassfish-be ezeket a fordított kódokat pakolom ki (majd gondolom glassfish újraindítással már az új kód fog futni)...

    tehát ahhoz, hogy a meglévő kódon módosítani tudjak ahhoz nekem szükségem van a forrásfájlokra is ha jól gondolom ... Mert akkor azzal nem rendelkezek :(

    http://docs.oracle.com/javaee/6/firstcup/doc/gcrlo.html

    És hát itt a biblia:
    http://docs.oracle.com/javaee/6/tutorial/doc/

    Az, hogy Glassfishben kell fejlesztened gondolom azt jelenti, hogy Java EE alkalmazásokat kell fejlesztened. Itt még felmerül kérdésként, hogy milyen technológiákat használ az általad átvett projekt. Réginek számít a JSP, Servlet, közvetlen JDBC, esetleg Hibernate. Újnak számít (persze már ezek is 3-4+ éves technológiák, de mára váltak igazán kiforrottá) a JSF, EJB, CDI, JPA.

    Én azt javaslom, hogy először szedd össze, hogy melyik technológiákat használja a projekt. (Remélhetőleg a kolléga nem egyedül dolgozott rajta, így valaki tud segíteni), szerezz ezekről valami fogalmat, hogy mi mire jó, párosítsd össze a technológiákat a projekt kódjával, hogy lásd élőben is, mikor és hogyan volt használva.
    A fönti linkelt bibliában le van írva részletesen, hogy melyik technológiát mikor használjuk.

    Ez tényleg hosszú folyamat, mert nagyon összetett a Java EE felépítése. Elmélet-gyakorlat oda-vissza, míg az ember teljesen megvilágosodik.

    A forráskódot vissza lehet fejteni minden gond nélkül java decompilerrel, ha minden kötél szakad, de az eredeti formázást és kommenteket el fogja veszíteni. Bár nem tudom elképzelni, hogy "a kolléga elment, nekem kell átvenni a helyét, de nincs meg a forráskód", annak valahol meg kell lennie, a kolléga sem bytekódot írt séróból.

    Ha már leírtam, pár hozzászólással korábban van egy hosszú kommentem néhány Java EE technológiából, mert valaki kérdezte, ennek most te is veheted kis hasznát :)

  • modder
    aktív tag

    Ez a stackoverflow kérdés alapján Java 7 alatt már nem feltétlen igaz az állításod. Elvileg egy karakteres delimiter esetén már nem használ regexet.

    Kíváncsiságból megnéztem, és igazad van
    http://www.docjar.com/html/api/java/lang/String.java.html 2312. sorától látszik, hogy indexOf()-val splittel, ha

    (1)one-char String and this character is not one of the
    RegEx's meta characters ".$|()[{^?*+\\", or
    (2)two-char String and the first char is the backslash and
    the second is not the ascii digit or ascii letter.

  • modder
    aktív tag

    Nincs pontos vesző. Köszi a gyors segítséget. Megnézem ezt a String.split-et.

    Ilyen egyszerű esetekben, illetve ha fontos a sebesség, érdemes inkább megkeresni a ";" helyét String.indexOf vagy String.lastIndexOf függvénnyel, aztán a két adatot a String.substring függvénnyel kiszedni az eredetiből.
    Fapadosabb megoldás, de gyorsabb.
    10 sornál nem lesz érezhető különbség, de több száz sornál már igen.

  • modder
    aktív tag

    Valaki el tudná magyarázni egyszerű, emberi nyelven, hogyan is működnek, kapcsolódnak egymáshoz az alábbiak? Vagy link is megfelel:
    servlet, JSP, JSF, EJB
    Olvasok a témában és kissé zavaros, hogy mi mit is csinál pontosan.

    Servlet
    Egy HttpServlet-ből származtatott osztály, amit te készítesz az alkalmazásodban, ebből akármennyi lehet.
    Egy alkalmazásszervernek specifikáció szerint tartalmaznia kell servlet containert. Az alkalmazásod web.xml fájljában kell megadnod a <servlet> és <servlet-mapping> direktívákkal. Ezekkel mondod meg a servlet containernek, hogy melyik osztályaid a szervletek, és melyik szervlet hívódjon meg adott url request esetén. pl.

    <servlet>
    <servlet-name>proba</servlet-name>
    <servlet-class>hu.whatnot.ProbaSzervlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>proba</servlet-name>
    <url-pattern>/proba/*</url-pattern>
    </servlet-mapping>

    A fenti linken látod, hogyan működik a servlet. Például a doGet metódusa HTTP GET kérésnél hívódik meg.

    JSP
    JavaServer Pages. Ez XML-szerűen, deklaratívan megírt fájl. Ez azt jelenti, hogy a JSP olyan kódot tartalmaz leginkább, ami HTML kódot állít elő. Tudsz benne HTML tageket használni, de van egy csomó, akár mások által feljesztett tag library ami megkönnyítni a HTML kód generálását: például végigiterálás listán, minden egyes elemnél kiírni valamilyen html kódot.
    Ezen kívül lehet bennük írni szkriptleteket, amik <% %> közé tett java kód. Ez arra jó, hogy például a megjelenítéshez szükséges formára szabd a megjelenítendő adatot.
    példa: http://140.109.18.7/examples/jsp/num/numguess.txt
    A JSP Servletté fordul első meghívásnál, itt látod, hogyan http://www.informit.com/articles/article.aspx?p=130980&seqNum=5

    JSF
    Ez már bonyolultabb dolog. JavaServer Faces egy MVCszerű keretrendszer, aminek az volt a célja, hogy úgy tudjunk szerver oldali GUI-t programozni, mint vastagkliens alkalmazást. A JSP kiváltására szolgál. A JSF-nek egyetlen szervlete van, ami az alkalmazásod base url-jére mappel, azon belül ő intézi a dolgokat, hogy mikor mit hívjon meg.
    http://courses.coreservlets.com/Course-Materials/pdf/jsf/jsf2/JSF2-Programming-Basics.pdf

    EJB
    Ez szintén bonyolult dolog :)
    Enterprise Java Beanekbe üzleti logikát szoktak tenni. Általában az EJB osztályok azok, amik összekötik a megjelenítési réteget az adatbázissal/ perzisztencia réteggel. Ezek egyszerű Java osztályok (POJO-k). Az esetek 90%-ában állapotmentesek, tehát nincsen belső változóhoz kötött állapotuk, csak metódusaik. Belső változók általában más állapotmentes erőforrásokra hivatkoznak, mint pl. másik EJB.
    egy EJB metódus például azt csinálhatja, hogy létrehoz egy új felhasználót, és elmenti az adatbázisban. (nyilván, ezt az alkalmazásfejlesztőnek kell megírnia).
    Hogy mitől különb egy EJB egy POJO-nál?
    Az osztályra tett @EJB annotációval az osztály az alkalmazásszerver által menedzseltté válik:
    Te nem példányosítasz EJB-t, csakis az alkalmazásszerver teszi.
    Minden egyes EJB-n kívülről érkező EJB metódushívás új adatbázis tranzakciót indít. (persze ez széjjelkonfigurálható)

    Itt látható, hogyan kapcsolódnak a technológiák egymáshoz:
    http://www.cs.utsa.edu/~cs4413/lectures/topic7.html Főleg az első kép a lényeges. Ott a JSP mellé még tedd be a JSF-et gondolatban.

  • modder
    aktív tag

    Még csak nemrég kezdtem el tanulgatni a Java nyelvet, de a tankönyv, amit olvasok már többször említette az "interfész" szót, és ezt is: "az osztály által implementált interfészek".
    Később persze ezt is tárgyalja majd a könyv, de már nagyon kíváncsi vagyok rá, beleolvasni meg inkább nem akarok előre.
    Csak egy rövid összefoglalóként mégis, mik ezek az interfészek, mire jók, és mit jelent az hogy egy osztály implementál egy interfészt?

    Ha már a könyvben szó esett arról, hogy "az osztály implementálja az x interfészt", akkor gyanítom, hogy egy valós példa is szerepel az interfész alkalmazására.

    Többek között azért jó egy interfész, mert elrejti az osztály konkrét implementációját (fordítási időben).

    Egy egyszerű példa a Swing ActionListener interfész amit arra használhatsz, hogy gui eseményekre (pl. gomb megnyomása) valamit reagáljon a programod.
    A GUI komponens .addActionListener( ActionListener listener ) metódusának egy olyan objektumra van szüksége, aminek van actionPerformed( ActionEvent e ) metódusa. Tehát létrehoztak neki egy interfészt, amiben deklarálták ezt a metódust, ez lett az ActionListener interfész. Ezzel kényszerítik ki, hogy csak olyan objektumot adjál át ennek a metódusnak, aminek megvan a megfelelő actionPerformed( ActionEvent e ) metódusa.

    Vissza a fordítási időhöz: Látható, hogy a Swing készítőket nem érdekli, hogy miután lefordították a Swing library-t milyen ActionListener objektumokat fog létrehozni a fejlesztő, lehet azoknak az objektumoknak hatszáz másik metódusa is, és mindegy, hogy mit csinál. Ami a fontos, hogy a fejlesztő által létrehozott listener objektumoknak meglesz az elvárható tulajdonsága: lesz neki actionPerformed( ActionEvent e ) metódusa.

  • modder
    aktív tag

    Hali,

    Mivel még nem vagyok világhírű a blog postjaimmal, ezért teszek egy önző kísérletet a saját népszerűsítésemre :D

    Ha valakit érdekel a JSF, csináltam egy postot arról, hogyan szenvedtem végig egy problémát rossz megközelítéssel, és mi lett volna a helyes.

    http://palkonyves.blogspot.hu/2012/12/ive-been-using-postconstruct-wrong-way.html

    A feedbackek welcomeok!

  • modder
    aktív tag

    Nem is a JSF a lényeges. Arraylist-ből datatable dolog lenne lényeges.
    Ebből a példából indultam ki.
    Csak itt az adatok bele vannak "égetve" a kódba ezen a helyen:
    private static final Order[] orderList = new Order[] {

    new Order("A0001", "Intel CPU",
    new BigDecimal("700.00"), 1),
    new Order("A0002", "Harddisk 10TB",
    new BigDecimal("500.00"), 2),
    new Order("A0003", "Dell Laptop",
    new BigDecimal("11600.00"), 8),
    new Order("A0004", "Samsung LCD",
    new BigDecimal("5200.00"), 3),
    new Order("A0005", "A4Tech Mouse",
    new BigDecimal("100.00"), 10)
    };

    Ezt szeretem volna egy for ciklussal megvalósítani. De még nagyon-nagyon kezdő vagyok.

    Akkor gondolom a hiba az egy fordítási hiba annál a kódrésznél egy szép hibaüzenettel. Nem árt, ha legközelebb azt is beírod, nem csak hiba. A vízvezeték szerelőnek sem mondod, hogy rossz a zuhanyzó, mert kicserléi az egész zuhanyfülkét, közben pedig csak a csap csöpög benne..

    Na de a lényeg, hogy az ott egyáltalán nem jó. azt a for ciklust tedd a konstruktorba olyan helyre, hogy a benne használt változók már inicializálva legyenek.

    mert az ott nem egy függvényhívás, hanem tömb definíció, és tömböt többek között úgy tudunk definiálni, hogy: tipus[] tomb = new tipus[]{ elem1, elem2, elem3 }

    Plusz nem árt, ha az alapokkal tisztában vagy, mert lehet kérdezni, de senki nem fogja helyetted megtanulni
    http://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html

  • modder
    aktív tag

    Sziasztok!

    Arraylist tartalmát szeretném datable segítségével megjeleníteni JSF-ben. De nem tudom mi lenne a jó megoldás. Én ezzel próbálkoztam eredménytelenül:
    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */
    package beans;

    import database.Database;
    import java.util.ArrayList;

    /**
    *
    * @author Zoli
    */
    public class AllWordBean {

    //private int index;
    ArrayList <Integer> idList;
    ArrayList <String> hunList;
    ArrayList <String> engList;
    database.Database database = new Database();
    int index;

    public AllWordBean(){
    database.setQuery("", true, false);
    database.execQuery();
    this.idList = database.getIdList();
    this.hunList = database.getHunList();
    this.engList = database.getEngList();
    this.index = idList.size();

    }

    private allWordTable[] wordTable = new allWordTable[]{
    for(int i = 0; i<index; i++){
    new allWordTable(idList.get(index), hunList.get(index), engList.get(index));
    }
    };

    public allWordTable[] getallWordTable(){
    return wordTable;
    }

    public class allWordTable{

    int id;
    String hunw;
    String engw;
    public allWordTable(int id, String hunw, String engw){
    this.id = id;
    this.hunw = hunw;
    this.engw = engw;
    }

    public String getEngw() {
    return engw;
    }

    public String getHunw() {
    return hunw;
    }

    public int getId() {
    return id;
    }

    public int getIndex(){
    return index;
    }

    }

    }

    Lényegében ezzel e résszel van a bibi:
    private allWordTable[] wordTable = new allWordTable[]{
    for(int i = 0; i<index; i++){
    new allWordTable(idList.get(index), hunList.get(index), engList.get(index));
    }
    };

    de nem tudom hogyan lehetne az arraylistet megjeleníteni jól.

    És mi a bibi vele?
    Amúgy az valid java kód, amit kiemeltél, mert még nem láttam olyat?
    Hol a JSF?

  • modder
    aktív tag

    Plusz, arra van valami example a neten / tudnál javasolni vagy kereső szót, hogy amit ajánlottál a statikus html oldalak, vagy amit generálok, hogy azt hogyan lehet megvalósítani a singleton-nal? :) Fúú, ez nagyon érdekel.

    Köszi a részletes választ :). :R.
    Mert majd webszervert akarok bérelni, és hogy ha jön napi szinten a requestek, akkor hogyan hat rá a terhelésre, és ennek utána olvasva ellentétes infókat kaptam... (bár néha a net tele van szútyokkal).
    És elbizonytalanodtam...

    Nem tudom pontosan hogy akarod megoldani a megjelenítést. Régen volt JSP. ebből ugye servlet generálódott, ahol a JSP statikus részei final stringek voltak, tehát szépen benne maradt a memóriában, nem hozta őket létre újból minden requestnél. Én JSF-et használok, de egyszerű weboldalakra kiváló és nagyon kiforrott a String template.

    Én arra gondoltam, hogy ha magát a template-et, mint Stringet egy Singleton osztályba beolvasod egyszer pl. fájlból, amikor szükség van rá, és utána onnan éred el, akkor a Singletonod alkalmazáson belül de, requestek között megmarad, így a beolvasott string template is megmarad a memóriában. Sőt, requestenként ugyanazt a singleton-t fogod elérni. Persze fontos, hogy ezt az osztályt tényleg csak stringek tárolására használd, és ne legyen benne semmi állapot a template stringeken kívül. Plusz a fájlból beolvasás metódusát és a getInstance metódusát nem árt egy mutex-szel védeni, elkerülendő, hogy két thread (két szimultán request) egyszerre inicializálja.

    Ez amúgy csak most jutott eszembe a kérdéseddel kapcsolatban, lehet hogy valahol hibádzik a gondolatmenetem, de tekintve, hogy egy JVM-en és egy classloader hierachián belül ugyanazt az osztálypéldányt használja az alkalmazásod requestektől függetlenül, gondolom működik.

  • modder
    aktív tag

    Hali,

    Fontos kérdés, ha van valakinek tapasztalata kérem szóljon :).
    Magamnak akarok elsőkörben egy java webszervert, szeretnék pár webprojektet futatni rajta.
    Jetty lenne a webszerver + PostgreSQL (esetleg mongodb is). Szerintetek egy ilyen webszervernek mennyi memória kell?
    Most az jutott a tudomásomra, hogy minden egyes lekérésnél elindítódik külön-külön a JVM (ami egymagában 30-40 mega), ezen picit meglepődtem.
    Mert én úgy tudtam, hogy nagyon terhelt webalkalmazásoknál a Java jobb választás, mert gyorsabban kitudja szolgálni mint a többi azonos hardveren (stackoverflow-on olvastam talán). De így picit el vagyok bizonytalanodva.
    Eleinte tényleg tanulás céljából és hobbi projekteket üzemeltetnék (4-6 db).

    A kisebb projekteknél, amik max olyan "közepes" lesznek, azokra a Grails-t használnám (Groovy in Rails régebbi nevén) 2db-ra pedig talán a Spring MVC (1-kre biztosan)

    Nektek mi a tapasztalatotok, javaslatok? 2GB elég lehet? (talán napi max 200 lekérés).

    Idézlek másik fórumról:
    Én laptopon futatom a linux + java webszervert (Jetty - baromi jó, gyors és keveset eszik ajánlom mindenkinek) + mongot + (jelenleg mysql), de összeségében még nem láttam őket együtt 1GB ram felé menni
    De akkor mi a francért kérdezel ilyeneket? :D

  • modder
    aktív tag

    Hali,

    Fontos kérdés, ha van valakinek tapasztalata kérem szóljon :).
    Magamnak akarok elsőkörben egy java webszervert, szeretnék pár webprojektet futatni rajta.
    Jetty lenne a webszerver + PostgreSQL (esetleg mongodb is). Szerintetek egy ilyen webszervernek mennyi memória kell?
    Most az jutott a tudomásomra, hogy minden egyes lekérésnél elindítódik külön-külön a JVM (ami egymagában 30-40 mega), ezen picit meglepődtem.
    Mert én úgy tudtam, hogy nagyon terhelt webalkalmazásoknál a Java jobb választás, mert gyorsabban kitudja szolgálni mint a többi azonos hardveren (stackoverflow-on olvastam talán). De így picit el vagyok bizonytalanodva.
    Eleinte tényleg tanulás céljából és hobbi projekteket üzemeltetnék (4-6 db).

    A kisebb projekteknél, amik max olyan "közepes" lesznek, azokra a Grails-t használnám (Groovy in Rails régebbi nevén) 2db-ra pedig talán a Spring MVC (1-kre biztosan)

    Nektek mi a tapasztalatotok, javaslatok? 2GB elég lehet? (talán napi max 200 lekérés).

    Most az jutott a tudomásomra, hogy minden egyes lekérésnél elindítódik külön-külön a JVM (ami egymagában 30-40 mega), ezen picit meglepődtem.
    Ezt hol olvastad meglepődnék ha így lenne. Totál elveszítené a webszerver az értelmét, és gyakorlatilag CGI-ként futtatnád így az alkalmazásodat.

    Tessék, itt van egy összehasonlítás arról, hogy melyik webszerver mennyi memóriát használ idle állapotban http://www.jvmhost.com/articles/memory-usage-comparison-of-java-application-servers-and-applications -- 1 jetty instance átlag 50 megabyte.

    Erre jön még az alkalmazásod memóriaigénye, ami nagyban függ az alkalmazásod felépítésétől, az output nagyságától. Pl. ha csak az outputot nézzük (a belső struktúrát nem), akkor átlagosan 16 bites karakter hosszal számolva 20 megabyte memóriába 1 250 000 karakter fér bele. ami átlagos karakter per oldal alapján ~ 43 wikipedia oldalnak felel meg.
    Erre jöjjön rá még az alkalmazásod belső struktúrája. Azért látni, hogy ez egy eléggé elnagyolt példa, egy kis weboldal nem fog 20 megabyteot elhasználni oldallekéréseknél, max pár megabyte. Nem beszélve arról, hogy statikus adatokat (pl. html template-eket amibe csak beszúrod a generált tartalmat) megosztasz a lekérdezések között, mert bent marad a memóriában. Pl. ha egy singletonban tárolod ezeket, és nem próbálod meg beolvasni a fájlból minden egyes oldallekéérésnél.
    Szóval egy relative kis weboldal max pár megabyte memóriát fog lefoglalni requestenként.

    Plusz korlátozhatod a memóriát JVM beállításokkal (pl. max heap size) meg hasonlók, így ha kezd kifogyi a memóriából a webszerver, a GC majd elintézi a régi objektumokat. Szerintem elég neki kb 500 megabyte memóriát adni.

    Szerintem ami a legfontosabb, ha kevés memóriát szeretnél használni, hogy ahol dinamikus string összefűzés van, ott használj StringBuildert vagy StringBuffert (nem emlékszem melyik a nem threadsafe de azt). Pl. A stringet több objektum, függvény állítja elő, vagy cikluson belül generálod. Különben a String + operátor új stringet hoz létre mindig. Kiemeltem, hogy dinamikusan, mert ha csak kényelmi szempontból egy ilyen változót deklarálsz, hogy
    String fejlec = "Üdvözöllek \n" + "a\n" + "weboldalamon!"; akkor a fordító automatikusan egybefűzi ezeket a stringeket, úgyhogy no para.

    Szó ami szó, napi 200 lekérdezésre simán elég a 2GB, de ha spórolni akarsz adj rá 500 megabyte-ot, az is bőven elég lesz.

  • modder
    aktív tag

    Nálad a pont!

    Valóban a detail osztályból töröltem és nem a parrenten keresztül.
    Kipróbáltam a javaslatodat és rendben van a dolog, ha a szülő osztály Set-jéből remove-olom az elemet. Ekkor már van adatbázis kérés és frissít rendesen!

    Köszi!

    szívesen, érdemes a kapcsolatok mindkét oldalát rendben tartani.
    Meg rászánni az időt, utána olvasni a konfigurálásnak, hogy úgy működjön, ahogy elvárható

  • modder
    aktív tag

    Sziasztok!

    Adott egy Hibernate-et és MySQL-t használó NetBeans alatt készített alkalmazás GUI-val.
    Két táblázat van benne, amiket feltöltök a perzisztens objektumokkal. A második táblázat az első detail táblája, azaz az egyik adattagja (ami Set típusú) tételeit tartalmazza.
    A lényeg az hogy ha törlök valamit a detail táblából akkor látom az SQL parancsot (delete) az output ablakban. Az SQL adatbázist megnézve látszik hogy törlődött a rekord, viszont a vizuális komponensben (jTable) nem látszik a frissítés. Természetesen újra feltöltöm a táblát, de nem frissül. Olyan mintha valahol (cache?) ott maradna az adat. Új session-t indítok minden egyes lekérdezésre, flush() és evicat() meg minden van a törlő művelet után, de nem frissül. Az output ablakban látszik hogy a select nem fut le újra, pedig ott van a lekérdezés és debugolva is ellenőriztem végrehajtja a sort, de nincs adatbázis kérés mögötte.
    Ha kilépek és újraindítom a progit akkor már minden rendben látszik.

    Hogy lehet rábírni hogy frissüljön rendben minden? Mi a francért nem frissül?

    Hogyan törölsz?
    Ha simán törlöd a detail entitást, de nem nem frissíted a parent entitás (a másik táblából) Set-jét és nem mergeled (sorry nem vágom pontosan a hibernate-es terminológiát) őt, akkor a hibernate cache úgy érzékelheti, hogy az objektumon nem történt semmi változás (a kapcsolatot csak az egyik oldalról törölted, a parent felől nem), ezért nincs oka újra lekérdezni olyan result setet mégegyszer.

    Próbáld meg, hogy a parent entitás Set-jéből törlöd a detailt, majd mergeled a parent entitást.

    Remélem ez menni fog.

  • modder
    aktív tag

    Definiáld felül a háromszög osztályban az Object ősosztály equals metódusát, és akkor adjon vissza igazat, ha a két háromszög területe megegyezik. Így amikor hozzáadogatod a háromszögeket a HashSet-hez, azok nem kerülnek bele a halmazba, amelyeknek a területe már szerepel.

    Kódban ez vhogy így néz ki (nálam most a háromszög osztályt Triangle-nek hívják):

    @Override
    public boolean equals(Object o) {
    if (o instanceof Triangle) {
    Triangle t = (Triangle) o;
    if (t.getArea() == getArea()) {
    return true;
    }
    }
    return false;
    }

    // A hashCode metódust is illik felüldefiniálni,
    // ha az equals-t felüldefiniálod. Az a lényeg,
    // hogy egyezzen meg annak a két objektumnak a hashkódja,
    // amelyekre az equals igazat ad vissza.
    @Override
    public int hashCode() {
    return (int) getArea(); // ezt lehet máshogy is, de a célnak megfelel
    }

    Én nem keverném ezt bele, mert az equals()-nak és a hashCode()-nak az egyedet kell tudnia azonosítania, és nem egyetlen tulajdonságát. Végtelenféle háromszöget lehet ugyanazzal a területtel. Szóval ez ellent mond a Java equals()-ra és hashCode()-ra vonatkozó contractjának.

    Nem is adna jó eredményt, mert a terület nagy valószínűséggel Float lesz, amit nem tudsz még javában sem alapból úgy összehasonlítani, hogy mindig jó eredményt kapj, pláne nem az == operátorral:
    http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Float.html#equals(java.lang.Object)

    Nem tudom mire kell itt a HashSet, de én úgy oldanám meg a dolgot memóriahatékonyan, hogy:
    1) csinálok egy ArrayList<Haromszog> haromszogek listát
    2) csinálok egy másik ArrayList<Float> teruletek listát
    3) ahogy generálom a háromszögeket a ciklusban, egy belső ciklusban minden legenerált háromszögre végigmegyek a 'területek' összes elemén és megnézem, hogy benne van-e az új háromszög területe, így:
    if(Math.abs( aktualisTerulet - ujHaromszogTerulet) < 0.001f)
    benne van
    else
    nincs benne, hozzáadom a háromszögekhez a háromszöget, és hozzáadom a az ujHaromszogTeruletet a teruletekhez

    Ha pontosabb float egyenlőség vizsgálat kell, ezt találtam neten http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

    esetleg gyorsabban futó megoldást is találhatsz, ha valamilyen orderes listet használsz pl http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#binarySearch(java.util.List, java.lang.Object, java.util.Comparator) -vel keresel a területek között

  • modder
    aktív tag

    szerver bérlés miatt felmerült egy aprócska gond... melyik kiszolgálon érdemes egy Spring framework segítségével készül webalkalmazást használni?
    Apache Tomcat vagy Glass fish? (Apache-ot azért favorizálom, mert akkor PHP-t is tudna kezelni).

    Hali,

    Glassfish egy teljeskörű java EE implementáció (bár van web profile-ja is, ami kicsit kevesebbet tud).
    Springhez nem kell Java EE alapesetben, csak egy szervlet konténer, tehát a Tomcat teljesen megfelel. Elvileg egyébként egy teljesen alap Jetty is megfelel neki:

    http://wiki.eclipse.org/Jetty/Howto/Spring

  • modder
    aktív tag

    Sziasztok,

    Valaki nekem meg tudná mondani miért jó J2EE-ben használni az Annotations-t?
    Előre is köszi.

    Az annotációk elég sok mindenre használatosak.

    Nem tudom konkrétan melyik annotációra gondolsz, és azt sem tudom hirtelen, hogy a Java 2 EE mennyire használja őket. Volt egy névváltás javában, nagyon sokan még mindig J2EE-ként hivatkoznak rá, de Java 1.4-től fölfelé Java EE 5 és Java EE 6-nak nevezik őket, amik sokkal inkább használják a különféle annotációkat.

    http://en.wikipedia.org/wiki/Java_EE_version_history

    Az annotációk az egyfajta "convention over configuration" paradigma. Amit korábbi java verziókban konfigurációs fájlokban kellett megadni, most a forráskódba írható a definíció helyén. Persze a régi konfigurációs fájlban lévő beállítások precedencia előnyt élveznek az annotációkkal szemben. A haszon az egészben az, hogy sokkal kisebb erőfeszítésbe telik a fejlesztő számára, ha csak a forráskódot kell böngésznie, mint ha a forráskódot és mellé a konfigurációs fájlt is figyelemmel kell kísérni.

    Például ott vannak az EJB-k. Régen a beans.xml-ben kellett definiálni minden osztályra, hogy az EJB-e vagy sem, definiálni kellett hozzá a remote és local interfészt, a bean nevét, egyebet. Ha van 10 EJB-d, és változik a neve az egyiknek, nem túl kényelmes külön a konfigurációs fájlban is böngészni utána, pláne, lehet, hogy egy kezdő programozónak eszébe sem jut.

    A java EE-nek csomó olyan szolgáltatása van, amiket csak konfigurációs fájlokkal vagy annotációkkal lehet csak elérni. Pl EJB-k létrehozása, JPA Entity beanek, ManagedBean-ek, Servletek, Servlet filterek. egy nagy program esetén ez hatalmas konfigurációs fájlokat eredményezhet, amiket aztán külön kell karbantartani, hogy a kóddal konzisztens maradjon. Az annotációkkal azonban a kóddal együtt lehet kezelni.

    Kb ennyi

  • modder
    aktív tag

    Heló,

    nem ;]

    A "nested class-od" adattagjainak láthatósága alapértelmezetten package.

    remélem tudod, hogy a static class csak belső osztályként jöhet létre (nested class), és nem azt jelenti, hogy ez egy singleton.

    statikus nem a láthatóságra vonatkozik, hanem hogy az adott tag (metódus vagy mező) nem objektum példányhoz, hanem osztály példányhoz tartozik.

    Kicsit több tudást igénylő példa, de ugyanazon nevű osztályból (package nevet is beleértve) szélsőséges esetben több példány is létezhet egy jvm-en belül (egy futtatás alatt), ha azok különböző classloaderekkel lettek betölve. (most nem objektum példányról beszélek, az egyértelmű, hogy egy osztálynak több példánya is lehet) -- A java classloaderek kicsit hasonlítanak a PHP-s auto-load classloaderekhez.

    az osztálytagok (metódus vagy mező) alapértelmezett láthatósága a package. Így ebben az esetben is. Mivel azonban a nested classod privát, ezért kívülről egyébként sem férhetsz hozzá az osztályhoz, így az adattagokhoz sem, csak és kizárólag a tartalmazó osztályból.

    Tehát az Elem osztályod tagjaihoz csak a tartalmazó osztályból férhetsz hozzá, tulajdonképpen magához az osztályhoz is.

    Lehet egy nested class nem statikus is

    Ha a belső osztályod nem static, akkor egyértelműen hozzá van kötve az őt tartalmazó osztály egy példányához. Példányosítani kicsit furcsa szintaxissal kell:

    KulsoOsztaly.BelsoOsztaly belsoPeldany =
    kulsoOsztalyPeldany.new KulsoOsztaly.BelsoOsztaly();

    belső osztályból a tartalmazó külső osztálypéldányra hivatkozni pedig:
    KulsoOsztaly tartalmazoOsztalyPeldany = KulsoOsztaly.this;

    http://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html nézd meg a példakódot

    A lényeget kihagytam: static nested class az egy teljesen hagyományos osztály. Akkor használják, ha bizonyos adattagok, feladatok egy osztályon belül is logikailag jól körülhatárolhatóak és csoportosíthatóak.
    Vagy, mint a te esetedben is, egy osztály cask egyetlen másik osztály számára hasznos.

    Davs
    Az csak útvonalat jelöl, mint a package név, de elképzelhető, hogy nem működik úgy, ahogy én írtam, nem teszteltem

    Athlon64+
    jó, nem tudom, nem értek hozzá :o

  • modder
    aktív tag

    Ha valami nincs ellátva static kulcsszóval, akkor az instance-hoz kötődik, és még most szólok, Java-ban egyáltalán nincs static ctor. Ennek az osztálynak minden eleme "package" hozzáférésű, csak rájuk van húzva a private a class miatt, ami pontosan annyira redukálja a hozzáférhetőségét, amennyire mutatja magát (ami a class-t használhatja, az használ mindent, itt semmi se látja ezt az osztályt).

    Javaban van static konstruktor :)

  • modder
    aktív tag

    Na visszatértem a Java valláshoz :D

    Lenne egy következő kód:
    Ez egy statikus tagosztály.
    private static class Elem {
    Object adat;
    Elem elozo, kovetkezo;

    Elem (Object adat, Elem elozo, Elem kovetkezo) {
    this.adat = adat;
    this.elozo = elozo;
    this.kovetkezo = kovetkezo;
    }

    Konstruktoros kérdésem lenne elsősorban: Elem nevű konstruktornak milyen a láthatósága? Privát, Public? (Statikus nem hinném, azt másra használjuk).
    Illetve az idetartozó mezők/adattagoknak is mi a láthatósága?

    Én valamiért mégis a statikusra tippelnék. Ha egy osztály statikus akkor annak az összes adattagnak és tagfüggvényének is statikusnak kell lennie.

    Heló,

    nem ;]

    A "nested class-od" adattagjainak láthatósága alapértelmezetten package.

    remélem tudod, hogy a static class csak belső osztályként jöhet létre (nested class), és nem azt jelenti, hogy ez egy singleton.

    statikus nem a láthatóságra vonatkozik, hanem hogy az adott tag (metódus vagy mező) nem objektum példányhoz, hanem osztály példányhoz tartozik.

    Kicsit több tudást igénylő példa, de ugyanazon nevű osztályból (package nevet is beleértve) szélsőséges esetben több példány is létezhet egy jvm-en belül (egy futtatás alatt), ha azok különböző classloaderekkel lettek betölve. (most nem objektum példányról beszélek, az egyértelmű, hogy egy osztálynak több példánya is lehet) -- A java classloaderek kicsit hasonlítanak a PHP-s auto-load classloaderekhez.

    az osztálytagok (metódus vagy mező) alapértelmezett láthatósága a package. Így ebben az esetben is. Mivel azonban a nested classod privát, ezért kívülről egyébként sem férhetsz hozzá az osztályhoz, így az adattagokhoz sem, csak és kizárólag a tartalmazó osztályból.

    Tehát az Elem osztályod tagjaihoz csak a tartalmazó osztályból férhetsz hozzá, tulajdonképpen magához az osztályhoz is.

    Lehet egy nested class nem statikus is

    Ha a belső osztályod nem static, akkor egyértelműen hozzá van kötve az őt tartalmazó osztály egy példányához. Példányosítani kicsit furcsa szintaxissal kell:

    KulsoOsztaly.BelsoOsztaly belsoPeldany =
    kulsoOsztalyPeldany.new KulsoOsztaly.BelsoOsztaly();

    belső osztályból a tartalmazó külső osztálypéldányra hivatkozni pedig:
    KulsoOsztaly tartalmazoOsztalyPeldany = KulsoOsztaly.this;

    http://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html nézd meg a példakódot

  • modder
    aktív tag

    az appengine-el az a problémám, hogy egyrészt semmi sem szabványos rajta. Másrészt semmitmondó hibaüzeneteket írogat deploykor az ismeretlen komponenseire.
    Az egyetlen dolog amit sikerült futtatni rajta, az a sample project, amiben egy rakás érthetetlen, sehol sem látott dolog van.
    A servletem egyébként pöccre megy jettyvel, meg tomcattel is.
    Ezekkel az a gond, hogy nincs most elérhető szerver, csak a saját gépem, ami nem mehet egész nap, másrészt a jetty állandóan nem utf-8 üzenetes problémákkal száll el ha az üzenetben amit a servlet kap van egy speciális karakter.
    tomcat jó(-nak néz ki), azt leszámítva hogy ahogy látom nem lehet a servletnek tetszőleges elérési utat beállítani, akármit állítok a web.xml-ben, csak http://cím/Servletneve url-el lehet elérni, de a másik félnél meg be van betonozva (mert egy hulladék) hogy http://cím -re küldi az üzeneteket.

    Az appenginere csak annyit, hogy sajnos ez az informatika ilyen, hogy néha meg kell tanulni új dolgokat.
    Az utf8-ra nem tudok hirtelen mit mondani, szerintem annak container szinten nem kéne problémát okoznia, vagy be lehet állítani. (az alábbi linken van egy példa karakter kódolás megváltoztatására)
    Az utolsó bekezdésre viszont állíts be egy szervletet, mint index.html, tehát a defaultra. van külön ilyen beállítás, és onnan indíthatsz belső requestet más szervletekre is valamilyen input paraméter alapján. Lehet, hogy filterrel is meg tudod oldani: http://www.oracle.com/technetwork/java/filters-137243.html

  • modder
    aktív tag

    nem éppen vagyok inkompetens, csak régen szenvedtem ilyen marhaságokkal (szerencsére nem volt szükség rá, mert a lightos minden egyben programokat szeretem, nem az ilyen bugos bloatwareket de most sajnos most nem én csinálom az egész kócerájt, alkalmazkodni kell a servlettel), a servletes kérdés is igazából úgy szólt volna jól hogy "nincs az alkalmazás szervereken kívül valami lightosabb megoldás servlet futtatásra?" és van, a jetty ;)
    De már lényegtelen a guglis téma nem fogom megtanulgatni az n+1. "szabványos, kompatibilis"(és mégsem az sem az) implementációt, inkább összerakok egy kis fogyasztású gépet szervernek azt arra meg azt rakok amit akarok).
    Csak azt nem értem hogy miért olyan ritka a free javas alkalmazásszerver hosting, az undorító php-ból meg annyi van mint a szemét, pedig scriptnyelvként tuti hogy a php zabálja jobban a szervereket.

    Nem tudom mi volt a problémád google appengine-en a servlettel, elvileg azt defaultból tudnia kell, kvázi szabványos szervlet konténert deployolsz föl az appoddal, de van néhány kisebb megszorítás hogy ne lehessen kihasználni végtelen mennyiségű erőforrást, illetve biztonsági megfontolásokból.
    A Java EE alkalmazásokra szerintem egyébként sem pont az egyszerű konfiguráció jellemző. vannak dolgok, amik működnek out of the box kevés konfigurációval, de a komplexebb megoldásoknál elég sok deklaratív beállítás van, amiről nem árt, ha az ember tud.
    -- ellenben a PHP-val, ami elméletileg csak abból áll, hogy feltöltöd a webszerverre és megy. gyakorlatban meg ahány szolgáltató, annyiféle korlátozás lehetséges --

    Amúgy nekem már sikerüt (vannak leírások a neten) deployolni JSF-et (Mojarra) és CDI-t is (Weld) is appengine-re. Persze nem fél óra volt, de aztán működött rendesen...

    Ha nem tetszik a google appengine, próbáld ki a Heroku-t, de nem biztos, hogy azzal kevesebb utána járás lesz.

    Hogy miért nincsenek ingyenes Java hostingok? Hirtelen belegondolva azért, mert kevesebben ismerik olyan szinten, hogy képesek legyenek egy normális weboldalt összehozni velük, így nincs rá akkora igény. Mikor hallani, hogy valaki a sarki suszter weboldalát Java EE alapokon akarja összedobni PHP helyett.
    Akik viszont Java-t használnak webes környezetben, azok inkább cégek, és ők szerintem kifejezetten kerülik az ingyenes alternatívákat, mert nem bíznak benne, hogy az tényleg menni fog minden helyzetben.

  • modder
    aktív tag

    Látszólag elég kezdetleges a két osztály így ha még csak most tanulja a nyelvet és szeretné látni ahogy lefordul a program akkor elég lett volna egy könyvtárba tenni a két osztályt. Természetesen normális esetben az src-n belül van minden java fájl package-el ellátva.

    igazából én is csak hallottam, hogy classpathos problémák lehetnek, ha csak default package van. amúgy nem tudom mi lehet a probléma, nekem jónak tűnik, ha classpath meg van adva javac argumentumként is...

  • modder
    aktív tag

    Hali!
    Windowson az Environment Variables-en belul van (user es system-en belul is) egy CLASSPATH valtozom, aminek a tartalme: .;D:\workspace\Java
    D:\workspace\Java legyen ezentul <path>

    <path>\com\davsx\util\Print.java tartalma:

    package com.davsx.util ;
    import java.io.* ;

    public class Print{
    public static void print(Object o) {
    System.out.println(o) ;
    }
    public static void print() {
    System.out.println() ;
    }
    public static void printnb(Object o) {
    System.out.print(o) ;
    }
    }

    Ezt <path> alol a javac com\davsx\util\Print.java paranccsal leforditottam .class-ra (amit ott is hagytam)

    <path>\PrintTest\PrintTest.java tartalma:

    import static com.davsx.util.* ;

    public class PrintTest
    {
    public static void main(String[] ars){
    print("Hello") ;
    }
    }

    Es amikor probalnam a <path> alol parancssorbol futtatni a javac PrintTest\PrintTest.java parancsot (vagy akar a javac -cp . PrintTest\PrintTest.java -t) a package com.davsx not found hibauzenetet kapom. Mit csinalok rosszul?

    próbáld meg, hogy a PrintTest.java osztályod fejlécében is deklaráold a package-et, ami a könyvtárstruktúrának megfelelően legyen

    package PrintTest;

    Az előttem szólónak ellentmondva javaban mindig használj valamilyen package-et minden osztályhoz.

  • modder
    aktív tag

    ezt a hulladék gugli app enginet használta valaki? Egy servletet szeretnék deployolni rajta, de egyszerűen nem lehet, mert állandóan valami client-ért sír, hogy hiányzik.

    Milyen client? Minden más alkalmazásszerveren megy anélkül...

    "Ezek a servletek hogy is működnek? mármint kell hozzá alkalmazásszerver?
    Van egy egyszerű servletem és azt szeretném működtetni.
    "

    A korábbi hozzászólásaiddal már bebizonyítottad hogy teljesen inkompetens vagy a témában, ennek ellenére olyan felháborodottan írsz a futtatási környezetekről, -- amit nem mellesleg sokan elégedetten használnak -- mintha meglenne az előképzettséged ahhoz, hogy jogosan lefikkantsd olyan emberek munkáját, akik értettek is ahhoz, amit csinálnak.

    Amúgy ha valami problémád van pl. az appengine-nel, mindenki sokkal többre menne, ha részletes információkat adnál a hibáról vagy pl. egy stacktrace-t. De lehet, hogy a megoldásban már az is sokat segítene, ha elolvasnád az appengine wiki-t, mert tényleg nem olyan egyszerű, de az biztos, hogy használható.

  • modder
    aktív tag

    hohó megvan, repoból lejött a teljes ee api... 1 mega az egész :D kár hogy most meg az eclipse-ből tűnt el a run on server opció...

    A Java EE specifikáció elég régóta application server specifikáció. ha egy-egy dolog kell, nem kell hozzá letöltened egy egész application szervert, elég csak megtalálnod azt a projektet, ami tartalmazza a megfelelő package-ket. és ebből több implementáció is van.

    Ha kell neked egy darab szervlet container -- isten tudja miért --, akkor pl. letöltöd a Jetty-t, és elindítod egy sima kliens alkalmazásban.

  • modder
    aktív tag

    Sziasztok!
    Gyakornoknak szeretnék jelentkezni egy céghez, ahova a jelentkezéshez a beugró egy alap könyvtári nyilvántartó program(bármilyen nyelven meg lehet írni).

    Na mármost a java.awt.* és swing osztályokat ismerem, tehát a grafikus felületet megtudom csinálni, de azt nem tudom, hogy hogyan kellene egy adatbázis kezelővel egybegyúrni a programot, mivel azt sajna nem tanultuk még.
    Esetleg azt tudnám megírni, hogy a felvett adatokat kiírja egy szöveges fájlba, és azt olvassa vissza a program megnyitásakor, de ez elég fapados lenne.
    Tudnátok ajánlani valami oldalt, vagy könyvet ami kitér erre a témára, mert ha nem sok idő, akkor talán így a vizsgaidőszakban is lenne rá annyi időm, hogy belejöjjek a témába.

    Köszi :R

    U.i:
    Következő félévben lesz csak Adatbázis kezelésem, szóval biztos hogy hátrányból indulok. :(

    JavaDB ( másik nevén Apache Derby ). Ezt tartalmazza a Java SE, így mindenhol elérhető adatbázismotor. Asztali alkalmazásokhoz kiváló, bár van pár dolog, amit nem tud, pl. nincsen benne full text search.

    Ha egyáltalán nem használtál még semmilyen adatbázist, akkor a tanulás 60%-a inkább az SQL-re fog rámenni, 30% arra, hogyan használd a JDBC-t, maradék 10% meg arra, hogyan lődd be a Derby-t.

    Kiindulásnak http://docs.oracle.com/javadb/ -> http://docs.oracle.com/javadb/10.8.2.2/getstart/index.html

  • modder
    aktív tag

    hát egy 500 soros többszörösen egymásbaágyazott ciklusos függvényes, több bean osztályt használó listákból 50 megás xml-ben több ezer bejegyzést cserélgető programommal próbáltam, ami úgy 5 másodpercig dolgozik a fájlon, és semmit nem írt ki.
    Egy javas áramkör szimulátort is próbáltam viszonylag bonyolult áramkörökkel, ott sem írt semmit.

    Bocsesz, megnéztem a szintaxisát újra, és:
    -XX:+PrintCompilation

    boolean típusú argumentumoknál + a bekapcsolva, - a kikapcsolva.

  • modder
    aktív tag

    kipróbáltam ezt, hátha jó lesz még valamire, de semmit sem ír ki.

    Legyen viszonylag komplex a program: több osztály, több függvény, és fusson sok iteráción keresztül, hogy a profiler megtalálja a hotspotokat.

  • modder
    aktív tag

    @Lacces

    Most találtam neten, ha egy Javás programot console-ból a
    -XX:-PrintCompilation paraméterrel indítod, akkor konzolon ki fogja írni, amikor egy függvény fordításra kerül.

  • modder
    aktív tag

    (Konfigom: 4*3,4ghz-s proci. 2*2+2*4gb ram (ddr3, 1600mhz), Win7 64bit (eredeti), Ati radeon hd 5870-1GB. Ez kell a problémám megértéséhez.)
    Elég régi és eléggé fura jelenségek uralkodnak a gépemen. Maga a hiba az az hogy ha netezek és valami javát használó honlapot nyitok meg, akkor a gép atomra belassul, és legtöbbször egy félperc-perces állás után ki is fagy a java mondván hogy összeomlott. És ez azért fura mert mint fent leírtam egy eléggé erős vasról van szó, így joggal csodálkozom ha 1 darab netböngészőtől fagy, miközben 3 db crysis 2 is simán megy miközben telepítek. Vírus nemvalószínű hogy van a gépen, elég rendszeresen írtom őket. A gép nem töredezett, nincs tele szeméttel, stb, egyszóval eléggé karbantartom a kicsikét, és mégis, egy nyomorult java alapú honlap, vagy egy youtubos vidi elbánik vele. :W A vidikarit is rendszeresen frissítem, akárcsak az oprendszeremet. Namármost nemrég találtam a feladatkezelőben egy eléggé érdekes dolgot, és azt szeretném megtudni hogy az össze függ e ezzel a java problémával. A talált dolog mégpedig az hogy ha a feladatkezelőből, a teljesítmény fülre megyek, akkor ott a szabad memória (úgy hogy megy valami javás honlap) átlagban olyan 0-20MB-on van. Ez normális? Józan paraszt ésszel gondolkodva ennek nem így kén elennie. És azis fura, mint ahogy már említettem, több erősebb program párhuzamos futtatása se terheli le annyira a gépet hogy akadjon, vagy fagyjon, még 1 db youtubos vidi igen.
    (íme egy printscreen a feladatkezelőről. )

    ha Javára gyanakszol, először mindenképpen frissítsd, szerintem.
    Másodszor pedig létezik több JVM monitorozó program.

    Ilyen a Java Visual VM. Kell hozzá JDK-t telepítened, és itt találod meg:
    Java\jdk1.7.0\bin\jvisualvm.exe

    Ha van programozói beállítottságod, akkor ezzel jászogatva talán ráakadsz a problémára (pl. milyen program zabálhatja föl az erőforrásaidat)

    Ha Flashnél is baszkódik (youtube), akkor lehet, hogy a böngésződ a hibás. Nálam a chrome egy időben youtube-nál flash miatt rendszeresen kifagyott, nem is olyan régen.

  • modder
    aktív tag

    Üdv!

    Netbeans 7.1.1
    Weblogic 12cr1

    A programozás JEE platformon c. könyv BooApp példáját szerettem volna futtatni de az alábbi hibaüzenetet kapom:

    Deployment failed. The message was: weblogic.ejb.container.persistence.PersistenceException: In EJB BookBean, the persistence-use element was not specified or could not be associated with a corresponding persistence-type element for a CMP entity bean in the weblogic-ejb-jar.xml descriptor file.

    Értem, hogy mit akar. Viszont megnéztem a kérdéses fájlokat és mégsem értem.
    Van valakinek tippje?

    Én még csak glassfish-t használtam Eclipselinkkel. Weblogic-ban nem vagyok jártas, de
    ez a [link] azt sugallja, hogy ez még EJB 1.1, ami már régi, az EJB 2.0 jobban kitalált kevesebb opciót kér.

    Lehet, hogy a könyv még EJB 1.1-ről beszél, ez esetben szerintem jobban jársz, ha inkább egy on-line tutorial után nézel, ami az újabb verziót tárgyalja

  • modder
    aktív tag

    A kicserélés megvan, az indexOf is, de csak az első " helyét tudom elmenteni, a másodikat nem. Meg még az rejtély számomra, hogy lehetne a két pozíció közti karaktert kiírni.

    http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#substring(int, int)

    http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#indexOf(int, int)
    azaz megkeresed az " első előfordulását, elmented az indexet, ahol van, majd a következő keresését ettől az indextől kezded

  • modder
    aktív tag

    Ez így meg is van, csak mostani állapotában visszaírja a másik fájlba az eredetit plusz a bemenetet, tehát konkrétan a kicserélésnél akadtam meg.

    Akkor a StringBuildernek például az indexOf, replace, insert metódusai lehetnek a barátaid. Ezekkel próbálkozz. Akár a String.replaceAll is mehet végülis. Bár ez regex kifejezést vár, de ha egyébként is felhasználói inputra kell várni, akkor ez nem sokat dob a latba.

    például indexOf operátorral rákeresel a két határoló karakterre, ami között a kicserélendő szöveg van, elmented a két karakter pozicióját, majd StringBuilder.insert metódusával beteszed közéjük az újat. Ilyesmikre kell gondolni.

    Lehet jobban jársz, ha letöltöd az Apache StringUtils könyvtárat. elég hasznos.

  • modder
    aktív tag

    Hali!
    talán ez http://www.javapractices.com/topic/TopicAction.do?Id=42

    itt pedig fönt van egy jó kis ábra, hogy melyik osztályt mire tudod használni:
    http://docs.oracle.com/javase/tutorial/essential/io/file.html

    Én a helyedben azt csinálnám, hogy beolvasnám a fájlt sorról sorra. Megváltoztatnám soronként ami kell, és egyből írnám ki egy másik fájlba (BufferedReader, BufferedWriter). A procedúra végén pedig ezt a tmp fájlt átnevezném az eredeti fájlra.

    A kicserélés könnyen megy String függvényeivel. Reguláris kifejezéseket ne használj, mert Javaban nagyon lassú.

    Ha nem akarod megkeseríteni az életed, akkor arról tegyél le, hogy egy fájlt szimultán olvasol és írsz :D nem is hatékony

Új hozzászólás Aktív témák