Блог само за Java

Научете се да програмирате в Java от нулата

jnlp
API на JNLP Позволява на неподписано приложение да работи в пясъчник и в същото време да получи сигурен достъп до локални ресурси. Например, той предоставя услуги за изтегляне и запазване на файлове. Приложенията не могат да виждат файловата система и не могат да посочват имена на файлове.

Вместо това се показва диалогов прозорец за файл и потребителят на програмата избира файл. Преди да се появи диалоговият прозорец за избор на файлове, потребителят е предупреден и трябва да се съгласи да продължи. Освен това API всъщност не предоставя на програмата достъп до обекта File.

По-специално приложението не може да намери файла самостоятелно. Следователно програмистите са снабдени с инструменти за изпълнение на действия за отваряне и запазване на файл, но системната информация е максимално скрита от съмнителни приложения. API предоставя на разработчика следните възможности:

  • Зареждане и запазване на файлове.
  • Достъп до клипборда.
  • Печат.
  • Показване на документ в стандартен браузър.
  • Съхранение и извличане на данни за конфигурация.
  • Инструменти за гарантиране, че се изпълнява само един екземпляр на приложение (тази функция е въведена в Java SE 5.0).

За да се възползвате от тези функции, трябва да използвате класа ServiceManager, нещо подобно:

Ако съответната функция не е налична, се изхвърля UnavailableServiceException.

За да компилирате програма, която използва JNLP API, трябва да включите файла javaws.jar в пътя за търсене на класа. Този файл се намира в поддиректорията jre/lib на директорията JDK.

Сега ще преминем към дискусия за най-полезните функции на JNLP. За да запазите файла, трябва да посочите в диалоговия прозорец предложения за оригиналния път и разширение на файла, както и данните за запазване и предложеното име на файла. Нека разгледаме пример:

Данните трябва да бъдат доставени на InputStream. Понякога тази задача е доста трудна. Програмата в края на статията използва описаната по-долу стратегия.

  1. Екземпляр от класа ByteArrayOutputStream е създаден за съхраняване на байтовете, които трябва да бъдат записани на диск.
  2. Създава се екземпляр на клас PrintStream и изпраща тези данни към ByteArrayOutputStream.
  3. Информацията, която трябва да се съхранява в потока за печат, се извежда в PrintStream.
  4. Създава се екземпляр от класа ByteArrayInputStream и чете съхранените байтове.
  5. Потокът се предава на метода saveFileDialog ().

Потоците са описани по-подробно в този раздел. Междувременно можем да игнорираме подробностите, посочени в демонстрационната програма в края на урока.

За четене на данни от файл се използва класът FileOpenService. Неговият метод openFileDialog () получава оригиналния път и файлови разширения и връща обект от класа FileContents. След това можете да извикате метода getInputStream () и да прочетете данните от файла. Ако потребителят не е избрал файл, методът openFileDialog () връща null.

Моля, обърнете внимание, че вашето приложение не знае името и местоположението на файла. За разлика от това, ако искате да отворите конкретен файл, използвате ExtendedService.

Потребителят на вашата програма трябва да разреши достъп до файла (вижте фиг. 2).

java
Фиг. 2. Предупреждение за достъп до файлове

За показване на документ в стандартен браузър (подобно на метода showDocument () за аплети) се използва интерфейсът BasicService. Моля, обърнете внимание, че на някои системи не е инсталиран стандартен браузър.

Съществува остарял метод PersistentService (), който позволява на приложението да запазва малки количества информация за конфигурацията и да го извлича, ако приложението се рестартира. Тази функция е подобна на механизма за бисквитки, използван с HTTP протокола. URL адресите се използват като ключове. Тези URL адреси не трябва да водят към реални ресурси. Те представляват само удобна йерархична схема за именуване на файлове.

За всеки URL ключ приложението може да пише произволни двоични данни. Обемът на записа може да бъде ограничен от размера на блока.

За да изолира приложението едно от друго, всяко приложение трябва да използва URL адрес, който започва с името на сървъра, който съдържа неговия код, както е посочено в JNLP файла. Например, ако дадено приложение е изтеглено от уеб страницата http://pro-java.ru/apps, то то може да използва само ключове от формата http://pro-java.ru/apps/subkey1/subkey2/. Опитът за достъп до други ключове очевидно ще бъде неуспешен.

Създава се нов ключ, използвайки метода create () на класа PersistenceService:

FileConents съдържание = service.get (url);
InputStream в = contents.getInputStream ();
OutputStream out = contents.getOutputStream (вярно);
// вярно = презапис

За съжаление е доста трудно да се определи дали посоченият ключ съществува или трябва да бъде пресъздаден. Можем само да се надяваме, че ключът съществува и да извикаме метода get. Ако това изхвърли FileNotFoundException, трябва да се създаде нов ключ.

Започвайки с Java SE 5.0, както Java Web Start, така и аплетите могат да отпечатват данни с помощта на обикновени API. Това показва диалогов прозорец, който иска от потребителя съгласие за достъп до принтера.

Програмата, чийто код е даден по-долу, е модификатор на приложението, което реализира калкулатора. Този калкулатор има виртуална хартиена лента, върху която се записват резултатите от всички изчисления. Списък с всички предишни изчисления може да бъде запазен и прочетен от файл.

За да демонстрира постоянно съхранение на данни, приложението ви позволява да зададете заглавка на кадър. Ако програмата се стартира отново, тя ще извлече този заглавие от постоянното хранилище (вижте фиг. 3).

стандартен браузър
Фиг. 3. Приложение WebStartCalculator

Ето изходния код на програмата: