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     Далее

22.12.2012

Java EE: Загрузка классов в Jboss Application Server 7.

Когда приложение Java EE запускается на сервере - происходит поиск и загрузка необходимых классов. Сторонние зависимости могут находится в JAR библиотеках, которые поставляются с программой; в библиотеках которые предоставляются сервером; а иногда - в других приложениях, запущенных на данном экземпляре сервера. Если приложение содержит множество зависимостей, есть вероятность столкнуться с разными неприятными ситуациями. Что будет, если сервер предоставляет библиотеку, а в это же время другая версия этой библиотеки присутствует в приложении? Можно убрать ее из приложения и перейти на версию, поставляемую с сервером. В принципе, если это не получится, можно убрать библиотеку с сервера и использовать свою версию. А если другим запускаемым программам нужна именно та версия, которая есть на сервере? Говоря в общем, если зависимостей много, одни и те же библиотеки доступны в разных местах (на сервере, в приложении, в другом приложении и т.п.), встречайте - JAR hell. Для того чтобы избавиться от подобных проблем при использовании Jboss AS 7, нужно понять каким образом организована загрузка классов и как можно с успехом манипулировать зависимостями приложения.
Теги: jboss javaEE 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     Далее

03.04.2013

Связывание XML данных с помощью Castor.

В Java для связывания данных с их XML представлением существует несколько способов (например JAXB: использование JAXB, автоматизация JAXB маппинга). Хотелось бы рассказать про использование одного из них - Castor. Castor это фреймворк, обеспечивающий связывание Java объектов с их XML представлением или с представлением в реляционных базах данных. Использование JAXB подходит во многих случаях, но маппинг XML/Java с помощью Castor обеспечивает большую гибкость. Он позволяет использовать несколько режимов связывания - как простой, так и более сложные, в которых доступно множество возможностей для тонокой настройки формата связываемых данных. Итак, давайте посмотрим, какие это режимы, как и когда их лучше использовать, а также как упростить процесс связывания.
Теги: xml java     Далее

21.06.2013

Java web frameworks. JSF vs Spring MVC.

Мне хотелось сделать обобщенный и краткий обзор недостатков и плюсов фреймворков для разработки веб-приложений на Java, на примере JSF и Spring MVC. А если точнее - обзор двух концептуально разных подходов к разработке, на примере вышеуказанных фреймворков. Я выбрал Java Server Faces потому что это в своем роде "официальный" стандарт для разработки веб-приложений на Java, и потому что я уже существенное время имею дело именно с этим фреймворком. Spring MVC - исключительно потому что я с ним знаком. И наконец, краткий и обобщенный - потому что это очень обширная и многогранная тема, на которую можно смотреть с разных сторон, оценивать преимущества того или иного фреймворка по очень разным критериям, зачастую субъективно и в зависимости от области использования. В принципе можно было назвать пост "почему JSF не лучший выбор", так как я считаю, что концепция JSF сама по себе не самая удачная, мне видится в ней больше минусов, чем плюсов. Возможно в других фреймворках, ориентированных на работу с компонентами, эта идея реализована удачнее, но из-за того, что я знаком с JSF - я буду говорить о нем.
Теги: java javaEE     Далее

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 является представлением игрового поля для игры в крестики-нолики, а также содержит все необходимые для реализации игры методы: 


16.12.2014

Окей Google. Используем Custom Search API в Java.

Google Custom Search - это система пользовательского поиска, которая позволяет создавать вам собственную "поисковую машину". Одно из распространенных применений Google Custom Search, это поиск по вашему сайту. Если вы владелец сайта и вы решили сделать поиск по нему с помощью Google, вы можете создать свою систему пользовательского поиска, указать Google, что искать нужно только на вашем сайте, а кроме того - доступны другие настройки. Однако это вовсе не единственное назначение и возможное применение Google Custom Search. Поиск может производиться не только на вашем сайте - это может быть заданный по определенным правилам список сайтов, или же вообще весь веб. Использовать Custom Search можно по разному - существует несколько вариантов API. В этой статье я покажу, как использовать Google Custom Search из Java приложения, используя REST API. Целью этого примера будет: создать Java приложение, которое может выполнить поиск в Google с помощью Custom Search API и получить список ссылок из результатов поиска. 

1. Создаем свою систему пользовательского поиска. 

Первым делом нужно создать вашу систему поиска. Для этого перейдите к управлению системами пользовательского поиска - https://www.google.com/cse. Итак, создаем новую систему поиска, кликнув "Add":

При создании системы нужно указать адрес или адреса, по которым будет выполняться поиск. Цель нашего проекта - поиск во всем вебе, так что указываем любой URL, затем переходим к свойствам только что созданной системы и в настройках указываем, что нам необходим поиск во всем Интернете:

Теги: api google java     Далее

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     Далее

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     Далее