Wykorzystanie dynamicznych zasobów w Play Framework
ProgramowanieW jednym z najlepszych frameworków MVC dla Javy - Play Framework, tzw. assets czyli zasoby publiczne (arkusze styli, skrypty JavaScript, obrazy itd.) składowane są w folderze public. Podczas uruchamiania w trybie produkcyjnym następuje ich wkompilowanie w paczkę wynikową i nie mogą podlegać późniejszym zmianom.
Na pewno niejednokrotnie jako programiści spotkaliście się z sytuacją, kiedy to generujemy dane dynamicznie za pomocą jakiegoś algorytmu, a na wyjściu chcemy je zapisać w lokalizacji do późniejszej obróbki lub pobrania (pomijając kwestię formatu bo to nieistotne w tym wpisie), bądź po prostu składujemy pliki użytkownika np. załadowane do aplikacji. Nic nadzwyczajnego, rzekł bym rutynowa sprawa i owszem.
Lecz w jednym z najlepszych frameworków MVC dla języka Java (i Scala) - Play Framework, tzw. assets czyli zasoby publiczne (arkusze styli, skrypty JavaScript, obrazy itd.) składowane są w folderze public. Podczas uruchamiania w trybie produkcyjnym następuje ich wkompilowanie w paczkę wynikową i nie mogą podlegać późniejszym zmianom. Niezwykle optymalizuje to zasoby, co oczywiście jest wysoce pożądane, aczkolwiek może pokrzyżować nasze plany składowania w tymże folderze (również w pod folderach) plików dynamicznie ulegających zmianom.
Rozwiązaniem tego problemu jest użycie wbudowanego od wersji 2.0.6 frameworka, kontrolera ExternalAssets, który właśnie służy do tego celu. Zakładając, że pliki takie będziemy umieszczać w folderze files w katalogu głównym naszej aplikacji, wystarczy dodać w pliku routingu (routes) np. następujący wpis:
Co tłumaczymy: podczas żądania typu GET przy akcji files/tutaj_nazwa_pliku, wywołaj kontroler ExternalAssets podając jako ścieżkę /files oraz nazwę żądanego pliku który się pod nią znajduje. Spowoduje to oczywiście zwrócenie jego zawartości.
Wcześniej musieliśmy tego typu problem obsługiwać samodzielnie, pisząc własny kontroler. Aktualnie wbudowana wersja jest naprawdę przyjemna i przede wszystkim napisana w języku Scala.