NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Apache Velocity - template tvořený z hashmapy dvou hashmap

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
nalimleinad
Člen
Avatar
nalimleinad:25.7.2016 10:09

Zdravím, dělám prvně s touto templatovou knihovnou a potřeboval bych vygenerovat playlist včetně písniček pro jPlayer.

Můj template vypadá takto:

**#foreach( $playlist in $playlists )
    ("$playlist.playlistnumber").click(function() {
                myPlaylist.setPlaylist([
        #foreach( $file in $fileList )
    {
      title:"$file.title",
      artist:"ARTIST",
      mp3:"music/$file.filename",
      poster: "images/m0.jpg"
    },
    #end
                ]);
        });
#end**

A funkce pro generování:

HashMap<HashMap<String, String>, HashMap<String, String>> hm = new HashMap<HashMap<String, String>, HashMap<String, String>>();

        for (int i = 0; i<listFiles.size(); i++) {
            HashMap<String, String> playlists = new HashMap<String, String>();
            HashMap<String, String> songs = new HashMap<String, String>();
            playlists.put("playlistnumber", "playlist" + i);

            for (int j = 0; j<listFiles.get(listDirectories().get(i)).size(); j++) {
                songs.put("filename", listFiles.get(listDirectories().get(i)).toString());
                songs.put("title", prefix + Integer.toString(i+1));
            }
            hm.put(playlists, songs);
        }

        System.out.println("hm: " + hm);

        VelocityContext context = new VelocityContext();
        context.put("playlists", hm);
        context.put("fileList", list);

Jako output dostanu:

hm: {{playlistnumber=playlist0}={title=1, filename=[C:\Data\java_workspace\Demo example file generator\music\analfabet\00c0af12-3f94-4ce6-b1ca-704f24c77941.mp3]}, {playlistnumber=playlist1}={title=2, filename=[C:\Data\java_workspace\Demo example file generator\music\dálava\00c0af12-3f94-4ce6-b1ca-704f24c77941.mp3]}, {playlistnumber=playlist2}={title=3, filename=[C:\Data\java_workspace\Demo example file generator\music\erb\00c0af12-3f94-4ce6-b1ca-704f24c77941.mp3]}}

což vypadá, že je v pořádku a v takovém formátu, jaký potřebuju, avšak output z templatu vypadá takto:

("$playlist.playlistnumber").click(function() {
            myPlaylist.setPlaylist([
                    ]);
    });
("$playlist.playlistnumber").click(function() {
            myPlaylist.setPlaylist([
                    ]);
    });
("$playlist.playlistnumber").click(function() {
            myPlaylist.setPlaylist([
                    ]);
    });

Dělá někdo s Velocity, popř. byl by schopný mi napovědět, kde dělám chybu ?

 
Odpovědět
25.7.2016 10:09
Avatar
nalimleinad
Člen
Avatar
nalimleinad:25.7.2016 10:51

Upravil jsem template na:

#foreach( $playlist in $playlists.keySet() )
    ("$playlist.playlistnumber").click(function() {
                myPlaylist.setPlaylist([
        #foreach( $filename in $playlist )
    {
      title:"$playlist.playlistNumber.title",
      artist:"GAIA",
      mp3:"music/$playlist.playlistnumber.filename",
      poster: "images/m0.jpg"
    },
    #end
                ]);
        });
#end

A z outputu už mi leze již půlka v pohodě:

("playlist0").click(function() {
                myPlaylist.setPlaylist([
            {
      title:"[playlistnumber=playlist0]",
      artist:"ARTIST",
      mp3:"music/$playlist.playlistnumber.filename",
      poster: "images/m0.jpg"
    },
                ]);
        });
    ("playlist1").click(function() {
                myPlaylist.setPlaylist([
            {
      title:"[playlistnumber=playlist1]",
      artist:"ARTIST",
      mp3:"music/$playlist.playlistnumber.filename",
      poster: "images/m0.jpg"
    },
                ]);
        });
    ("playlist2").click(function() {
                myPlaylist.setPlaylist([
            {
      title:"[playlistnumber=playlist2]",
      artist:"ARTIST",
      mp3:"music/$playlist.playlistnumber.filename",
      poster: "images/m0.jpg"
    },
                ]);
        });

Nyní bych se však potřeboval dostat do vnitřních hodnot jednotlivých playlistů, což se mi nedaří.

 
Nahoru Odpovědět
25.7.2016 10:51
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Atrament:25.7.2016 22:24

Nemůže bejt chyba, že v tom vnořeném for-cyklu používáš i místo j?

for (int j = 0; j<listFiles.get(listDirectories().get(i)).size(); j++) {  //deklaruješ proměnnou j
                songs.put("filename", listFiles.get(listDirectories().get(i)).toString()); //ale v cyklu samotném používáš i a j není nikde použito
                songs.put("title", prefix + Integer.toString(i+1));
}

Popravdě jsem to moc pečlivě nezkoumal co to dělá, takže jsem možná mimo, a má to tak být, akorát, že mě to praštilo do očí :)

 
Nahoru Odpovědět
25.7.2016 22:24
Avatar
nalimleinad
Člen
Avatar
nalimleinad:25.7.2016 22:41

Je pravda, že ho tam zbytečně deklaruju, ale ničemu to nevadí. Měl jsem ho tam předtím ještě na další účely, každopádně jak píšu výše - output z javové funkce mi leze správný, jen ho potřebuji nějak dostat do template filu.

 
Nahoru Odpovědět
25.7.2016 22:41
Avatar
nalimleinad
Člen
Avatar
nalimleinad:1.8.2016 13:38

Tak jsem problém vyřešil úpravou funkce na

HashMap<HashMap<String, String>, TreeMap<String, String>> output = new HashMap<HashMap<String, String>, TreeMap<String, String>>();
        TreeMap<String, String> playlistFiles = new TreeMap<String, String>();
        ArrayList<String> filenames = new ArrayList<String>();

        for (int i = 0; i < listFiles.size(); i++) {
            HashMap<String, String> playlist = new HashMap<String, String>();

            playlist.put("playlistnumber", "playlist" + i);

            filenames = listFiles.get(listDirectories().get(i));

            playlistFiles = new TreeMap<String, String>();
            for (int j = 0; j < filenames.size(); j++) {
                playlistFiles.put(prefix + Integer.toString(j + 1), listDirectories().get(i) + "/" + filenames.get(j));
            }

            output.put(playlist, playlistFiles);
        }

a template filu na:

#foreach( $playlist in $playlists.keySet() )
    $("#$playlist.playlistnumber").click(function() {
        myPlaylist.setPlaylist([
    #set ($map = $playlists.get($playlist) )
    #foreach( $mapEntry in $map.entrySet() )
    {
            title:"$mapEntry.key",
            artist:"ARTIST",
            mp3:"music/$mapEntry.value",
            poster: "images/m0.jpg"
            },
    #end
    ]);
    });
#end

Vše nyní funguje jak má :)

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
1.8.2016 13:38
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Odpovídá na nalimleinad
Atrament:2.8.2016 0:02

Diamond operátor znáš? Pokud ne tak věz, že

HashMap<HashMap<String, String>, TreeMap<String, String>> output = new HashMap<HashMap<String, String>, TreeMap<String, String>>();

se od verze javy 7 dá zapsat takto:

HashMap<HashMap<String, String>, TreeMap<String, String>> output = new HashMap<>();

a když už jsem v tom, tak ještě líp by to bylo

Map<Map<String, String>, Map<String, String>> output = new HashMap<>();

programujeme oproti interface, ne oproti implementaci ;)

 
Nahoru Odpovědět
2.8.2016 0:02
Avatar
nalimleinad
Člen
Avatar
Odpovídá na Atrament
nalimleinad:2.8.2016 8:11

Java 7 ? To je něco z budoucnosti ? :-O

Díky za info, do budoucna na to budu myslet. ;-)

 
Nahoru Odpovědět
2.8.2016 8:11
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na nalimleinad
ostrozan:2.8.2016 8:29

Java 7 ? To je něco z budoucnosti ? :-O

I ty šprýmaři - aktuální je java 8 a devítka se chystá

 
Nahoru Odpovědět
2.8.2016 8:29
Avatar
nalimleinad
Člen
Avatar
Odpovídá na ostrozan
nalimleinad:2.8.2016 21:06

To já vím, jen si dělám srandu :)

Bohužel nepíšu v javě tak moc, jak bych si možná i přál, takže určité znalosti mi stále trochu chybí, každopádně zapamatuji si a budu používat. ;-)

 
Nahoru Odpovědět
2.8.2016 21:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.