develNotes

/*айтишные заметки*/


07.11.2011

Веб-сервис на Java с использованием Apache CXF.

Напишем простой веб-сервис на Java, используя фреймворк Apache CXF, JAXB, и JUnit для тестирования. Используемая среда разработки - Eclipse (Java EE IDE for Web Developers). Последнюю версию Apache CXF можно скачать здесь. В Eclipse нужно создать обычный Java проект, в свойствах проекта добавить библиотеки CXF и JUnit (Project > Properties > Java Build Path > Add Library). Это все что нужно, можно приступать к написанию кода.

30.11.2011

Связывание данных - JAXB.

Для связывания классов с их XML представлением в Java есть разные способы - JAXB, Castor, XStream. Но JAXB пожалуй самый простой, он входит в Java SE, хорошо подходит для простых задач и при использовании классов, сгенерированных по XSD-схеме. В предыдущем посте JAXB преобразует данные, которыми оперирует веб-сервис - это происходит автоматически, когда объект передается методу/возвращаются данные. Посмотрим немного подробнее, как выполнить преобразование произвольного объекта в xml и обратно (маршалинг/демаршалинг). Использовать JAXB очень легко. Допустим у нас есть класс, который описывает свойства автомобиля:
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAttribute;

@XmlRootElement(name="auto")
public class Auto {
 private Boolean newAuto;
 private String autoMarka;
 private String autoModel;
 private Integer horsePower;

 @XmlAttribute(name = "new")
 public Boolean getNewAuto(){
  return newAuto;
 }
 public void setNewAuto(Boolean value){
  newAuto = value;
 }
 @XmlElement(name = "marka",required = true)
 public String getAutoMarka(){
  return autoMarka;
 }
 public void setAutoMarka(String value){
  autoMarka = value;
 }
 @XmlElement(name = "model")
 public String getAutoModel(){
  return autoModel;
 }
 public void setAutoModel(String value){
  autoModel = value;
 }
 @XmlElement
 public Integer getHorsePower(){
  return horsePower;
 }
 public void setHorsePower(Integer value){
  horsePower = value;
 }
}
Теги: jaxb java programming     Далее

08.05.2012

JavaEE: EJB компонент на Jboss 7.1.

Кратко об Enterprise JavaBeans (EJB). EJB компонент представляет собой класс или набор классов, в которых используются специальные аннотации. Каждый EJB компонент выполняется на сервере приложений, и получить доступ к функциональности компонента можно различными способами: из JSP или JSF страницы, из сервлета, с помощью веб-сервиса, из другого EJB компонента, из апплета, а также из обычного приложения JavaSE.
 
Теги: programming java javaEE     Далее

14.07.2012

Dropbox API (Java SE).

Dropbox предоставляет множество библиотек на разных языках, для доступа к API. А если вы собираетесь работать на более низком уровне - пожалуйста, есть детальное описание REST API. В целом, все подробно документировано, но перейдя по ссылке Tutorial для Java SDK, видим руководство к Android SDK. На вопрос, где руководство к Java SDK, ответ простой: "Where are the Java instructions? For platforms other than Android, all you need is to download and uncompress the latest version of the Java SDK from Development kits. Include everything in the lib folder on your project's build path." Все конечно так, добавляем библиотеки в проект, кроме этого ничего не надо. Вместе с SDK идет и пример, но не совсем такой, как хотелось бы. Небольшая неясность, на первый взгляд, с Java SDK связана с "политическими" соображениями на данный момент. Приведу элементарный пример использования Dropbox API, для Java SE.


23.09.2012

Автоматизация маппинга XML - Java.

Я уже упоминал об одном из способов связывания Java классов с их XML представлением - JAXB. Если стоит задача создания структуры Java классов для преобразования данных из XML документа заданного формата с помощью JAXB, то для этого обычно используется утилита jaxb-xjc (Java Architecture for XML Binding Binding Compiler): достаточно иметь XSD файл со схемой документа, чтобы сгенерировать структуру классов. А что если схемы нет, а есть только пример самого XML документа? Конечно, ничто не мешает создать классы для JAXB вручную, но если исходные XML данные сложны по структуре и велики по объему - то зачастую это может оказаться лишней тратой времени. С помощью утилиты  trang можно создать схему на основе примера XML. Допустим есть такой XML файл и нам нужно создать соответствующие ему Java классы для JAXB: example.xml:
<data type="dictionaries">
 <dictionary name="buildings">
 <itemnum>2</itemnum>
 <comment>Buildings</comment>
 <element>
  <id>0</id>
  <name>building 1</name>
  <cost>10000.50</cost>
 </element>
 <element>
  <id>1</id>
  <name>building 2</name>
  <cost>20000.50</cost>
 </element>
 </dictionary>
</data>
Теги: jaxb java programming xml     Далее

03.11.2012

JSF: как изменить значение свойства класса из JavaScript.

Как правило, в JSF с каждым представлением (страницей) связан java класс (managed bean) веб-приложения, свойства которого связаны с компонентами JSF страницы - кнопками, полями ввода и пр. Веб-приложение на java выполняется на сервере приложений, но в тонкости отправки запросов от клиента к серверу вникать нет необходимости. Допустим, что нужно вызвать произвольную javascript функцию и из нее установить значение некоторого свойства класса. Вполне возможная ситуация, например когда какая-то часть интерфейса реализована на непосредственно на javascript, без использования JSF.

04.11.2012

SAX и DOM парсинг в Java - примеры и различия подходов.

Если вам нужно загрузить данные из XML документа в java объект - можно использовать разные способы связывания данных, один из них - JAXB, я уже неоднократно упоминал. Подобные варианты подходят, если заранее известен формат исходного XML документа. А если вам необходим парсинг XML произвольного формата, то здесь можно использовать SAX или DOM парсеры. Эти парсеры аналогичны по функциональности, различаются подходы -  DOM парсер сначала загружает весь исходный документ в java объект, с которым затем можно работать; SAX парсер использует событийную модель разбора документа, парсинг происходит "на лету" и загружать в память сразу весь XML нет необходимости. Давайте посмотрим на конкретные примеры использования таких парсеров. Итак, вот наш документ для разбора:
<test-object>
<items type="available browsers">
<item>
Firefox
</item>
<item>
Opera
</item>
<item>
IE
</item>
<item>
Chrome
</item>
</items>
<use-browser version="12">
Opera
</use-browser>
</test-object>
Теги: programming java     Далее

12.01.2013

Конвертация PDF в HTML на Java.

PDF может и хороший формат, но согласитесь - зачастую просматривать его оналйн менее удобно, чем просто веб-страницу. Когда мне потребовалось сделать автоматическую конвертацию имеющихся PDF файлов в HTML, первое что я нашел вот этот конвертер -  pdfonline. Вполне неплохо работает и есть API для разных языков ( C#, VB, ASP, C+). Однако Java API там нет. Для Java, я нашел отличную библиотеку -  PDF2HTML5. Она не бесплатная, но есть 30-дневный триальный период. Для того чтобы сконвертировать PDF файл в веб-страницы можно воспользоваться приведенным на сайте примером, а это буквально одна строка кода. Здесь первый аргумент является входным PDF файлом, второй - путь к директории, куда будет сохранен результат (HTML файлы помещаются в директорию, название которой совпадает с названием входного PDF файла без расширения):
Теги: java programming     Далее

15.03.2013

Coursera.org для программистов.

На coursera.org доступно множество курсов, по разным дисциплинам, в том числе от университетов с мировым именем. Для программистов там определенно много полезных обучающих курсов. Хочу кратко описать те курсы, с которыми я ознакомился. Первый курс, который на данный момент заканчивается, - Algorithms, Part I. Видеолекции читает профессор Принстонского университета - Роберт Седжвик.
Теги: programming     Далее

09.11.2013

Рефлексия в Java - несколько примеров.

Как сообщает Википедия, рефлексия - это процесс во время которого программа может отслеживать и модифицировать свою структуру во время выполнения. Можно сказать, что программа "сама пишет" часть кода себя, прямо во время ее выполнения. Рефлексия - один из подвидов метапрограммирования - создание программ, которые в процессе своего выполнения порождают другие программы. В данном случае, какая-то часть (ну или вся) программы проектируется так, чтобы программа сама создавала во время выполнения некоторую логику, которую при "обычном" подходе создает программист. Для чего? Все очень просто - иногда некоторые данные, которые жизненно необходимы для создания алгоритма, недоступны на этапе разработки программы. Например: известно, что нужно будет вызывать определенные методы объекта, но какие именно - будет понятно только во время выполнения. Вот здесь на помощь приходит рефлексия. Впрочем, я хотел бы привести несколько самых простых примеров реализации рефлексии в Java. Давайте посмотрим на них -  станет более ясно, когда можно использовать рефлексию для какой-то конкретной ситуации.
Теги: java programming     Далее

12.08.2014

Java: Аспектно-ориентированное программирование с помощью Spring Framework.

АОП - парадигма программирования, которая расширяет возможности существующих концепций, конкретнее - ООП. Она служит для удобной и четкой реализации сквозной функциональности в программе. Сквозная функциональность - это то, что происходит во всей программе в различных местах - в методах, конструкторах класса и т.п., что-то такое что можно было бы логически выделить в одну "сущность", но сделать это с помощью обычных средств ООП сложно, а то и вовсе невозможно. Не смотря на то, что программа всегда разбита на какие-то модули - классы, методы классов и т.п., случается, что в каждом из этих мест нужно выполнять схожие действия. И используя традиционный подход к проектированию, получаются весьма запутанные и сложные для поддержки и отладки конструкции. АОП предлагает некоторые концепции проектирования приложений, с помощью которых можно такие конструкции превратить в простые, стройные и удобные для поддержки и отладки. На первый взгляд, идея АОП может показаться слишком сложной и запутанной, но достаточно понять идею и использовать АОП будет очень просто - особенно с помощью Spring Framework. Spring предлагает ограниченную поддержку АОП в Java, но этого достаточно для множество задач, к тому же преимуществом использования Spring для АОП является простота. Сначала я хотел бы привести несколько ключевых терминов из концепции АОП, а потом рассмотреть простой, но очень детальный пример реализации АОП с помощью Spring.
Теги: programming javaEE java     Далее

14.08.2014

Инструменты под рукой - несколько удобных Java библиотек.

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

Apache Commons IO

Сайт: http://commons.apache.org/proper/commons-io/

Проект Apache Commons включает в себя очень много составляющих и Commons IO - лишь малая часть. С одной стороны - это настолько популярная библиотека, что наверное не нуждается в представлении. Но с другой - ее просто нельзя не упомянуть! Apache Commons IO, как можно догадаться по названию, служит для задач ввода/вывода. Широко и давно используется в мире Java, а значит - хорошо отлажена.

Посмотрим на пару элементарных примеров c классами IOUtils и FileUtils.

Класс IOUtils служит для работы с классами InputStream, OutputStream, Reader и Writer. Класс FileUtils служит для работы с классом java.io.File. Для того чтобы считать текст из файла с заданной кодировкой UTF-8, нужно написать примерно следующее:

public String readTextFromFile(String path)

 throws Exception {
  final String ENCODING = "UTF-8";
  return FileUtils.readFileToString(new File(path), ENCODING);
}
Теги: java programming     Далее

22.08.2014

Еще одни крестики-нолики с использованием Java Swing.

Когда меня попросили помочь сделать/найти игру в крестики-нолики на Java с графическим UI (для двух игроков)  - первым делом я погуглил на предмет наличия готового и пристойно реализованного сабжа. Возможно я плохо искал, но все что мне попадалось было сделано плохо. Где-то размер игровой доски задан жестко, в большинстве найденных примеров на Java Swing - вся логика игры неподобающим образом смешана с пользовательским интерфейсом. В сети выложено немало реализаций этой игры, но почему бы не добавить еще одну? 

Итак, в этом примере  для создания пользовательского интерфейса используется Swing. Размер игровой доски 5x5:

Для выигрыша необходимо составить непрерывную линию из крестиков или ноликов длиной в 5 элементов. Врочем, размер поля и длину линии, которую нужно составить для выигрыша, можно легко изменить. Как видно на скриншоте, здесь используется тема Nimbus, которая включаена в JRE начиная с Java SE 6 Update 10. Структура проекта выглядит так:

В пакете ru.spbstu.tictactoe - классы, необходимые для создания графического интерфейса; в пакете ru.spbstu.tictactoe.common - классы, необходимые для создания игры в крестики-нолики, которые не привязаны к представлению (UI). Класс GameBoard является представлением игрового поля для игры в крестики-нолики, а также содержит все необходимые для реализации игры методы: 


12.10.2014

JavaEE: Пример использования Spring Security.

UPDATE: Возможно вам будет интересен пример использования Spring Security 4 и AngularJS.

Spring Security - фреймворк, предоставляющий удобную реализацию механизмов аутентификации и авторизации в Java EE приложениях. Раньше был известен как Acegi Security, а в 2008 году был включен в проект Spring. Является стандартом де-факто для веб-приложений Spring MVC. Использовать Spring Security очень удобно и просто - без особых усилий можно создать гибкую систему управления правами в вашем веб-приложении.

Для того, чтобы показать как это работает - приведу простой, но подробный пример приложения, которое использует Spring Securtiy. Приложение будет состоять из страницы входа и закрытой страницы, доступ к которой имеет только один пользователь. Как нетрудно догадаться, это будет веб-приложение Spring MVC. Итак, цель поставлена, инструменты определены, приступаем к делу!

Для примера создаем шаблонный проект веб-приложения Spring MVC, используя Spring Tool Suite (File > New > Spring Template Project > Spring MVC Project ).

После этого у нас уже есть простое веб-приложение, которое можно запустить на сервере (ссылку на полный код примера можно найти в конце поста). Первое что необходимо сделать - добавить в pom.xml необходимые зависимости:

<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-core</artifactId>
			<version>${org.springframework-version}</version>
</dependency>

<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-web</artifactId>
			<version>${org.springframework-version}</version>
</dependency>

<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-config</artifactId>
			<version>${org.springframework-version}</version>
</dependency>

21.11.2014

Расстояние Левенштейна - что это и как использовать.

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

"text" и "text!"

Для того чтобы первую строку превратить во вторую, нужно добавить к ней символ "!", и наоборот - для того чтобы превратить вторую в первую - нужно удалить из нее восклицательный знак. Иными словами, нужно выполнить одну операцию. Это значение и называют расстоянием Левенштейна. Зачем используется такое понятие? Расстояние Левенштейна имеет множество практических применений. Например - различные утилиты, которые предназначены для мержа файлов исходного кода, утилита для сравнения текстов diff в Linux, нестрогое сравнение текстов - когда нужно "примерно" сравнить две порции текстовых данных, и прочее.


13.03.2015

Конвертация Apple binary plist в XML - BPlist2Xml

Сeгодня получил от Google письмо счастья, о том что Google Code в скором времени полностью прекратит свое существование, с рекомендацией перенести свои проекты куда-нибудь в другое место, например GitHub. Давным давно я сделал один проект, который сейчас казалось бы некуда деть, но он находится на Google Code. Хотелось бы сохранить этот код, поэтому решил перекинуть его на BitBucket. 

BPlist2Xml - это конвертер формата Property List, который используется продуктами Apple для хранения различных настроек и т.п. Написана эта программа, прости господи, на pascal (использовался Free Pascal). Суть в том, что документ формата Property List бывает двух типов - обычный XML документ и сжатый бинарный формат. Для того, чтобы читать и редактировать последний, есть специальные редакторы. Если кому-нибудь, неизвестно для чего, понадобиться производить манипуляции с бинарным plist используя например Delphi, эта реализация - единственная, насколько мне известно, на этом языке. 

Скачать (исходный код и бинарники)


25.04.2015

Spring Security и Mysql - практический пример.

UPDATE: Возможно вам будет интересен пример использования Spring Security 4 и AngularJS.

Я уже упоминал про JavaEE фреймворк Spring Security и приводил простой пример его использования. Этот пример включает в себя создание веб приложения с двумя страницами - страница логина и закрытая страница. Для авторизации, как ясно, там используется Spring Security. Однако имя пользователя и пароль (точнее SHA-1 хэш) в этом примере хранятся в XML файле настройки контекста Spring Security. Понятно, что в реальных задачах данные пользователя, как и его роли, хранятся в базе данных. 

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

Итак, как можно связать авторизацию с помощью Spring и Mysql. Сделать это можно немного по разному, посмотрим на один из способов. Первым делом установим Mysql и создадим тестовую БД, в которой будет одна таблица. В таблице содержится имя пользователя, название его роли в системе, и хэш пароля. Обычно в БД хранят и другую информацию - например дату, до которой аккаунт активен и пр. Но в этом примере этого не будет. 


28.06.2015

Codenvy - облачная IDE для Java и не только

В поисках стоящей облачной IDE для JavaEE наткнулся на интересный проект - Codenvy. Codenvy это полнофункциональная облачная среда разработки, которая поддерживает различные языки и платформы. Поскольку меня интересовала именно возможность разработки веб-приложений JavaEE, я расскажу свои впечатления именно об этом. 

В процессе поиска, я посмотрел на разные облачные IDE, но это первый и единственный проект, который мне действительно понравился. Во первых, мне хотелось получить именно IDE, а не просто модный_текстовый редактор аля Sublime Text. Во вторых, мне хотелось чтобы среда позволяла вести отладку JavaEE приложений, используя например Tomcat. Так вот, что мы имеем с Codenvy.

Codenvy поддерживает много платформ - Tomcat, Jboss и пр. Разумеется, можно запустить и standalone Java проект, собрав его с помощью Maven. Можно импортировать готовый Maven-проект, сделанный например в Eclipse. После чего останется лишь выбрать чем проект собирать (я выбрал maven) и на чем запускать (я выбрал Tomcat). После таких минимальных настроек, проект сразу запустился! В IDE есть:

Теги: java programming javaEE     Далее

11.11.2015

Впечатления о Junction Hackathon 2015

Junction 2015 - хакатон, проходивший в Хельсинки 6-8 ноября 2015 года. Мне посчасливилось быть одним из тех, кто принял участие в этом событии, посему делюсь небольшим отчетом. 

Junction - масштабное мероприятие, которое собирает сотни участников из множества стран. Организатором хакатона является сообщество Aaltoes (некоммерческая организация, которая объединяет студентов университета Аалто и занимается международным сотрудничеством). Также среди спонсоров и организаторов хакатона - Finnair, Uber, Microsoft, Shopify, RailsGirls, Klarna и др.  

Из СПб на Junction. 

Из России на хакатон поехали 18 человек. Организаторы предоставили автобус из Санкт-Петербурга, как и размещение в гостинице, за что им отдельное спасибо =). Народу было много, общее число участников хакатона составило 459 человек. Кто-то определился со своим проектом заранее, а кто-то (как я например) не готовился вообще. Кто-то ехал за главным призом - 20000 евро, и участием в Slush 2015 - мероприятие, которое собирает стартапы и инвесторов. "Билет" на Slush, который происходит также в Хельсинки, сразу после Junction получили лучшие проекты. Кто-то приехал на Junction не с целью победить и взять главный приз, а ради участия, общения, саморазвития и атмосферы хакатона. 

В пятницу вечером мы добрались до места проведения хакатона - недалеко от центра Хельсинки, в здании бывшей котельной:


17.07.2016

Spring Security 4 и AngularJS. Аутентификация в AJAX веб-приложении.

Spring Framework можно назвать стандартом де-факто в мире Java. Еще бы, ведь некоторые концепции, реализованные в этом фреймворке повлияли на саму спецификацию JavaEE. Spring Security является дочерним проектом Spring, и предоставляет средства аутентификации и авторизации для Java/JavaEE приложений. С другой стороны, в мире фронтенда победил JavaScript и фреймворки, позволяющие создавать SPA веб-приложения - AngularJS, ReactJS, BackboneJS и другие. Я хочу привести пример, как можно успешно использовать Spring Security 4 совместно с Angular. В этом примере мы напишем REST бекенд, используя Spring MVC. Также мы реализуем аутентификацию и авторизацию с помощью Spring Security, в то время как на фронтенде будет использоваться AngularJS. 

В целом, пример больше всего ориентирован на backend составляющую. Используя описанный принцип, можно аналогично использовать какой-нибудь другой фреймфорк для фронтенда (например Angular 2). Итак, нашей целью будет создать веб-приложение с несколькими разделами - открытый раздел и два защищенных раздела, в которые имеет доступ только авторизованный пользователь. Все должно работать через AJAX и должна быть функция "запомнить меня".

В примере будет использоваться Java 8, Tomcat 8, Spring 4.3, Spring Security 4.1, AngularJS 1.4.9. В конце поста вы можете найти ссылку на полный код проекта. 


14.09.2017

Java. Печатаем PDF отчеты на основе HTML шаблонов.

Однажды я столкнулся с ситуацией, когда мне нужно было быстро сделать функционал для печати одного отчета из Java, который был несложен по структуре данных, но должен был быть красиво оформлен (с определенными шрифтами, изображением и т.п.). Если формировать PDF программно из Java, этого добиться сложно. Как правило, для печати PDF отчетов по шаблону, в Java используются библиотеки вроде JasperReports, Apache PDFBox и пр. Следовательно, если использовать типичные библиотеки для формирования отчетов, то нужно в первую очередь разработать соответствующий шаблон отчета.  И здесь я подумал: "один отчет, нужен дизайн шаблона. Быстро сделать дизайн? HTML/CSS!". Лень - двигатель прогресса. В итоге, я сделал печать PDF отчета на основе HTML шаблона. Приведу пример, который показывает, как можно получить PDF документ на основе HTML5 шаблона с произвольным дизайном. Разумеется, такой способ печати PDF не претендует на замену традиционных решений, но в некоторых случаях может быть полезен. 

Итак, в качестве шаблона используется HTML5 документ, который определяет структуру и дизайн шаблона. Данные, которые необходимо отображть в PDF отчете будут заполняться в документе с помощью библиотеки JSoup. Затем, заполненный документ будет преобразовываться в PDF с помощью библиотеки Openhtmltopdf. В демонстрационном проекте будет использоваться следующая структура:

В папке fonts положим шрифт, который будем использовать в отчете (он необходим для формирования PDF документа). items_report.html - шаблон отчета. В папку print будет сохраняться итоговый PDF документ.

Теги: java programming     Далее