Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSP — с чего начать? 
V
    Опции темы
diablero
Дата 1.8.2007, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



День и свежая голова результатов не дали. Нашел кучу тем с аналогичной проблемой. И те решения которые в них предлагали у меня не работают. 



--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 2.8.2007, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Я сейчас тоже поэкспериментировал с разными вариантами, выявил туеву хучу новых нюансов по сравнению с временами, когда делал предыдущие проекты.

Короче, предлагаю такое окончательное решение. Для всех страниц:

Код

public void service(...) throws ... {
    // ...
    Page page = worker.execute(request, response);
    if (page.getRedirectUrl() != null) {
        response.sendRedirect(page.getRedirectUrl());
    } else {
        response.addHeader("Cache-Control","private, no-cache");
        response.setDateHeader("Last-Modified", page.getStartDate().getTime()); // просто для порядка
        Writer writer = response.getWriter();
        // ...
    }
}


В воркере ConfirmationWorker дополнительно:

Код

response.addHeader("Cache-Control","no-store"); // for FF
response.setDateHeader("Expires", 0); // просто на всякий случай


У меня в таком варианте получается так:
  • Firefox 2.0.0.5 - работает в точности как задумывалось:
    • при переходе по ссылке или по вводу адреса всегда забирает страницу с сервера;
    • по кнопкам взад-вперед отображает страницы из кэша;
    • страницу подтверждения всегда забирает с сервера:
     
  • Internet Explorer 7 (ох и тупорылый же интерфейс у него) - слишком близко к сердцу воспринимает директиву Cache-Control: no-cache. Ее одной достаточно, чтобы браузер каждый раз брал страницу с сервера, включая навигацию по кнопкам вперед-назад. Побороть не удалось, в сети тоже ничего не нарыл.

  • Opera 9.10 - обычные страницы отрабатывает как положено, но страницу подтверждения при навигации по кнопкам вперед-назад категорически берет из кэша. Гуголь также ничем не помог.
Как видим, универсального решения для всех браузеров найти пока не удалось. И ведь это только три браузера в трех отдельных версиях! А ведь есть еще браузеры постарее. И версии для других платформ. И просто другие браузеры. А сколько их еще будет в будущем?

Короче, вердикт: ну их всех нахер. Мы не собираемся гробить еще кучу времени на поиск идеального решения, которого, по всему выдать, все равно не существует. Будем ориентироваться на Firefox, как на наиболее стандартопослушный браузер. А кто не спрятался - мы не виноваты. На всех все равно не угодить.

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

Возражений нет? Тогда прошу зип в студию.


Это сообщение отредактировал(а) Stampede - 2.8.2007, 00:15


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 2.8.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



А у меня получаеться так:
Firefox 1.0 RC1 (такой вот древний) работает как и опера. Все берут из кэша.
IE 6.0 работает также как и твой 7.0

Я вообще всегда думал, что по части веба, все равняются на IE... Как самый массовый и правильный по отображению кода браузер.


Это сообщение отредактировал(а) diablero - 3.8.2007, 00:21

Присоединённый файл ( Кол-во скачиваний: 65 )
Присоединённый файл  Infinite1.1.3.5.zip 29,14 Kb


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
batigoal
Дата 2.8.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Цитата(diablero @  2.8.2007,  15:20 Найти цитируемый пост)
Я вообще всегда думал, что по части веба, все равняются на IE... Как самый массовый и правильный по отображению кода браузер.

В толпе разработчиков такая фраза вызывает бурный смех smile
Насчет массовости - возможно, но вот в следовании стандартам его упрекнуть сложно. Зачастую ребята из MS пытаются создать свои, а не поддерживать существующие.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
diablero
Дата 2.8.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Цитата(batigoal @  2.8.2007,  15:11 Найти цитируемый пост)
В толпе разработчиков такая фраза вызывает бурный смех

А какой браузер не вызывает смех?
Опера, которая отображает простой html код не так как положенно. Я конечно уважаю этот браузер, но косяков за ним достаточно.

Это сообщение отредактировал(а) diablero - 2.8.2007, 19:06


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 2.8.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Цитата(batigoal @  2.8.2007,  06:11 Найти цитируемый пост)
Цитата(diablero @  2.8.2007,  15:20 Найти цитируемый пост)
Я вообще всегда думал, что по части веба, все равняются на IE... Как самый массовый и правильный по отображению кода браузер.

В толпе разработчиков такая фраза вызывает бурный смех smile


Тут на самом деле вот какое дело. IE  - это один из самых глючных браузерв, в плане следования стандартам. НО! - так уж сложилось - до сих пор самый массовый. Потому что рядовым пользователям, как правило, нет никакого дела до всяких там стандартов: что пришло с виндой, то и ладно. Процент посетителей, использующих IE, по разным прикидкам (и для разных целевых аудиторий) составляет 75-90%. Хотя надо сказать, с появлением Firefox эта цифра маленько ушла вниз, но все равно не до такой степени, чтобы серьезно подвинуть позиции Мелкософтного браузера.

Что остается разработчикам в такой ситуации? Правильно, "мыши плакали, кололись, но продолжали есть кактусы". То есть при любых раскладах необходимо кровь из носу обеспечить, чтобы в IE работало, как задумывалось. Но тут есть два принипиально разных подхода.
  • Можно сразу верстать в расчете на IE, а потом смотреть, как это будет выглядеть в других браузерах.
  • А можно - стараться делать по теории, по стандартам. И уже для IE искать и находить всякие хаки, чтобы заставить его работать как должно.

Так вот, второй подход - он идеологически более правильный. Потому что идет от общемировых, так сказать, принципов, закрепленных в спецификациях. [голосом пьяного Мягкова] "Это документ, между прочим" smile

Но ладно, это хоть и методологическая, но в общем-то лирика. Теперь по заданию. 

1. Ты в коде воркеров везде объявляешь и инициализируешь классовую переменную page. А ведь она у нас специально объявлена как protected в AbstractWorker, и там же и инициализируется. А ты ее, получается, перебиваешь. А что если у нас со временем добавятся дополнительные действия? Например, я хотел тебе предложить добавить в Page такой метод:

Код

public void setUser(User user) {
    this.user = user;
    if (user != null) {
        put("user", user);
    } else {
        remove("user");
    }
}


И чтобы этот метод вызывался при аутентификации по кукисам, то есть в общей для всех воркеров части кода, AbstractWorker.execute(). А иначе у тебя получается, что Velocity-переменная $user попадает в контекст только в HomeWorker . Соответственно, из-за этого на других страницах приветствие отображается неправильно (кстати, ты там зря вводишь дополнительно $flag="login", достаточно самой переменной $user).

2. Я в предыдущем посте намеком предложил тебе завести в Page переменную startDate. Ее смысл в том, чтобы использовать единое значение времени во всех местах, где оно понадобится (а оно таки еще понадобится многократно). Это предотвратит бессистемное использование несогласованых дат и сэкономит немножко времени на создание множественных new Date(). Инициализировать startDate, понятное дело, лучше в конструкторе Page. Заодно ее же можно положить в контекст, чтобы обеспечить доступ к ней из шаблонов.

В остальном вроде все нормально. Следующим шагом мы создадим мини-фреймворк для работы с формами, и с его помощью приделаем регистрацию новых пользователей и ввод/редактирование постов.

Но сначала нужно внести коррективы по списку (особенно п. 1) и перезалить.



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
batigoal
Дата 2.8.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Цитата(diablero @  2.8.2007,  19:59 Найти цитируемый пост)
А какой браузер не вызывает смех?

Обычно - FF.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
diablero
Дата 2.8.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Изменил и перезалил
З.Ы. Из-за всяких халявщиков, отпускников, работаю сутки через сутки. Так что пока, времени мало...

Это сообщение отредактировал(а) diablero - 3.8.2007, 00:05


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 3.8.2007, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Нет, все равно немного не так. У тебя после исправления:

Код

public class HomeWorker extends AbstractWorker implements Worker {
    protected Page page;

    public Page execute(HttpServletRequest request, HttpServletResponse response) {
        page = super.execute(request, response);
        page.put("content", "home.vm");
        return page;
    }
}



А надо бы:

Код

public class HomeWorker extends AbstractWorker implements Worker {
    public Page execute(HttpServletRequest request, HttpServletResponse response) {
        super.execute(request, response);
        page.put("content", "home.vm");
        return page;
    }
}


Но да ладно, не бери в голову. У меня созрела мысля, как все это дело оформить в менее запутанном виде. Но это все завтра. Щас - отдыхать smile



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 3.8.2007, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



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


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 3.8.2007, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Цитата(diablero @  2.8.2007,  15:23 Найти цитируемый пост)
А нашу задачу, по обновлению страниц, можно решить с помощью javascript?


Нет, нельзя. Даже если ты по клику подменишь переход по ссылке на код типа window.location = '/', браузер в своем решении о том, откуда брать контент, все равно будет руководствоваться своей внутренней политикой кэширования. По этой причине, например, у многих начинающих Аяксоидов возникают непонятки с подгружаемым динамическим контентом. Приходится в итоге все равно решать через заголовки.




--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 3.8.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Вот нашел небольшой туториал тынс.

Там все через сесии, используется фильтр, и с logout у них все нормально. Я попробывал использовать фильтр, но он у меня не заработал. Посмотри, может мы найдем решение...


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 3.8.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



diablero, я должен развеять перед тобой одно заблуждение. Ты полагаешь, что статьи в Java World публикуют какие-то гуры и небожители. Спешу тебя разочаровать: нет, это подчас обычные девелОперы, со своейственными каждому человеку ограничениями и заблуждениями.

Возьмем, к примеру, статью товарища Хуанг Ли, ссылку на которую ты приводишь. В чем суть его, тыкскыть, решения? Да все в той же идиоме PRG (Post-Redirect-Get)! Просто чувак, похоже, не знал такого слова, а то бы постеснялся с умным видом расписывать на трех страницах такие элементарные и всем известные вещи. Обрати внимание, что саму по себе идею PRG я тебе растолковал буквально в два абзаца, Реализация этой идеи у нас тоже получилась простая и логичная:

/form/login.shtml -> /submit/login.do -> /confirmation.shtml

То, что Опера и старый Firefox не понимают каких-то заголовков - это, конечно, плохо, но видишь ли, от того, что мы закодируем ту же самую PRG логику в виде кривых и запутанных рецептов от товарища Хуанг Ли, понимаемость браузерами заголовков, увы, не улучшится. Чтобы тебе это наглядно продемонстрировать, я предлагаю тебе зайти по адресу, где у сего аффтара находится онлайновая демонстрация описанного решения для Logout: http://pragmaticobjects.org/properLogoutDemo/.

Как нетрудно убедиться, чуда не произошло. Если Опера не понимает директиву Cache-Control: no-store, то никакие Хуанг Ли тут не помогут.

Чтобы тебя окончательно стало ясно, что тут и к чему, открою еще один маленький секрет. Я эту статью уже видел раньше. Более того, я видел и еще более раннюю статью этого же аффтара, на эту же тему. Вот она: Solving the logout problem properly and elegantly. Так вот, в этой первой статье он вообще пытался по логину перейти сразу на авторизованный ресурс через директиву jsp:forward, то есть посредством внутрисерверной переадресации, а не через ответ 302. Потом его ткнули носом, что это типа не работает, и тогда он выступил со второй статьей. Которую я в общем уже прокомментировал.

Ну и чтобы развеять последние остатки сомнений, покажу пальцем на один кусочек кода. В статье, которую ты приводишь, вся "магия" на самом деле сосредоточена вот в этих строчках:

Код

   protected final void setNoCache(HttpServletResponse response) {
      response.setHeader("Cache-Control","no-cache"); 
      response.setHeader("Cache-Control","no-store");
      response.setDateHeader("Expires", 0);
      response.setHeader("Pragma","no-cache");
   }


Заметили ошибку? Правильно, setHeader("Cache-Control","no-store") забивает значение, выставленное в предыдущей строчке! Если он хотел его добавить, то должен был использовать addHeader("Cache-Control","no-store"). Тогда с сервера приехало бы Cache-Control: no-cache, no-store.

Вот такие вот у нас писатели.

Короче, все: тема закрыта.

Возвращаясь к заданию. Нам предстоить нарисовать несколько дополнительных страниц, в том числе форм. Если ты будешь делать это в том же ключе, как у тебя сделана form/login.vm, то мы очень скоро перестанем понимать, что там наворочено в разметке. Отсюда подготовительный этап:
  • Вынеси весь CSS в отдельный подключаемый файл.
  • Определи единый валидный семантичный HTML шаблон для всех страниц (template.vm) так, чтобы в нем присутствовали статичные шапка и подвал и место для меню навигации и основного контента. Не забудь про объявление DOCTYPE.
  • На базе этого шаблона нарисуй страницу поста. Текст для поста возьми подлиннее, чтобы было похоже на статью.

Лучше все это сделать в статике, то есть прям завел на диске файл template.htm, и пишешь в нем. Потом открываешь браузером с диска и смотришь, что получилось. Файл style.css можешь положить в эту же директорию.

Верстать надо семантоично, чтобы код отражал только структуру документа, но не его оформление. То есть чтобы никаких bgcolor, font и пр. Чтобы было за что зацепиться CSS'ом, используй атрибуты id и class.

Если будут вопросы - не стесняйся.



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 5.8.2007, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Подготовительный этап выполнил...
Выложил шаблоны.

Это сообщение отредактировал(а) diablero - 7.8.2007, 01:10

Присоединённый файл ( Кол-во скачиваний: 41 )
Присоединённый файл  templates.zip 3,21 Kb


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 6.8.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



diablero, я посмотрел разметку. Не идеально, конечно, но для начала пойдет.

Я сейчас пока маленько занят, давай отложим до вторника. Между делом можешь нарисовать форму для создания/редактирования поста. Старайся придерживаться тех же правил семантичности.

Да, пока не забыл. У тебя встречаются элементы с одинаковым id. Это впоследствии может послужить источником больших непоняток. Для справки: id назначаются только тем элементам, про которые точно известно, что они всегда будут в единственном экземпляре. Например, id="navigation", id="content", id="footer", и т. д. Для повторяющихся (в пределах одной страницы) элементов одного типа используется понятие класса: например, class="post-title" на странице раздела (для списка постов).

Как запостишь форму, пойдем дальше.



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1595 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.