Sunday, October 28, 2012

Красивый file upload с jQuery

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

jQuery File Upload 

Проект лежит здесь: https://github.com/blueimp/jQuery-File-Upload
Примерчики здесь: http://blueimp.github.com/jQuery-File-Upload

Пример. Ниже реализована загрузка файла с прогресом. Будет одна кнопка Upload, которая позволит выбрать файл и сразу загрузить его на сервер.

1. Скачиваем.

Скачиваю отсюда https://github.com/blueimp/jQuery-File-Upload/downloads, распаковываю архивчик.

2. Копируем javascript и css файлы в свой проект.

Я буду пользоваться минимальной установкой, поэтому в свой проект копирую только некоторые файлы. Ресурсы моего проекта находятся в папке webapp/resources, в нее копирую следующие javascript файлики из архивчика:
- js/vendor/jquery.ui.widget.js
- js/jquery.iframe-transport.js
- js/jquery.fileupload.js
- css/jquery.fileupload-ui.css

Подробнее о минимальной установке здесь: https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin

3. Добавляем Bootstrap и jQuery

3.1. Файлик с jQuery берем здесь http://jquery.com/download/ и добавляем в проект.
3.2. Bootstrap берем здесь http://twitter.github.com/bootstrap/index.html. Добавляем файлы:
- css/bootstrap.css
- img/glyphicons-halflings.png
- img/glyphicons-halflings-white.png

4. Создаем страничку

Красиво отобразить JSP страничку в блоге не получилось, поэтому даю ссылку на файл jsp.
Полный текст JSP странички можно посмотреть здесь.

5. Пишем сервлет загрузки

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

Wednesday, October 24, 2012

Unit тесты с embedded Jetty

Частенько хочется проверить обращение к внешнему HTTP серверу. Раньше я пользовался встроенным в JDK http сервером (см пакет com.sun.net.httpserver). В этом случае тест работает быстрее, но вытаскивать параметры из http запроса приходилось писать самому.

Я попробовал запустить embedded Jetty сервер в тесте, в котором создать сервлетик, который запоминает приходящие параметры реквеста. Вот что получилось.

Сам тест
Реализация фейкового сервера

Зависимости

Полностью проект можно скачать тут

Интересно
Если будет использоваться асинхронная отсылка http запроса из теста, то синхронизировать сам тест с обработкой запроса можно с помощью метода FakeServer.waitForResponse.
Вот интересная статья про семафоры http://www.baptiste-wicht.com/2010/09/java-concurrency-part-5-monitors-locks-and-conditions/

Friday, October 05, 2012

Динамическая конфигурация Java Security Policy в Jetty

Задача

В рамках моего веб приложения надо умудриться задеплоить еще один war, на котором будет работать какой-то сервлет. Поскольку этот war - это стороннее веб приложение, то надо запретить ему доступ к файловой системе, открытие сокетов и тем более вызывать System.exit.
Подобная задача легко решается в OSGi контейнере (пример на OSGi тут). Но у меня Jetty и необходимо очень тупое простое решение.

Предположим в этом "левом" веб-приложении какой-нибудь умник решил проверить систему на прочность и написал такой код:

Естественно, что при вызове сервлета  System.exit сделает свое дело и погасит мой сервер.

Деплоим стороннее веб приложение

Прежде всего надо убедиться, что модули jetty-webapp и jetty-server подключены к проекту. У меня версия Jetty 8.1.3.v20120416



Дальше пишем код деплоймента веб архива в Jetty

Если задеплоить этот код в любой web container, то как только мы дернем страничку из браузера, то все...

Настраиваем Java security manager

Самый тупой способ, который я нашел - это подставить свою реализацию java.security.policy:
Надо обратить внимание на, что Policy надо устанавливать ДО того, как переопределить SecurityManager, иначе не хватит прав для установки новой Policy :)