• Как дружат UI на JS и Java EE server-side?

    @bobzer
    Java EE Developer
    2. Написание Rest API
    Данный подход сейчас - мэйнстрим в разработке веб-проектов. Производительность высокая, механизм универсален и поддерживается практически всеми языками/фреймворками. Для примера: доводилось переходить со встроенных механизмов обмена данными с сервером GWT, на передачу тех же данных с помощью REST - при тех же объемах данных время возврата ответа значительно снижалось.
    Кроме производительности, удобство использования также на высоте - в большинстве случаев код лаконичен и ясен. Обращения к серверу можно осуществлять практически из любого места в вашем JS-клиенте. Главное - не забывать о асинхронности, и строить логику с учетом этого: код, зависящий от результатов запроса обрабатывать в callback-ах, переданных в вызов REST.
    Ответ написан
    5 комментариев
  • Из гуманитария в программисты, или как найти работу?

    @bobzer
    Java EE Developer
    У меня похожая ситуация, только в программисты я пришёл из строителей. Образование строительное, стаж работы на стройке 4 года после стройтеха. Пока работал на стройке вечерами изучал Pascal, как мог, без Интернета (конец прошлого века), благо приятель иногда приносил текстовики с какой-то инфой, ну, и конечно help самого Паскаля. За пару лет убедился в том, что мне это по душе, и что-то получается, решил как-то перебираться с улицы (стройки) в офис. Удалось устроиться на должность "бухгалтер-оператор", главное здесь было то, что это была первая работа в офисе и за компьютером. Нашел там себе возможность программировать, но слабую. После пары лет просиживания штанов там, стал смотреть вакансии (тогда это делалось путем просмотра местных газет). Вакансий было мало, но меня пригласили на собеседование, на котором я рассказал как писал игру на Паскале, работая с видеокартой на ассемблере, и том как к строчкам кода на машинном языке писал комментарии на ассемблере. Дали тестовое задание по аналитике (нужны были и аналитики и программисты, видимо дали то, что проще дать), связанное с таможней. Купил таможенный кодекс, что-то написал, принес - удивились (- откуда такие знания? - из книжек!), взяли на испытательный срок.

    Что такое СУБД и сервер приложений я тогда не знал, и первое время "горел" на работе - пахал как мог весь день, вечерами шел к тете и читал интернет (дома интернета не было). В общем взяли меня программистом, насколько помню толи $300 толи $400 начальный оклад был. Ну а потом втянулся, разобрался, стал одним из лучших, довелось и отделом разработки руководить, а сейчас нарасхват - работа меня сама находит... Одно большое НО - семьи не было. И даже при отсутствии семьи искал работу программистом не бросая текущую рутину.

    Итого: каменщик 4 года->завскладом 1 год -> оператором 2 года -> программистом стал в 27 лет
    Ответ написан
    2 комментария
  • Почему ломает форматирование при редактировании документов с помощью POI?

    @bobzer
    Java EE Developer
    Да, ваш файл и у меня тоже после копирования с POI теряет форматирование, да и вообще открывается с ошибками. Как я и предполагал, дело в самом файле: в нем слишком много всего наворочено, даже парольная защита на изменения... К сожалению, POI не всемогущий, и поддерживает далеко не все функции Excel. И дело не столько в разработчиках POI, сколько в формате, используемом Microsoft. Разработчики POI даже используют аббревиатуру HSSF - Horrible Spreadsheet Format (ужасный формат таблиц). Думаю, что в чистом виде в вашем случае решения проблемы с POI нет, надо искать обходной вариант. Можно попробовать использовать нативный API Microsoft (для Java затруднительно), либо как-то менять исходный файл, либо смириться с потерями и брать из файла только данные (а форматирование реализовывать в своём коде).

    Вообще, POI в основном используется для выгрузки данных Java-программ, а работа с произвольными существующими файлами применяется редко...
    Ответ написан
    Комментировать
  • На чём писать программу для работы с таблицами Excel?

    @bobzer
    Java EE Developer
    В Excel есть встроенный язык Basic. Можно сделать всё не выходя за рамки самого Excel-а: напишите макрос, добавьте кнопки, вызывающие макрос с нужными параметрами.

    Если смысл задания именно в отдельной программе, то задача примерно следующая: открыть файл Excel, считать из него все непустые строчки и загрузить их в табличку в вашей программе. Далее всё делается средствами языка, от Excel уже ничего не зависит.

    Как открыть и считать файл подскажет Гугл по запросу "{язык} Excel".
    Ответ написан
    2 комментария
  • Почему проверка ЭЦП в первом варианте выдает true а во втором false?

    @bobzer
    Java EE Developer
    Ну, во-первых, смысл эксперимента непонятен - у вас есть рабочий код проверки ЭЦП, зачем второй вариант?

    Во-вторых - к сути вопроса. Можно предположить, что XMLSignature сделан не просто так, и отличается чем-то от Signature. А отличается тем, что XMLSignature учитывает тот факт, что у XML-документов есть структура, в то время как Signature осуществляет проверку неструктурированного массива байт. При использовании XMLSignature применяется канонизация, которая приводит считанную из файла DOM-структуру к некоему общему виду. При этом XMLSignature осуществляет проверку именно канонизированной DOM-структуры, а не массива байт, считанного из файла без какой-либо его интерпретации.
    Ответ написан
    Комментировать
  • Как создать клон объекта в Java?

    @bobzer
    Java EE Developer
    У вас 2 варианта:
    1. Использовать какую-либо библиотеку для глубокого клонирования. Плюс в гораздо меньшем количестве бездумного кодинга. Минус в падении производительности и повышенном потреблении ресурсов. Если количество операций клонирования в приложении менее сотни в секунду, то можно не беспокоится по поводу производительности.
    2. Писать всё клонирование самому, поле за полем. Плюс в высокой производительности - ни одна универсальная библиотека не сравнится в скорости с таким подходом. Минус в массе говнокода, который еще и поддерживать надо (при любом изменении класса не забывать дорабатывать методы clone())
    Ответ написан
  • Tomcat и autodeploy. Как правильно реализовать?

    @bobzer
    Java EE Developer
    Как вариант - разворачивать приложение в не упакованном виде, т.е. это должна быть папка (например, ROOT), в которой в виде папок и файлов находится структура приложения. При таком подходе повторного деплоя не будет вообще (даже если классы сервлетов изменились).

    А вообще, редеплой Java-приложения "на горячую" - опасная практика. Тут и с версионностью классов могут быть проблемы, и с утечками памяти, и черт знает с чем еще. Лично я редеплой "на горячую" применяю исключительно на тестовых серверах...
    Ответ написан
  • Как сделать связь между сотрудниками и заказами?

    @bobzer
    Java EE Developer
    1. Как сделать подобную связь писал тут: Hibernate many to many с дополнительными атрибутами?

    2.
    как гарантировать наличие связи
    Hibernate - это ORM, не меньше, но и не больше. Он дает удобный объектный доступ к данным в БД. Но Hibernate не обязан разбираться в вашей бизнес-логике. Ну уровне реляционной БД нельзя гарантировать наличие связи many-to-many, логично, что и на уровне Hibernate этого тоже сделать нельзя. Соответственно, ответ на ваш вопрос - гарантировать наличие связи должна ваша бизнес-логика.
    Ответ написан
    Комментировать
  • Расчет рабочих часов между двумя датами?

    @bobzer
    Java EE Developer
    Когда-то тоже разыскивал, ничего дельного не нашел. Оказалось, что написать всю логику самому - не такое уж большое дело. Скину Java-исходники пары методов, надеюсь, поможет понять направление. Исходники под GWT, надо будет заменить DateTimeFormat на SimpleDateFormat и переделать plusDays()...
    /**
         * Метод проверяет, является ли указанная дата выходным днем, или праздничным днем. Также осуществляется
         * проверка - является ли указанная дата выходным днем, указанным как рабочий день (постановлением Правительства)
         * @param date проверяемая дата
         * @return признак, является ли указанная дата рабочим днем
         */
        public boolean isWorkingDay(Date date) {
            String dayOfWeek = DateTimeFormat.getFormat("EEE").format(date);
            String dateStr = DateTimeFormat.getFormat("yyyy-MM-dd").format(date);
    
            return (!dayOfWeek.startsWith("Sat") && !dayOfWeek.startsWith("Sun")
                    && !holidays.contains(dateStr))
                    ||
                    workWeekends.contains(dateStr);
        }
    
        /**
         * Метод осуществляет проверку, является ли указанная дата выходным днем, и если да, то переносит дату на
         * следующий после выходных рабочий день.
         * @param date проверяемая дата
         * @return исходная дата либо дата первого рабочего дня после выходных
         */
        public Date getBusinessDate(Date date) {
            while (true) {
                if (isWorkingDay(date)) {
                    return date;
                } else {
                    date = plusDays(date, 1);
                }
            }
        }
    
        /**
         * Метод осуществляет расчет указанного количества рабочих дней, которые должны истечь с момента указанной
         * начальной даты, и возвращает дату наступления искомого срока
         * @param date    начальная дата, относительно которой осуществляется расчет
         * @param days    количество рабочих дней, которые должны пройти относительно начальной даты
         * @return искомая дата
         */
        public Date addBusinessDays(Date date, int days) {
            for (int i = 1; i < days; i++) {
                date = plusDays(date, 1);
                if (!isWorkingDay(date)) {
                    days++;
                }
            }
            return date;
        }
    
        public static Date plusDays(Date date, int days) {
            Date clone = new Date(date.getTime());
            clone.setDate(date.getDate() + days);
            return clone;
        }


    workWeekends и holidays - HashSet-ы, читаются из БД, а в БД заполняются админом Системы на каждый год. workWeekends - рабочие дни вместо выходных, holidays - выходные дни вместо рабочих.

    Остальное додумаете сами...
    Ответ написан
    Комментировать
  • Как сделать сайт на JAVA?

    @bobzer
    Java EE Developer
    Вот простейший пример приложения на JSP.

    Здесь толково рассказано о том, как развернуть JSF-приложение. JSF более актуален для Java, чем JSP.

    Также есть множество JavaScript-фреймворков, активно использующихся в Java веб-приложениях.

    Лезть в Spring не рекомендую, по крайней мере до тех пор, пока не разберетесь как следует с принципами работы веб-контейнеров и основным стеком серверных технологий Java. А потом погуглите "Spring vs Java EE 6"...
    Ответ написан
    5 комментариев
  • Возможно ли сделать несколько пулов в tomcat для разных пользователей?

    @bobzer
    Java EE Developer
    Ну вот, например - habrahabr.ru/post/101342
    Смысл пула в том, что держит множество соединений. В вашей терминологии, каждому пользователю будет выдано отдельное соединение. Несколько пулов к одной БД - масло маслянное
    Ответ написан
    Комментировать
  • Как в java подключиться к postgresql?

    @bobzer
    Java EE Developer
    Учите Гугл. Вот ответ на русском: no pg_hba.conf entry for host
    Ответ написан
    Комментировать
  • Что такое jsf и Richfaces?

    @bobzer
    Java EE Developer
    Oracle говорит, что JSF:
    JavaServer Faces technology establishes the standard for building server-side user interfaces

    Если это "слишком заумно", то попробую упростить. JSF - это стандарт, который описывает один из подходов, который можно использовать для формирования HTML-странички на сервере, с последующей передачей её клиенту (браузеру). Существует масса технологий для того, чтобы делать то же самое, это одна из них.

    Есть базовые библиотеки, реализующие стандарт JSF, на вышеприведённой странице от Oracle есть ссылка на Mojarra.

    Richfaces - это одна библиотек, расширяющих стандарт JSF своими "плюшками". Есть и другие библиотеки.

    Обычно, JSF-проект включает в себя Mojarra и одно из расширений, они практически всегда хорошо уживаются. Ставить 2 расширения - не комильфо и чревато, плюс бардак в проекте. Что-то вроде установки двух двигателей на авто - редкий случай...

    Общий принцип работы. Вы пишете XML-страницы, которые содержат стандартный HTML и специфическую разметку стандарта JSF. При обращении к страничке из браузера (GET/POST), библиотеки JSF на сервере обрабатывают XML-страницу, формируют из неё HTML для браузера и возвращают это в ответе. Исходные XML-страницы описывают и разметку и наполнение этой разметки данными с сервера. Таким образом, при обработке запроса на сервере специфические теги преобразуются в HTML-элементы, и эти элементы наполняются данными из вашей бизнес-логики.

    Технология довольно распространённая в Java EE. Насчет преимуществ - это лишь тема для холиваров...
    Ответ написан
  • Как работать с транзакциями в hibernate?

    @bobzer
    Java EE Developer
    Вы смешали все в кучу и сами себя запутали. Во-первых, есть Container-Managed Transactions (CMT) и Bean-Managed Transactions (см. гугл). Зачастую, всё, что можно указывать аннотациями (такими, как @Transactional) относится к CMT. При работе с CMT в вашем приложении нет кода работы с сессиями и транзакциями, всё это неявно делает контейнер (например, сервер приложений). Раз у вас есть этот код, значит у вас Bean-Managed Transactions и аннотации просто игнорируются.

    Касательно lazy - вопрос вообще отдельный. Обычно проблемы с lazy инициализацией возникают при чтении данных сущности, а не при ее сохранении. Так что приведенный код и "попытке вытянуть lazy data из объекта - получаю ошибки" друг к другу отношения не имеют.

    В общем и целом, если хотите нормально разобраться, прервите кодинг и займитесь изучением документации.
    Ответ написан
    1 комментарий
  • Java Gson deserialization. Как обработать интерфейсы?

    @bobzer
    Java EE Developer
    Зависит от реализации, используемой вами. В Jackson это делается так:
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
    @JsonSubTypes({
            @JsonSubTypes.Type(value = Bla.class, name = "Bla"),
            @JsonSubTypes.Type(value = Bla2.class, name = "Bla2")
    })
    interface IBla {}

    Аннотацией @JsonSubTypes вы указываете список всех возможных реализаций интерфейса.
    JsonTypeInfo определяет, что во входящем JSON будет поле "type", которое сообщит о том, к какому типу привести абстрактный IBla при получении JSON-сообщения.
    Ответ написан
    1 комментарий
  • Как лучше получить данные удаленно?

    @bobzer
    Java EE Developer
    Если вы выбрали именно HTTP, то вам потребуется веб-сервер для того, чтобы "поднять" этот протокол на сервере, а на веб-сервере потребуется еще развернуть движок REST-сервисов и непосредственно свой веб-сервис, который будет читать файл и возвращать его содержимое. Обычно, такой подход используется для более сложных задач, чем просто скачивание статического файла. Если вся суть задачи - скачать файл с сервера, то не нужен вам ни веб-сервер, ни JSON, ни HTTP; используйте любой удобочитаемый для вашего ПО формат файла, а забирайте файл, например, по FTP...
    Ответ написан
    Комментировать
  • Как сгенерировать документацию для xsd схемы, на основе java-doc?

    @bobzer
    Java EE Developer
    Это можно сделать, но классический JavaDoc не пройдёт. Вот здесь описан подход, который я с успехом применил в своих проектах. Надо только добавить нужные аннотации, и разобраться с нестандартными версиями библиотек. После этого, WSDL генерирую так:
    org.apache.cxf.tools.java2ws.JavaToWS.main(new String[]{"-d", "d:\\temp\\gen\\", "-verbose",
    //                "-createxsdimports",//раскоментировать если нужно выделить xsd-шки в отдельные файлы
                    "-wsdl", "webservice.SomeService"});

    webservice.SomeService имеет аннотации @WebService и @WSDLDocumentation, а классы запросов и ответов помечены аннотацией @Documentation
    Ответ написан
    1 комментарий
  • Что сделать чтобы заработал JSON в jQuery (Spring)?

    @bobzer
    Java EE Developer
    Скопировал Ваш код почти один-в-один, но проблему воспроизвести не удалось. Всё работает как и надо: указал text - получил строку, указал json - получил Array. Вот мой код:
    var url = "bean/getData";
                        $.ajax({
                            url: url,
                            method: "get",
                            contentType: "application/json",
                            dataType: "json",
                            async: false,
                            success: function (data) {
                                alert(data);
                            }
                        });


    @RequestMapping(value = "/bean")
    public class Controller {
    
        @RequestMapping(value = "/getData", method = RequestMethod.GET)
        public
            @ResponseBody
            List<String> showData() {
            List<String> list = new ArrayList<String>();
            list.add("2");
            list.add("1");
            return list;
        }
    }

    Попробуйте скопировать как есть себе и добиться работоспособности. Используйте отладчик браузера для просмотра Сети и JS-исходников. Если заработает, пошагово добавляйте свою специфику, проверяя работоспособность после каждого изменения. Вполне вероятно, что Вы внесли изменения сразу в нескольких местах, и все сломалось вовсе не потому, что это было переключение на json. Я в своем примере просто меняю dataType между text и json и сразу получаю в data соответственно строку или массив.
    Ответ написан
    1 комментарий
  • Не преобразуется JSON в Java Object?

    @bobzer
    Java EE Developer
    Попробуйте к методу addUser добавить
    @Consumes(MediaType.APPLICATION_JSON)
    а headers там не нужен
    Ответ написан
    Комментировать
  • Какие нужны технологии для создания серверного приложения для математичских вычислений?

    @bobzer
    Java EE Developer
    Вам не нужен фреймворк, вам нужен сервер приложений (который уже содержит в себе все нужные фреймворки). Под управлением сервера развернете свое веб-приложение (.war), и в нем реализуете всю нужную логику. Для многопоточности делать не придется ничего, т.к. сервер сам будет выделять отдельные потоки для обработки обращений с клиентской части.

    С имеющимися у вас навыками, скорее всего, будет нелегко, но Гугл поможет. Для начала можно попробовать, например, так:
    www.centerkey.com/jboss
    дальше эдак: jaxenter.com/getting-started-with-apache-tomee-105...
    или погуглить самостоятельно "java war hello wrold"

    Сначала запустите пустой сервер приложений, чтобы при старте не было ошибок. Затем разверните под его управлением свой Hello World как в первой ссылке. Если открывается, смотрите какие техники/технологии применены по второй ссылке и подключайте последовательно к своему приложению. Простое веб-приложение должно развернуться на любом сервере приложений без доработок. Попробуйте TomEE или WildFly...

    Посмотрите еще вот это, поможет сориентироваться:
    С чего начать изучение Java EE
    JPA и Hibernate или Hibernate?
    Какой framework выбрать для написания Web Service?
    Какой web framework для java выбрать?
    Что почитать для того чтобы написать web сервер на Java?
    Поддерживает ли Tomcat java 8? Если нет, то какие контейнеры поддерживают?
    Это только мои ответы, а сколько информации по Java EE в Сети - за 10 жизней не перечитать...
    Ответ написан
    2 комментария