четверг, 10 июля 2014 г.

struts multi mvc

struts multi mvc

Работаю над расчётным  web-приложением. Основой приложения является struts. Возникла проблема что нельзя отобразить несколько разных документов в браузере в разных вкладках.

Поскольку struts и browser строят модель MVC на текущей сессии, то возникает желание основные данные о документе тоже хранить в сессии. Что обычно и реализуется в примерах и справочниках. Но как только возникает желание перейти к многодокументному MVC, то возникают вопросы - а как различать документы, когда все данные хранятся в одной сессии? Суть отличия в ответе на вопрос - а как сервер должен отличить одну вкладку браузера от другой? Сервер работает только с cookie и не отличает запросы от разных вкладок, т.к. вкладки отдают серверу запросы с одинаковым набором cookie. Остаётся только одно решение - в каждой вкладке должны быть написаны get-параметры вида ?documentIndex=NNNNNNNNNNNN. Но у struts есть особенность - при работе с со стеком компонентов mvc он "режет" всё, что идёт после знака "?". В конце концов, после выполнения action никаких следов о documentIndex не остаётся в принципе.

Технически, следует искать ответ на вопрос: как сохранить get-параметры при выполнении action?

Решение:

Пример открытого документа с get-параметром:


Если нажать на кнопку "save and calculate md5", то страница "обновит" содержимое документа через POST-запрос и вернётся обратно. Может быть имело смысл именно это действие делать с помощью ajax, но решено именно как указано в документе, чтобы было нагляднее на простом примере. К тому же всегда можно захотеть нажать F5 и если не будет documentIndex, то редактор не будет знать, какой документ открыть.


Взаимодействующие части MVC:


Описание решения:

  1. Изначально документ открывается по ключу, называющемуся documentIndex и передающегося в параметре get-запроса.
  2. struts обрабатывает get-запрос и сохраняет его в скрытом поле формы document-index, а адресная строка браузера только констатирует факт открытия документа с этим индексом. Очень важно обратить внимание на вид с отладочной информацией описания html-формы, где видно, что в форме form['edit'] в поле action не прописаны атрибуты get, а это значит, что при отправке submit-от POST-запросов get-параметра documentIndex не случится.
  3. Чтобы сохранить параметр documentIndex нужно, чтобы в модели документа был такой член-класса документа как documentIndex со своим get и set, тогда struts его туда запишет.
  4. После обработки запроса на сервере struts формирует сообщение для перехода в другой action и для этого указывает параметр documentIndex в атрибутах соответствующего result.
  5. После этого struts перенаправит браузер на страницу get-запросом, в котором будет содержаться get-параметр documentIndex=NNNNN
Проблема решена!

вторник, 24 июня 2014 г.

cargo-maven2-plugin - запуск сервера tomcat на отладку здесь и сейчас

cargo-maven2-plugin - запуск сервера tomcat на отладку здесь и сейчас


Пишу под maven/tomcat, соответственно при перемещениях исходного приложения с машины на машину приходится проходить цикл настройки сервера для подключения. И это порядком утомляет. Пусть даже и немного помогает плагин tomcat7-maven-plugin (будет ли восьмой - не знаю). Но хотелось бы более удобного способа, который можно было бы "вмонтировать" прямо в maven. Некоторое время назад наткнулся на плагин "cargo-maven2-plugin", решил его испытать и он мне очень понравился. Поэтому тут я поделюсь своими впечатлениями.

Начну с полученного результата. Для тестирования war-приложения на любой машине (даже на удалённой), где настроен maven выполняю команду:

    mvn clean package cargo:run

Если сборка прошла успешно, то запускаю браузер, набираю адрес http://localhost:8580/<приложение>, должен появиться результат. Чтобы подключиться к отладке запускаю удалённое подкючение IDE (Eclipse или IDEA) и делаю отладку. Всё - результат получен.

Теперь расскажу поподробнее, что тут происходит.

Настройка плагина в проектом pom.xml:


Вот так выглядит запуск из командной строки (причём не только под command.exe, но и под linux/bash):

проверим браузер:

Настраиваем eclipse на удалённую отладку и запускаем:


Вот так получаем желаемый результат. Вообще возможности cargo не ограничиваются только tomcat. В документации идёт речь и о других контейнерах. Кроме того, мне удалось подключить этот плагин при тестирование под Selenium и под Arquillian.

Очень рекомендую обратить внимание.

суббота, 5 апреля 2014 г.

Как быстро включить номера строк в Eclipse

Как быстро включить номера строк в Eclipse

"Быстро" (Ctrl-3) войти в Quick Access, набрать "show l" (подразумевается "show line numbers"), нажать Enter и получить результат:
Точно так же их можно и отключить.

Теперь пару слов о том, что тут произошло. Прикол весь в интересном свойстве Eclipse IDE предоставлять доступ к своим настройкам в Preferences через Quick Access. И эта функция системы позволила быстро выполнить действия, которые доступны из GUI таким образом:
Только эти действия через Quick Access выполняются почти мгновенно и не надо хватать мышку и целиться в кнопки. :) Всё просто!

вторник, 25 марта 2014 г.

Как быстро вставить зависимость в pom.xml в IDE Eclipse (quick insert a dependency into pom.xml in Eclipse)

Как быстро вставить зависимость в pom.xml в IDE Eclipse (quick insert a dependency into pom.xml in Eclipse)

Оказывается, зависимость в pom.xml в среде разработки Eclipse можно вставить очень быстро и просто, помня только основное название зависимости:


Аналогичная ситуация и с плагинами.

воскресенье, 23 марта 2014 г.

bash. Строку с двоичными кодами и преобразовать в base64.

bash. Строку с двоичными кодами и преобразовать в base64.

Сначала я стал искать hex-редакторы с возможностью преобразования данных в base64, но поскольку речь шла о небольшом объёме данных, которые мне нужно набирать на клавиатуре, то нашлось простое решение под linux в одну строчку:

printf "\x00alex-zaharow@yandex.ru\x00password" | base64

на выходе получаем:

AGFsZXgtemFoYXJvd0B5YW5kZXgucnUAcGFzc3dvcmQ=

Проверка для smtp сервера:


Проблема изначально была в том, что никак было не "написать" исходную строку в bash с двоичным символом null, но если сделать вывод в printf и через трубопровод передать в base64, то данные будут содержать нулевой код символа и преобразуются в base64.

понедельник, 10 марта 2014 г.

Использование cmd в консоли eclipse с правильной кодировкой

Использование cmd в консоли eclipse с правильной кодировкой

Долго не мог решить проблему, что консольный вывод команды cmd, запущенный в среде eclipse выдавал неверные символы (не сильно беспокоило, но решил разобраться):


Довольно быстро нашёл перечень шрифтов, которые можно использовать в консоли:

Только в этой настройке ничего нет про кодировку dos866 (сколько лет прошло, а призрак MSDOS  до сих пор преследует Windows), но как-то мне улыбнулась удача и я нашёл правильную кодировку для этой настройки, которую Eclipse нормально использует:

cp866

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

Java split

Java split

И как я раньше не замечал такого свойства в Java, аналогичного split в JavaScript, чтобы разделить стрку на лексемы по паттерну регулярных выражений. Существует аж два метода:



Заодно обнаружил, что если нужно при выводе использовать паттерн форматированной строки вместо длинного оператора System.out.println("строка1 "+значение1+", строка2 "+значение2) или System.out.println( String.format("строка1 %s, строка2 %s", значение1, значение2) ), то можно сделать ещё быстрее:
System.out.printf("Строка1 %s, строка2 %s", значение1, значение2)

пятница, 21 февраля 2014 г.

JAVA. HOWTO. Как прочитать ресурс WAR-приложения как байтовый массив.

JAVA. HOWTO. Как прочитать ресурс WAR-приложения как байтовый массив.

Пример приведён для jsp. Файл "2070.cer" является ресурсом приложения. После сборки он будет находится в файле war/jar.
см. http://stackoverflow.com/questions/2639943/accessing-jar-resources

<%@page import="local.esphere.cert.DER2XML, java.io.*, org.apache.commons.io.*"%>
<html>
<body>
<h2>Hello World!</h2>
<%
 String crtPath = "/2070.cer";
 InputStream file = getClass().getResourceAsStream( crtPath );
 
 byte[] bytesDER = IOUtils.toByteArray(file);
 
 out.println("xml:<br/><pre>"+ DER2XML.convert( bytesDER )+"</pre>" );
 out.println("ThumbPrint:"+ DER2XML.getThumbPrint( bytesDER ) );
%>
</body>
</html>

Примечание: поскольку getClass не является статическим методом, то вызвать его напрямую можно только у инстанциированных объектов, например:

InputStream file = crtPath.getClass().getResourceAsStream( crtPath );

среда, 23 октября 2013 г.

как выполнить deploy приложения maven на tomcat по протоколу https?

Как выполнить deploy приложения maven на tomcat по протоколу https?

Столкнулся с проблемой удалённой установки приложения на tomcat из-под maven, когда протоколом удалённого подключения является ssl (https). Тут несколько проблем наслаиваются друг на друга. Сначала надо решить вопрос удалённой установки в принципе. 

Пару слов о конфигурации: 
Среда разработки:Windows x64, jdk 1.7.0_45, Eclipse 4.2.2, maven 3.1.1
Среда сервера приложений: Oracle-Linux 6 x64 (без GUI), tomcat 7.0.42, доступ через putty по ssh.

Для освежения памяти, напомню, что tomcat не сам по себе позволяет выполнять удалённую установку приложений. Для этого у него есть приложение deploy, которое идёт в стандартной поставке (его можно отключить, если оно не нужно, тогда tomcat будет работать, а удалённый deploy - нет). Кроме того, политика пользователей в стандартной поставке такова, что по-умолчанию отключены все пользователи, поэтому сразу после установки tomcat нельзя запустить приложение manager, чтобы посмотреть всякую административную информацию о сервере. Кроме того, не стоит забывать, что сам процесс удалённой установки как правило содержит в себе ещё один важный шаг, который за очевидностью не всегда обращает на себя внимания - это шаг отправки приложения на удалённый сервер tomcat. Этот шаш может быть выполнен несколькими путями (я насчитал 4) - с помощью curl с исходной машины методом PUT протокола http(s), утилитой pscp из набора утилит putty с указанием пути к каталогу \webapp, с помощью manager-а tomcat ручным указанием файла приложения для установки (после настройки пользователей), с помощью maven-овского плагина tomcat7-maven-plugin.

Учитывая, что работа идёт в Eclipse, то наиболее предпочтительный вариант - это использование maven (поскольку он уже встроен в eclipse).

Учитывая эту информацию начнём постепенно настраивать удалённую установку приложения.
Самое правильно и простое настроить её по простому протоколу http, без шифрования (чтобы быть уверенным, что проблема именно в протоколе ssl, а не, скажем, в пароле подключения к tomcat-овскому компоненту deploy).

В сети много советов, когда предлагают настроить удалённую установку приложения с использованием файла settings.xml, являющимся файлом настроек maven, но есть и метод поинтереснее, когда все данные для удалённой установки приложения можно указать в настройках плагина. Самое первое, что надо сделать - правильно настроить пользователя tomcat, который будет выполнять удалённую установку приложения:


 Перезапустим сервер. Проверим, что указанный пользователь может зайти в manager:



Теперь нужно выполнить настройку плагина maven для выполнения remote-deploy. Все настройки можно указать в настройках плагина:



важно указать параметры url, чтобы maven знал куда делать deploy приложения, username/password, чтобы знать как подключиться к серверу. path - контекст приложения. Этих параметров вполне достаточно. Теперь надо выполнить команду:

mvn tomcat7:redeploy
или в настройках eclipse:


 и нажать кнопку debug, то должна выполниться удалённая установка. Отлично, значит сама процедура удалённой установки настроена, осталось перевести её на рельсы https. Для этого надо в настройках приложения pom.xml поменять порт назначения и протокол:


Но это ещё не всё. Поскольку мы имеем дело с протоколом ssl, то он будет проверять сертификаты, которые присылает ему сервер. Проверка заключается в том, что он должен выявить наличие корневого узла, от которого идёт доверие к сертификатам, которые предоставляет ему сервер, на который выполняется удалённая установка. Поэтому строчка вызова maven должна выглядеть так:



Этот результат я и добивался. Теперь можно удалённо устанавливать приложения war на tomcat по ssl.

понедельник, 14 октября 2013 г.

windows - linux копирование файлов и каталогов туда и обратно

windows - linux копирование файлов и каталогов туда и обратно

Давно работаю с linux (после windows) и сколько раз задавался вопросом:

- Как копировать файлы/каталоги не прибегая к побочным эффектам от использования таких мостров как samba или (не монстр, но-всё-таки) sftp или apache???

Чуть позже выяснилось, что есть ещё более простое средство: winscp. Выглядит как total-commander. И более того, можно открывать на редактирование файлы прямо на целевой linux-овой машине.

Оказалось, ЕСТЬ такое средство! Называется оно pscp.exe . Эта программа входит в состав утилит putty. Только я не сразу понял, что эта утилита работает в двух направлениях. Ей всё равно куда копировать по ssh - с источника на приёмник или с приёмника на источник. Кроме того, pscp может копировать и каталоги.
Рассмотрим примеры:
Копирование файла с windows на linux:


Теперь скопируем файл с linux на windows:


Теперь попробуем вытянуть целый каталог из linux в windows:


Теперь можно работать дальше без установки всякого дополнительного ПО на linux или windows. Всё просто.

В решении вопроса помог вопрос на форуме: http://www.linuxquestions.org/questions/linux-newbie-8/scp-copy-file-from-remote-linux-server-onto-a-windows-machine-316263/

среда, 4 сентября 2013 г.

Компиляция и запуск на выполнение файла .java прямо не выходя из vim (Часть 2)

Компиляция и запуск на выполнение файла .java прямо не выходя из vim

Вот собственно как это делается:
Некоторые команды для copy-paste:

:!javac -d ../bin %
:!java -cp ../bin %<

Для вызова команды в vim просто нажмите двоеточие, затем наберите остальное.
Некоторое пояснение к командам:
% - путь к файлу и имя файла, являющимся текущим в редакторе
%< - путь к файлу без расширения. Разработчики прямо как думали, что java запускает файлы классов без расширения .class.
-d - компилировать файлы в другой каталог. Может возникнуть вопрос: что за фигня, когда после "-cp ../bin" указан %? ../bin%< После объединения путь ../bin и %< параметр укажет на правильный файл .class.

четверг, 29 августа 2013 г.

Полезное применение почти бесполезного свойства vim

Полезное применение почти бесполезного свойства vim

Случайно узнал, что в vim есть такое сокращение, как Ctrl-a. Если его нажать, то число под курсором увеличится на 1. Вроде бы ничего особенного, но в какой-то момент я открыл на редактирование файл настроек tomcat\server.xml и увидел в нём параметр, указывающий номер порта, по которому к нему осуществляются административные подключения и подумал, что наверное было бы здорово его изменить именно по ctrl-a:
Нажал пару раз ctrl-a, счётчик номер порта стал увеличиваться. А что, удобно!

Как откомпилировать и запустить в vim программу *.java или *.bash

Как откомпилировать и запустить в vim программу *.java или *.bash

Среда: Linux/Oracle, vim 7.4, доступ putty/ssh

Для работы сильно помогают специальные сокращения vim в его командной строке.
Сначала посмотрим на пример запуска скрипта bash из vim. Сам скрипт должен иметь атрибут (execute), иначе его запуск будет невозможен. После сохранения файла на диске выполнить команду:
    :!./%
и программы выполнится:

В этой команде:
: - переход в командный режим vim
! - следующие символы интерпретировать как команды
./% - linux-овая команды на выполнение файла в текущем директории.

Тоже для *.java:

При компиляции/выполнении *.java файла необходимо учитывать значение package. Пусть исходный файл лежим в каталоге programs/exe:

Открываем его на редактирование:
И запускаем команду компиляции и выполнения:
Эти команды показаны тут по отдельности, но ничто не мешает объединить их в одну строку:
:!javac % && java %<

%< - указывает программу без расширения.