Ответы пользователя по тегу 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())
    Ответ написан
  • Расчет рабочих часов между двумя датами?

    @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 комментария
  • Как оценить системные требования для серверной части приложения?

    @bobzer
    Java EE Developer
    Уже год мой софт работает в облаке. Взял Windows (да, я люблю графические интерфейсы и не знаю Linux) с 1ГБ памяти и динамически выделяемым процессором (от 800 до 2300 МГц). На одном виртуальном сервере стоит и СУБД MySQL и Tomcat с моим приложением. Большую часть времени сервер потребляет минимальную планку процессора (800 МГц), потребление памяти 98% времени не боле 800 МБ, обычно 600-700 МБ. Была нагрузка до 20 запросов в секунду, мощности хватило на то, чтобы работать стабильно, без подвисаний (и это все под Windows!). Сделайте так же, один-в-один, одного сервера может хватить надолго. Современные облака выделяют дополнительные ресурсы автоматически, не превышая указанного вами предела (предел нужен чтобы не разориться если вдруг что...), так что неожиданной нагрузки можно не бояться.
    Ответ написан
    Комментировать
  • Какой framework выбрать для написания Web Service?

    @bobzer
    Java EE Developer
    Обычно, веб-сервисы работают под управлением контейнера - сервера приложений. Практически все современные сервера приложений имеют из коробки поддержку веб-сервисов. В соответствии со спецификациями Java EE, при разработке веб-сервиса вы просто указываете определенные аннотации в своем Java-классе (@WebService, @WebMethod), что сообщить серверу контейнеру о том, что этот класс он должен развернуть как веб-сервис. При разработке вы не обязаны знать какой именно фреймворк будет ответственен за то, чтобы опубликовать ваш веб-сервис в контейнере (сервере приложений). Если у вас еще нет серверного приложения, то его надо создать, перед этим выбрав сервер приложений (например, TomEE, WildFly aka JBoss). Создаёте приложение (.war), которое содержит в себе класс с аннотациями веб-сервиса и, например, JBoss сам найдет этот класс и развернет веб-сервис. В качестве фреймворка веб-сервисов, сервера приложений обычно используют CXF.

    По поводу того, какой SOAP старый и плохой - это сугубо личные мнения, советую не заморачиваться, пока сами не разберетесь. Да, XML тяжелый в части расхода ресурсов железа (которое стоит дешевле труда программиста), но лично я пока не видел ни одного стандарта, который бы был так удобен при интеграции самых разнообразных информационных систем. Например, как-то пытался найти язык описания REST-сервисов, и не нашел ничего. Вот разверну я сложный REST-сервис, а потом каждому разработчику на пальцах объяснять что и откуда? А когда объясню, ему придется сесть и вручную все рисовать. REST/JSON хороши только пока вы используете их в пределах одной Системы, например, для обмена данными между клиентом и сервером. Но когда вы интегрируете несколько абсолютно разных платформ, которые к тому же разрабатывают программисты с разным уровнем профессионализма, тот стоит очень хорошо подумать...
    Ответ написан
    4 комментария
  • Какой web framework для java выбрать?

    @bobzer
    Java EE Developer
    Не ответ, а комментарий ко всем ответам - достали уже с этим Spring. По сути, Spring - это контейнер, в котором разворачивается приложение, и которому Spring предоставляет различные сервисы, в основном: управление транзакциями, развертывание веб-сервисов, Depedency Injection. При этом, сам Spring обычно работает под управлением внешнего контейнера - сервера приложений. Проблема в том, что современные сервера приложений (бесплатные - JBoss/WildFly, TomEE) предоставляют ТЕ ЖЕ САМЫЕ сервисы из коробки. Получается контейнер в контейнере, и попробуй разберись из какого из них ты получаешь тот или иной сервис. Во многих случаях ресурсы просто дублируются - те же бины JBoss находит в jar-ах сам и без каких-либо указаний сразу их деплоит. Плюс вы в Spring-е их же конфигурируете и деплоите второй раз. А если вы в аннотациях указали @Singleton, как себя поведет ваша Система?

    Spring - отличная штука, была, лет 5 назад, когда была спецификация J2EE. Сейчас все самое нужное, из того что он давал, уже есть в спецификациях JEE 6, и в серверах приложений, реализующих эти спецификации. Опытные люди говорят так: если у вас есть проект на Spring, работайте и дальше на Spring, если вы создаете проект с нуля - берите JEE 6, про Spring забудьте. Да, у Spring все еще появляются уникальные обертки над различными сервисами, за счет которых они еще пытаются доказать свою востребованность. Но, во-первых, то же, что дает Spring, практически всегда можно сделать другими способами. Во-вторых, в большинстве реальных проектов используется 3-5% сервисов Spring-а, и как я уже сказал, эти сервисы уже есть в серверах приложений.

    Если что, погуглите "Spring vs JEE 6" прежде чем холиварить...
    Ответ написан
    2 комментария
  • Hibernate many to many с дополнительными атрибутами?

    @bobzer
    Java EE Developer
    Думаю, что вам нужен one-to-many на самом деле, т.е. в сущности User хранится список сущностей Achievement. При этом сущность Achievement имеет поля, описывающие конкретное достижение конкретного пользователя (дата получения и другие параметры), а также ссылку на тип достижения (следующий уровень one-to-many). По поводу Set/List - как объявите в классе так и будет, но для сортировки требуется указать order-by в .hbm.xml.

    Примерно так:
    public class User {
        private List<Achievement> achievements;
        get...
        set...
    }
    
    public class Achievement {
        private User user;
        private Date createDate;
        private DicAchievementType type;//справочник типов достижений
        get...
        set...
    }


    User.hbm.xml
    <bag name="achievements" inverse="true" cascade="all,delete-orphan" order-by="CREATE_DATE">
        <key column="user_id"/>
        <one-to-many class="Achievement"/>
    </bag>


    Achievement.hbm.xml
    <many-to-one name="user" column="user_id" class="User"/>
    <many-to-one name="type" column="achievement_type_id" class="DicAchievementType"/>
    Ответ написан
    1 комментарий
  • Как настроить правильную кодировку в связке MySQL + Tomcat?

    @bobzer
    Java EE Developer
    Попытайтесь указать кодировку в url соединения в context.xml следующим образом:
    url="jdbc:mysql://ip:3306/name?useUnicode=true&amp;characterEncoding=UTF-8"
    Ответ написан