Задать вопрос
  • Как завершить программу Java при вводе пользователем символа q в любом месте программы?

    azerphoenix
    @azerphoenix Куратор тега Java
    JennyK,
    Вы трижды повторяете вот, этот код:
    if (b.equals("q"))
                System.exit(0);

    Если есть повторение, то можно и вынести его в отдельный метод. Ну и скажем, что не самая лучшая идея, но в учебных целях пойдет
  • Как добавить проверку на ввод в spring boot application?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Лев Соболев,

    Спасибо вам большое за подробный развернутый ответ!

    Рад помочь.

    Раз вы пишете MVC приложение, то допустим, что для отображения шаблона вам нужен GET запрос. Т.е. есть некий метод, который обрабатывает GET запрос и выдает шаблон. Далее если на странице есть некая форма (например, форма регистрации или контактная форма), то для получения данных отправленных из формы вам нужно написать POST методы. В общем, рекомендую прочитать про HTTP METHOD (GET, POST, PUT, DELETE и т.д.). Так как вы работаете в рамках html и скорее всего без js, то пока вам понадобится GET & POST.

    Приведу простой псевдокод, чтобы вы могли примерно понять логику. А дальше для получения большей информации рекомендую погуглить и прочитать соответствующие статьи. Хороший ресурс - baeldung.com

    Допустим у вас есть:
    - контроллер для обработки запросов

    @Controller
    @RequestMapping("/users")
    public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping
    public ModelAndView usersList(){
    ModelAndView modelAndView = new ModelAndView("НАЗВАНИЕ_ШАБЛОНА");
    modelAndView.addObject("users", userService.findAll());
    return modelAndView;
    }
    
    @PostMapping("/add")
    public RedirectView addUser(
    @Valid UserRequest userRequest
    ){
    userService.addUser(userRequest);
    return new RedirectView("/users");
    }
    
    }


    Далее у нас есть entity User
    public class User {
    long id;
    String username;
    String password;
    }

    а также есть dto UserRequest, где мы валидируем данные
    class UserRequest {
    @NotBlank(message="Username can't be empty")
    String username;
    @NotBlank(message="Password can't be empty")
    String password;
    }


    Далее вам понадобится конвертер UserRequest -> User. Можно подключить либу ModelMapper или MapStruct, но можно обойтись и без них. Например,

    @Component
    public class UserConverter extends Converter<UserRequest, User> {
        @Override
        public User convert(UserRequest userRequest) {
           User user = new User();
           user.setUsername(userRequest.getUsername());
           user.setPassword(userRequest.getPassword());
        }
    }


    И конечно же у нас есть UserService, где указана бизнес логика. Например,

    @Service
    public class UserService {
    
    @Autowired UserRepository userRepository;
    @Autowired UserConverter userConverter;
    
    public List<User> usersList() {
    return userRepository.findAll();
    }
    
    public void addUser(UserRequest userRequest) {
    User user = userConverter.convert(userRequest);
    userRepository.save(user);
    }
    
    }


    Я привел довольно простой пример. Конечно же можно обработать исключения и т.д. Но думаю, общий смысл будет вам понятен

    Полезные ссылки:
    https://www.baeldung.com/spring-mvc-model-model-ma...
    https://www.baeldung.com/spring-redirect-and-forward
    https://www.baeldung.com/spring-type-conversions
  • Как добавить проверку на ввод в spring boot application?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Лев Соболев,
    Не бывает глупых вопросов. Я сам когда-то был начинающим разработчиком и довольно часто задавался аналогичными вопросами.

    RestController и Controller это разные вещи.

    RestController это специфичная форма Controller, которая включает в себя Controller & ResponseBody
    Но при необходимости Controller можно превратить в RestController
    Например, указанные ниже 2 контроллера идентичны. Так как к методу из класса UserController добавлена аннотация @ResponseBody

    Controller
    @Controller
    public class UserController {
    
    public @ResponseBody String usersList() {}
    
    }


    REST Controller
    @RestController
    public class UserController {
    
    public String usersList() {}
    
    }


    Соответственно, если вы пишете REST сервис, то используйте RestController. Если пишете MVC приложение (т.е. есть некий шаблонизатор - mustache, thymeleaf и др). Тут на самом деле все зависит от вашей фантазии. Например, вы можете писать MVC приложение, но иметь RestController, на который будет аяксом (ajax) приходить заполненные данные (без перезагрузки страницы). А дальше результат валидации в формате json уходить на клиент, а средствами js распарсить ответ и добавить их в html.

    Кстати, тут может быть проблема, так как у вас есть AllArgsConstructor, но default конструктора нет. Если не ошибаюсь, то скорее всего будет выброшено исключение при попытке забайндить.
    @Data
    @AllArgsConstructor
    public class ClientDto {}


    Обычно, если у вас много однотипных параметров, то лучше собирать их в dto. Например, CarDto или CarRequest

    public String carEntityAdd(@RequestParam String carBrand,
    @RequestParam String carModel,
    @RequestParam Integer carBodyNum,
    @RequestParam Integer carEngineNum,
    @RequestParam String carBodyModel,
    @RequestParam Integer carEngineVolume,
    @RequestParam Integer carEnginePower,
    @RequestParam String carWheel,
    @RequestParam String carDriveBool,
    @RequestParam Double carPrice,
    @RequestParam String carType,
    @RequestParam Integer carYear,
    @RequestParam Integer carMileage,
    @RequestParam String carBodyType,
    Model model)


    Optional является параметризованным классом. лучше использовать его возможности.
    Например, вместо:
    Optional client= clientRepository.findById(clientId);

    использовать:
    Optionzal<User> client = clientRepository.findById(clientId).orElseThrow(UserNotFoundException::new);

    Т.е. если пользователь по id не будет найден, то будет выброшено исключение UserNotFoundException
  • Как завершить программу Java при вводе пользователем символа q в любом месте программы?

    azerphoenix
    @azerphoenix Куратор тега Java
    Хорошо, правда не очень понимаю разницу между System.exit(0); и break; (я совсем новичок).

    System.exit(0); используется для выхода из программы.
    break; используется для выхода из цикла или например, из конструкции switch case
    continue; используется для завершения (пропуска) текущей итерации цикла и продолжения цикла

    Тут следующий момент, так как конструкция if у вас находится в конце, то пользователь не может выйти из любой точки программы, т.е. он должен ввести 2 числа и операнд, чтобы потом можно было ввести "q" и выйти из программы.
    Соответственно, конструкцию if нужно перекинуть вверх.

    Вот, ваш код (прокомментировал его):
    public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            /*
            * Если например, я хочу выйти из программы сразу же после запуска, то при вводе q
            * будет выброшено исключение, так как на вход я ожидается число (nexInt)
            * 
            */
            do {
                System.out.println("Введите число");
                int a = sc.nextInt();
                sc.nextLine();
                System.out.println("Введите операцию");
                String s = sc.nextLine();
                System.out.println("Введите число");
                int b = sc.nextInt();
                if (s.equals("+")) {
                    int res = 0;
                    res = a + b;
                    System.out.println(res);
                }
                // Сюда не доходит даже
                char c = s.charAt(0);
                if (c == ('q')) {
                    System.exit(0);
                }
            } while (true);
        }

    Напишу простой вариант реализации, а вы изучите и посмотрите на преимущества и недостатки.
    public class Main {
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            do {
    
                System.out.println("Введите первое число:");
                int a = sc.nextInt();
    
                sc.nextLine();
    
                System.out.println("Введите операцию:");
                char operator = sc.nextLine().charAt(0);
    
                System.out.println("Введите второе число:");
                int b = sc.nextInt();
    
                int result = 0;
                if (operator == '+') {
                    result = a + b;
                } else if (operator == '-') {
                    result = a - b;
                } else if (operator == '*') {
                    result = a * b;
                } else if (operator == '/') {
                    result = a / b;
                }
                System.out.println("Результат: " + result);
    
                sc.nextLine();
    
                System.out.println("Для выхода из программы введите - q");
                char c = sc.nextLine().charAt(0);
                if (c == ('q')) {
                    System.exit(0);
                }
    
            } while (true);
        }
    
    }


    Конечно же нужно будет обработать ошибки. Можно заменить if else if на switch case и т.д.
  • Какие есть недостатки у Яндекс Маршрутизации?

    Да, к сожалению есть недостатки у ЯМ. Так уж получилось, что пишу похожий сервис и столкнулся с некотоырми аспектами в ЯМ, которые пришлось учесть в новом сервисе.
  • Как сделать возможность игры в Minecraft прямо из браузера?

    azerphoenix
    @azerphoenix Куратор тега Java
    Aleksandr-JS-Developer, если есть API, то ради Бога) Я к сожалению, не знаком с Minecraft и соответственно, что-либо объективно сказать по нему не смогу.
  • Как получить конкретный элемент цикла?

    azerphoenix
    @azerphoenix Куратор тега Java
    Да, можно GET запросом тоже передать. Хорошее решение
  • Как сделать возможность игры в Minecraft прямо из браузера?

    azerphoenix
    @azerphoenix Куратор тега Java
    lil.fxrrx, если честно, то в данном случае ему проще игру написать с нуля)
  • Как сделать возможность игры в Minecraft прямо из браузера?

    azerphoenix
    @azerphoenix Куратор тега Java
    ModelViewWithoutControl, никогда майнкрафтом не интересовался, но раньше в старых браузерах можно было java запускать, а сейчас API браузеров давно изменилось и java не поддерживается. Скоро от флеша тоже откажутся или даже отказались вроде...
  • Как вывести цвет кнопки который был последним в java?

    azerphoenix
    @azerphoenix Куратор тега Java
    maly222,

    кнопка уже стерилизована

    Что вы имеете ввиду? Что именно вы сериализовали?
    При запуске приложения прочитайте сохраненный цвет в String. Например, String buttonColor = ...
    Далее тут вместо .setBackground(Color.red);
    для enum Color используйте Color.valueOf(buttonColor) Разумеется, что сперва проверьте на null и на пустую строку
  • Как получить конкретный элемент цикла?

    azerphoenix
    @azerphoenix Куратор тега Java
    Kirill_mont,

    Теперь вопрос такой, как то, что я получил передать не в alert, а в list, например? Мне нужно их передать в сервлет..

    Обычно, если речь идет об ИМ, то выбранные пользователем товары можно записывать в localStorage
    https://www.w3schools.com/jsref/prop_win_localstor...
    Т.е. некий массив с id товаров.

    Далее по нажатию кнопки "Оформить заказ" массив с id отправляется в backend, а затем заказ обрабатывается соответствующим образом.
  • Как получить конкретный элемент цикла?

    azerphoenix
    @azerphoenix Куратор тега Java
    Kirill_mont,
    Мне нужно при клике по кнопке получать имя элемента.

    Обычно, для отправки используют не имя, а идентификатор элемента (идентификатор товара, статьи и т.д.)

    1) Добавьте в свой проект библиотеку jQuery - https://jquery.com/

    2) Преобразуйте этот блок:
    <div class="product-list">
    Таким образом:
    <div class="product-list" data-id="${row.id}"">
    Обратите внимание, что я добавил дата атрибут data-id и у текущего элемента row получаю id товара. row.id может у вас отличаться например, row.productId и т.д. Подставьте свой вариант.

    3) Дальше нужно написать js-код для кнопки, чтобы при нажатии у текущего элемента извлекался id и он отправлялся на сервер.
    Вот, теги кнопки
    <input type="submit" class="button" value="Add to cart">

    А вот, селектор кнопки:
    .product-list .button
    Теперь, вот, примерный js-код

    // Отлавливаем клик по кнопке
    $('.product-item .button').on('click', function(event){
    
    	event.preventDefault();
    
    	var productId = 
    	$(this)
    	.parent() // находим родительский элемент по кнопке, на которой был произведен клик
    	.data('id'); // у род. элемента находим дата атрибут id (data-id)
    
    
    	/* 
    		Тут уже дальше нужно дописать то, что вы хотите сделать после того, как кнопка была нажата.
    		Например, можно пользователя перенаправить на страницу корзины или оформить заказ и отправить
    		запрос на сервер
    	*/
    
    });

    https://api.jquery.com/event.preventdefault/
    https://api.jquery.com/data/
    https://api.jquery.com/parent/
    Если все же решите отправить именно имя вместо id, то соответственно, в дата атрибуте выведите имя и при клике получайте имя продукта по аналогии с указанным выше сниппетом

    Если хотите отправить ajax запрос на сервер с id выбранного товара, то прочитайте:
    https://api.jquery.com/jquery.ajax/
    https://api.jquery.com/jquery.get/
    https://api.jquery.com/jquery.post/

    Т.е. для начала нужно решить, что должно происходить по нажатию кнопки Add to Cart после того, как имя или идентификатор текущего товара был получен. Т.е. нужно ли оформить заказ или добавить товар в корзину и т.д.

    В backend должен быть контроллер, который обработает GET || POST запрос и примет идентификатор товара.
  • Как поменять переменные среды в macOS?

    azerphoenix
    @azerphoenix Куратор тега Java
    BorLaze, добрый вечер. К сожалению, насколько мне известно sdkman еще не добавили Oracle JDK Java Hotspot. Да и вообще насколько мне известно sdkman не использует Oracle JDK вовсе.

    The reason that we're moving to OpenJDK is that Oracle doesn't provide Docker images that are deemed official to Docker, whereas it appears that OpenJDK ones are as shown there. So if we're going to deploy with OpenJDK, then we'd like to match our local dev environment as well.

    Но было бы круто, согласен
  • Как поменять переменные среды в macOS?

    azerphoenix
    @azerphoenix Куратор тега Java
    Gold Apple, рад помочь. Да, с sdkman все довольно просто. Притом можно устанавливать не только jdk, но и sdk. Например, tomcat,
  • Как сделать следующую трансформацию данных в Java?

    azerphoenix
    @azerphoenix Куратор тега Java
    dc65k,
    А ну раз работаете со Spring, то вам по аналогии, как я написал выше нужно создать Dto нужной структуры на основе json, а затем при помощи ModelMapper или MapStruct или еще в Spring есть Converter<S, T> замаппить Order -> OrderDto, а затем сериализовать.