• Куда вынести специфичную логику сервиса?

    @sirs
    Попробуйте использовать паттер strategy.
    Создаете enum с перечислением всех типов документов и под каждый тип пишите обработчик, обработчик содержит методы save, read, edit и т.п. для каждого типа документа. Также делаете дефолтовую реализацию, если для какого-нибудь типа документа не нужно менять логику. В своем общем сервисе будете в runtime вызывать обработчик для типа документа и выполнять нужные методы.
    Ответ написан
    Комментировать
  • Как в Docker в контейнер передать параметры?

    @sirs
    Arg
    Ответ написан
    Комментировать
  • Как исправить чтение страницы??

    @sirs
    Попробуйте использовать это

    final String answer = StringEscapeUtils.unescapeJava(inputText);
    Ответ написан
    Комментировать
  • Как организовать обновление части страницы в jsp?

    @sirs
    return "user/userTariffs"; Означает отправить user на эту страницу, Вы делаете ajax запрос и контроллер ни на какую страницу юзера не отправляет. Для того, чтобы информация обновилась на странице, как Вы хотите, Вам нужно эту информацию передать из контроллера на сервере в браузер клиента в респонсе, аннотация @ResponseBody и на клиенте использую js обновить html страницу.
    Передать в респонсе можно кусок html, xml, json, можно просто передать String, главное, чтобы js код, который будет обрабатывать респонс понимал чего ему ожидать от сервера.
    Самый просто вариант для вашего случая:
    @RequestMapping(value = "/userChangeTariff", method = RequestMethod.POST)
    @ResponseBody
        public Integer changeTariff(HttpServletRequest req,
                                   @RequestParam(value = "sum") Integer sum) {
            final Integer newSum = new Integer(sum+1);
            req.getSession().setAttribute("userPayment", );
            return newSum;
        }


    На клиенте сделать:
    <div class="popover-content">
                        <div class="list-group">
                            <a href="userTariffs" class="list-group-item">
                                <h4 class="list-group-item-heading text-overflow">
                                    <i class="fa fa-fw fa-envelope"></i> My scope
                                </h4>
                                <p class="list-group-item-text text-overflow">I spend <span id="user_payment_sum">${userPayment}</span> RUB per month</p>
                            </a>
                        </div>
                        <div style="padding:10px"><a class="btn btn-success btn-block" href="userTariffs">Show me
                            more...</a></div>
                    </div>


    function popBox() {
                 x = confirm('Are you sure? ');
                   if (x == true) {
                  var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == XMLHttpRequest.DONE) {
            alert(xhr.responseText);  //TODO test alert
    document.getElementById('user_payment_sum').innerHTML =xhr.responseText;
        }
    }
                  xhr.open("POST", "userChangeTariff?sum=" + par1, false);
                 xhr.send();


    Обратите внимание, что я добавил <span id="user_payment_sum">, в которой лежат те данные, которые мы хотим динамически менять по ajax запросу на сервер и секцию if (xhr.readyState == XMLHttpRequest.DONE) {, которая ожидает ответ и выполняет некие действия, когда приходит респонс.

    P. S. Мой совет Вам учить основы: как работаю клиент-серверные приложения, как работет servlet, jsp, session, ajax и только потом браться за фреймворки. Просто делая по образцам из интернета - не научитесь, однажды будет такая задача, примера который в интернете не будет попросту.
    P. P. S. Код не запускал, написал просто по памяти, возможно какие-то ошибки.
    Ответ написан
    1 комментарий
  • Как подружить jsp и jsf?

    @sirs
    Сделать можно, но как выше заметил Евгений не имеет практического смысла. Единственный кейс, который могу придумать - постепенная миграция проекта с jsp на jsf или наоборот.

    Попробуйте сконфигурировать DEFAULT_SUFFIX и FACELETS_VIEW_MAPPINGS, добавив в web.xml
    <web-app>
        <context-param>
            <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
            <param-value>.jsp</param-value>
        </context-param>
    
        <!-- Facelets pages will use the .xhtml extension -->
        <context-param>
            <param-name>facelets.VIEW_MAPPINGS</param-name>
            <param-value>*.xhtml</param-value>
        </context-param>     
    
        <servlet>
            <servlet-name>Faces Servlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        </servlet>
    
        <!-- Use prefix mapping for Facelets pages, e.g. http://localhost:8080/webapp/faces/mypage.xhtml -->
        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>/faces/*</url-pattern>
        </servlet-mapping>
    </web-app>


    Хотя я не видя кода в контроллерах не могу сказать насколько это поможет. Все-таки это разные способы построения приложений.
    Ответ написан
  • Как обеспечить безопасность доступа к jsp состоящему из нескольких файлов?

    @sirs
    Все странички, кроме index.jsp ложите в web-inf, к ним не будет прямого доступа. А страничка index.jsp собирается из отдельных частей на стороне сервера (теги include и все такое) и для клиента представляется цельным куском html.
    Ответ написан
    2 комментария
  • Как в restful приложении получить объект?

    @sirs
    Попробуйте сделать на спринговом RestTemplate как тут описано. Пример как получить List<User> usersтут

    P. S.
    String output = null;
            String URLstring = "http://localhost:8080/getRestInfo?contract=base";
            URL url = new URL(URLstring);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "application/json");
            conn.setRequestProperty("Authorization", "Basic " +
                    new String(new Base64().encodeBase64("b@b.ru:12345".getBytes())));
            if (conn.getResponseCode() != 200) {
                System.out.println("Failed : HTTP error code : "
                        + conn.getResponseCode());
                System.exit(1);
            }
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    (conn.getInputStream())));
    
            output = br.readLine();
    
            /**
             * Здесь в output переменной у Вас в output лежит json, чтобы преобразовать его в java бины нужен парсер (это называется десериализовать), наиболее популярные - Gson или Jackson
             */
            Gson gson = new Gson();
            Type userListType = new TypeToken<ArrayList<User>>() {}.getType();
            List<User> users = gson.fromJson(output, userListType);
    
            conn.disconnect();
            System.out.println(output);
    Ответ написан
    1 комментарий
  • Почему if не определяется?

    @sirs
    Что значит не определяется?
    В java строки сравнивают по equals (если они не были добавлены через .intern()), а у Вас написано if(fragment== "OneFragment").
    Попробуйте заменить на
    if("OneFragment".equals(fragment)) {}
    Ответ написан
    Комментировать
  • Нужен ли дополнительную объект между сущностью и JSON объектам?

    @sirs
    Нужен. DTO объекты с конвертацией в сервисе из того, что принимает/понимает контроллеры в то, что принимают/понимают dao или repository.

    Вопрос обсуждался здесь не один раз, смотрите например тут
    Ответ написан
    Комментировать
  • Каким образом связать spring и ajax?

    @sirs
    В spring mvc вернуть статус можно несколькими путями, если статус нужно возвращать один и тот все время, то подходит аннотация @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR), просто повесить на метод в контроллере.
    В Вашем случае такой вариант не подходит (если я верно понимаю). Вам нужно сделать так:

    public ResponseEntity<?> userNumberOperationsDelete(HttpServletRequest req, HttpServletResponse resp, Locale locale, Model model,
                                                 @RequestParam(value = "number") String number,
                                                 @RequestParam(value = "status") String status) {
    ...
     } else {
                    return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR);
                }
            }
        return new ResponseEntity<>(HttpStatus.OK);
    }


    Не знаю, где Вы нашли статус 530, но spring его не знает и я Вам очень не советую использовать кастомные статусы, когда работаете с фреймворками. Возьмите INTERNAL_SERVER_ERROR статус.
    Ответ написан
    3 комментария
  • Почему Hibernate пытается создать сущность с нулевым id?

    @sirs
    Если у Вас mysql, то я бы порекомендовал сделать так:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "contract_id")
        private int contractId;

    т.е. поменять strategy на IDENTITY.

    И в таблице 'Contract' в базе добавить AUTO_INCREMENT PRIMARY KEY, чтобы mysql сам генерил ключи.
    Ответ написан
    1 комментарий
  • Как скрыть переменную в jstl?

    @sirs
    Тут есть разные варианты, например
    1) засунуть в
    <input type="hidden" name="tariffId" value="${tempId.add(tariff.tariffId)}">

    или
    2) засунуть это в
    <script>
    var tariffID = "${tempId.add(tariff.tariffId)}";
    </script>

    Если у Вас for-each - возмите array или какой-нибудь объект key-value в js, т.е.
    <script>
    var array = new Array();
    <c:forEach var="tariff" items="${allTariffs}" varStatus="loop">
                                        array.push('${tempId.add(tariff.tariffId)}');
                                       </c:forEach>
    </script>
    Ответ написан
    1 комментарий
  • Почему происходит Internal 500 Server Error в моём коде?

    @sirs
    Ну у Вас ответ и написан в логе:
    "Not available in non blocking mode at org.apache.catalina.connector.InputBuffer.isReady(InputBuffer.java:297)"

    Замените

    if(servletInputStream.isReady()){}

    на

    if(servletInputStream.isFinished()){}
    Ответ написан
  • Для чего используются "методы по умолчанию" на практике?

    @sirs
    В java 8 default methods были добавлены в первую очередь для того, чтобы добавить новые методы к старым интерфейсам и сохранить совместимость с уже существующим кодом.
    Самый яркий пример - интерфейс Collection и метод stream

    P. S. Очень хорошее обсуждение здесь
    Ответ написан
    Комментировать
  • Как работают замыкания в Java?

    @sirs
    Можно ознакомится тут, вполне доступно на русском языке

    В Вашем конкретно случае поможет AtomicInteger и инкрементаем его, ну или использовать массив.
    Ответ написан
    2 комментария
  • Какую архитектуру выбрать для запуска парсеров по расписанию в параллельном режиме?

    @sirs
    А Вам точно нужен планировщик и очередь? Почему бы просто не создать набор парсеров, каждый из которых будет запускаться по cron.
    Как варианты посмотрите
    1) quartz, тут и тут хороший пример
    2) ScheduledExecutorService
    3) TimerTask
    Ответ написан
    Комментировать
  • Как передать дату с jsp страницы через Spring в базу данных MySQL?

    @sirs
    Насколько я понимаю Ваша проблема связана с тем, что Вы используете java.util.Date и пытаетесь его сохранить в mysql. Есть несколько вариантов решения:
    1) В классе Client поменять тип поля на java.sql.Date и где-нибудь перед сохранением в бд делать конвертацию
    java.sql.Date birthDate= new java.sql.Date((birthDateInput).getTime());


    2) Добавить аннотацию @Temporal
    @Temporal(TemporalType.DATE)
    private Date birthDate;

    в классе Client.

    3) Собрать дату как string
    java.text.SimpleDateFormat sdf = 
         new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String birthDateTime = sdf.format(birthDateInput);

    и сохранить в базу. Минус будет в том, что при select нужно будет делать обратные действия.
    Ответ написан
    1 комментарий
  • Как храняться данные в хеш-таблице?

    @sirs
    Советую Вам почитать эту статью, станет многое понятно.
    Если коротко - то в java НЕ выделятся память под какой-либо объект исходя из максимально возможного значения. Преимущество коллекций (если я верно понимаю Вас интересует HashMap) в том и заключается, что у них изменяемый размер.
    Ответ написан
    Комментировать
  • VK + java. Парсер профилей, как сделать?

    @sirs
    Метод users.get возврашает информацию о пользователях, в том числе и 'online'. Про поле online можно почитать тут
    Ответ написан
  • Почему не выполняется sql-запрос в Hibernate?

    @sirs
    Ваша ошибка связана с тем, что hibernate возвращает List и не знает какой будет тип во время компиляции. Нужно добавить преобразование к нужному Вам типу.
    Попробуйте
    List<Tariff> tariffs = (List<Tariff>) session.createSQLQuery(sql).list();


    и @SuppressWarnings("unchecked") если смущают warnings.
    Ответ написан
    Комментировать