Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Апплеты > Тестирование апплета в браузере


Автор: lihusha 1.7.2009, 15:50
Здравствуйте . Подскажите, кто знает , как бороться с кэшированием апплета в Opera ? 
Делаю изменения в апплете , а в браузере -- без изменений . 
После удаления личных данных и закрытия - отрытия браузера - все нормально.
Нельзя ли подгружать новую версию апплета в Opera более простым способом.


С Mozilla и IE -- все нормально.

Автор: LSD 1.7.2009, 16:44
Ctrl+F5 не помогает?

Автор: lihusha 1.7.2009, 16:57
Цитата(LSD @ 1.7.2009,  16:44)
Ctrl+F5 не помогает?

имеется в виду в браузере ?
нет , не помогает

Автор: COVD 3.7.2009, 05:02
Что такое "личные данные"? Обновление кеша должно происходить так (при классическом описании апплета тагом applet) - браузер шлет запрос на сервер и получает время создания (версию) файла аплета (обычно это jar). Если версия отличается от имеющейся в кеше, то файл загружается и кеш обновляется. У меня было предположение, что иногда новая версия не запускается из-за ошибок в апплете и тогда запускается старая версия из кеша. После исправления ошибок (перекомпиляции) новая версия принималась. Но были также и случаи, что новая исправная версия не принималась некоторыми клиентами и им помогало очищение локального кеша (в панели java-plugin: ControlPanel->Java->General-> TemporaryInternetFiles). Для полного избавления от проблемы мы просто переименовывали jar файл, добавляя к его имени номер версии (соответственно надо редактировать html). Хлопотно, но надежно. 

А искать причину, почему именно в какой-то Опере что-то не срабатывает - тухлое дело. Пока разберетесь, выйдут новые версии и в Опере будет срабатывать, но не будет срабатывать в Оперетте. Хотя java-plugin и улучшен в последних версиях java (но и новых багов наверное добавили как водится), все же смешивать коктейль из технологий (html, апплет) лучше избегать. На мой взгляд. Надежнее что-то одно. Или html интерфейс, или java (например, WebStart).   

Автор: lihusha 3.7.2009, 12:16
Спасибо , COVD, это действетельно надежный способ.
Цитата

все же смешивать коктейль из технологий (html, апплет) лучше избегать.


Что Вы имеете в виду ?
Вообще не использовать  апплеты ?

У Вас случайно не завалялась ссылка на туториал по WebStart для начинающих ?

Автор: COVD 3.7.2009, 18:28
Цитата

Что Вы имеете в виду ?
Вообще не использовать  апплеты ?


Если значительная часть функциональности приложения приходится на апплет, то лучше перейти полностью на java WebStart. Наоборот, если апплет служит лишь небольшой добавкой к html интерфейсу (календарь какой-нибудь), то может быть лучше попытаться сделать то же самое на javascript. 

Однако Sun предприняло усилия по продвижению java в интернет и сейчас у апплетов уже нет былых ограничений по памяти и влияние браузера уменьшено, т.е. апплеты приблизились к возможностям WebStart приложения. Как на самом деле я не знаю, потому что мы давно отказались от апплетов в пользу WebStart. 

Кроме того, недавно появилась технология JavaFX, которая базируется на WebStart и работает в том числе и в браузере как часть html интерфейса. Это тоже альтернатива апплетам - http://javafx.com/samples/.

Цитата

У Вас случайно не завалялась ссылка на туториал по WebStart для начинающих ?


http://java.sun.com/docs/books/tutorial/deployment/webstart/index.html




Автор: lihusha 3.7.2009, 22:53
Весьма признателен Вам за информацию.

Добавлено через 14 минут и 30 секунд
Общая информация.
В моем случае в работе клиент-серверного приложения возникает исключение (повторюсь , только в опере).
Вот часть стектрейса данного исключения.

Код

at com.opera.URLConnection.getInputStream(URLConnection.java:125)


импорта com.opera.URLConnection и близко нет в моем исходнике...


Исключение возникло в сточке 

Код

//connection -- HttpURLConnection;
InputStreamReader reader = new InputStreamReader(connection.getInputStream(),"UTF-8");


Так, апплет должен соединиться с сервером, но тут вмешивается браузер опера и подставляет какие-то свои данные.

Автор: COVD 3.7.2009, 23:43
Что сообщает исключение?

Автор: lihusha 3.7.2009, 23:49
exception.getMessage() = имя сервера

Автор: COVD 4.7.2009, 15:19
Цитата

exception.getMessage() = имя сервера

 smile 

Если это действительно проблема в Опере и люди с этим сталкивались, то поиск в интернете по тексту исключения даст ссылки на обсуждения. Также возможно это ваша неточность в применении HttpURLConnection - другие браузеры "прощают", а Опера - нет? Приведите код. 
Можно также посмотреть, что браузер отправляет-принимает с сервера для разных типов браузеров. Для этого надо установить анализатор сетевого трафика. Например, бесплатный http://www.wireshark.org/ .   

Автор: lihusha 4.7.2009, 16:06
Часть кода метода , использующего HttpURLConnection

Код

//String serverUrl = "адрес сервера";
URL server = new URL(getCodeBase(),serverURL);
HttpURLConnection connection = (HttpURLConnection) server.openConnection();
connection.setDoOutput(true);

String time = "someData";
String data = URLEncoder.encode("mode", "UTF-8") + "=" + URLEncoder.encode("update", "UTF-8");
data += "&" + URLEncoder.encode("time", "UTF-8") + "=" + URLEncoder.encode(time, "UTF-8");

OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(),"UTF-8");

writer.write(data);
writer.flush();
//пробовал закрывать поток и оставлять его открытым
//writer.close();

InputStreamReader reader = new InputStreamReader(connection.getInputStream(),"UTF-8");
int read = 0;
String encodeMessages = "";
for (; (read = reader.read()) != -1;)
{
     encodeMessages += (char) read;
}
reader.close();
String decodeMessages = URLDecoder.decode(encodeMessages, "UTF-8");


Автор: COVD 4.7.2009, 16:55
У вас ведь POST, а по умолчанию GET. Поэтому надо явно указать 
Код

connection.setRequestMethod("POST");

Автор: lihusha 4.7.2009, 17:11
Цитата(COVD @  4.7.2009,  16:55 Найти цитируемый пост)
У вас ведь POST, а по умолчанию GET. Поэтому надо явно указать код Java1:connection.setRequestMethod("POST");


не помогло

Автор: COVD 4.7.2009, 19:20
Вы его в нужном месте поставили? 
Код

URL server = new URL(getCodeBase(),serverURL);
HttpURLConnection connection = (HttpURLConnection) server.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");


Других гипотез у меня нет. Проверьте как-нибудь, отправляются ли данные на сервер. Это происходит в момент когда вы переходите к чтению,т.е. на вызове 
Код

InputStreamReader reader = new InputStreamReader(connection.getInputStream(),"UTF-8");

После этой строки уже ничего писать в данное соединение нельзя, поэтому writer можно перед чтением смело закрывать.

Автор: lihusha 4.7.2009, 19:30
Цитата(COVD @  4.7.2009,  19:20 Найти цитируемый пост)
Вы его в нужном месте поставили? 


Да , именно здесь.

Цитата(COVD @  4.7.2009,  19:20 Найти цитируемый пост)
Проверьте как-нибудь, отправляются ли данные на сервер.


Проверил , данные не отправляются.
Но -- не отправляются , опять же , именно в опере.






Автор: COVD 5.7.2009, 02:53
lihusha . Поздравляю! Вы не одиноки в вашей беде. С Оперой мучается и другие: 

http://forums.sun.com/thread.jspa?threadID=5253606 - 

Цитата

applet works fine in firefox, ie and netscape navigator
when running on opera, POST arguments are not send.. i don`t know why.. :(


Коммерческий сайт предлагает решение http://www.experts-exchange.com/Programming/Languages/Java/J2SE/Q_23849336.html, но там надо подписаться на 30 дней trial c кредитной карточкой. И еще не известно, что они насоветуют.

Как я понял, Опера не использует java-plugin (как остальные "лохи"), а идет каким-то своим путем. Поэтому, наверное, в исключениях у вас и всплыло это com.opera.URLConnection. 

В общем, вам удачи в поиске решения. А я еще раз убедился как же правильно мы сделали, что полностью избавились от творчества разных энтузиастов браузеростроения.



Автор: lihusha 5.7.2009, 10:35
Цитата(COVD @  5.7.2009,  02:53 Найти цитируемый пост)
А я еще раз убедился как же правильно мы сделали, что полностью избавились от творчества разных энтузиастов браузеростроения.


Можно поподробнее -- что Вы имеете в виду ?

Автор: COVD 5.7.2009, 16:41
у нас почти 100% интерфейса приходилось на апплет и мы перешли на вебстарт. Теперь браузер (дефолтный) используется только на старте приложения для загрузки jnlp файла, т.е. минимально.  

Автор: lihusha 5.7.2009, 18:32
Спасибо Вам за информацию

Автор: lihusha 5.7.2009, 20:44
COVD, а можно ссылки на сайты , где используется web start ?
Я нашел несколько , мне показалось , они (приложения с web start) очень долго грузятся. 
Хотелось увидеть их побольше в действии.

Коково лично Ваше мнение о скорости их загрузки на клиента ?


P.S. Скорость моей линии -- 1 Мб/с

Автор: LSD 6.7.2009, 11:41
На мой взгляд проблема надумана. В реальности апплет будет меняться не часто, гораздо реже чем пользователь будет перезапускать браузер.

Автор: lihusha 6.7.2009, 17:27
Цитата(LSD @  6.7.2009,  11:41 Найти цитируемый пост)
На мой взгляд проблема надумана. В реальности апплет будет меняться не часто, гораздо реже чем пользователь будет перезапускать браузер.


Не знаю , правильно ли я Вас понял. Если правильно -- решение данной проблемы и создание топика вызвано необходимостью РАЗРАБОТКИ апплета.
Например , если я меняю фон текстового поля с желтого на зеленый , то хочу сразу же увидеть это изменение при запуске апплета в браузере.

Автор: LSD 6.7.2009, 19:33
Цитата(lihusha @  6.7.2009,  17:27 Найти цитируемый пост)
Не знаю , правильно ли я Вас понял. Если правильно -- решение данной проблемы и создание топика вызвано необходимостью РАЗРАБОТКИ апплета.

А что мешает вести разработку используя другой браузер, а Оперу использовать только в конце для окончательного тестирования?

Автор: lihusha 6.7.2009, 20:42
Цитата(LSD @  6.7.2009,  19:33 Найти цитируемый пост)
А что мешает вести разработку используя другой браузер, а Оперу использовать только в конце для окончательного тестирования?


Уже ничего.
Я понял , что самый эффективный способ -- менять версию в тэге апплета.

Код

<applet
            archive="ChatClient.jar?v=23235"
            .....
/applet>


т.е., если изменить число 23235 , апплет будет подгружен новый.

Но, проблема с потоком все же остается для оперы.

Автор: COVD 7.7.2009, 03:25
Цитата

На мой взгляд проблема надумана. В реальности апплет будет меняться не часто, гораздо реже чем пользователь будет перезапускать браузер. 

Проблема (по крайней мере, о которой я писал) в том, что дефолтный (простой и удобный) механизм автоматического обновления версии апплета на клиенте иногда дает сбой - на сервере апплет (jar) поменяли, а клиент его не загружает (при перезапуске, конечно). Не только в Опере. Наиболее неприятна эта ситуация в клиент-сервер приложении, когда изменения сделаны и на сервере и на апплете (протокол обмена, например). В этом случае старая версия апплета не будет работать или, что хуже, будет работать некорректно. Конечно, при таком апдейте надо как-то форсировать клиентов обновить версию. Это дополнительные усилия. Субьективно, в WebStart, аналогичный дефолтный механизм работает лучше.  По крайней мере, так было ( сейчас, может, апплеты "подтянулись"?   smile  )

Добавлено через 8 минут и 45 секунд
Цитата

Я нашел несколько , мне показалось , они (приложения с web start) очень долго грузятся. 
Хотелось увидеть их побольше в действии.

Коково лично Ваше мнение о скорости их загрузки на клиента ?


У апплетов и WebStart вроде нет принципиальных различий - время загрузки jar'a приложения зависит от его размера. Если приложение большое, то удобно его разбить на несколько более мелких jar'ов - библиотек. Тогда при обновлениях неизмененные библиотеки перезагружать не придется.
  

Автор: LSD 7.7.2009, 11:41
В свое время видел подобную рекомендацию для внешних JS файлов, но она в полной мере подходит и к апплетам (и Flash, и CSS и т.п.).
Просто добавлять к имени файла timestamp, т.е что-то наподобие того что предложил lihusha, но с некоторыми отличиями.
Код

<applet
            archive="ChatClient-23235.jar"
            .....
</applet>

Разница состоит в том, этот подход требует обязательной согласованности HTML и апплета. С одной стороны дополнительная работа, с другой в случае такого рассогласования мы сразу увидим ошибку.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)