Предупреждения или всплывающие окна сообщений в Spring MVC

#spring #model-view-controller #alerts

#весна #model-view-controller #предупреждения

Вопрос:

У меня есть пользователь, добавляющий форму userAdd.jsp. Когда я ввожу данные и отправляю, я хочу проверить, является ли введенное поле имени пользователя уникальным по сравнению с базой данных. Только после проверки и подтверждения я вставляю данные в базу данных. Я успешно выполнил до этого момента в Spring mvc.
Теперь я хочу предоставить всплывающие оповещения или диалоговые окна для двух экземпляров в Spring MVC. — имя пользователя уже есть в базе данных — пользователь успешно добавлен в базу данных

Ниже приведены мои представления jsp, метод контроллера и метод репозитория

  1. Фрагмент userAdd.jsp

                       <div class="col-xs-4">
                      <form:input path="username" class="form-control" name="username_admin" id="username_admin" placeholder="User Name" type="text" required="required"/>
                    </div>
                    <div class="col-xs-4">
                      <form:input path="password" class="form-control" id="password1" placeholder="Password" type="text" required="required" onchange="validatePassword(password1)"/>
                    </div>
                    <div class="col-xs-4">
                      <form:input path="password" class="form-control" id="cpassword" placeholder="Password Confirm" type="text" required="required" onchange="passwordsEqual(cpassword,password1)"/>
                    </div>
      
  2. Метод контроллера

         //to show the userAdd.jsp page
         @RequestMapping(value="/add",method=RequestMethod.GET)
         public ModelAndView showCustomer(){
         return new ModelAndView("userAdd", "command",new User());
         }
    
    
        //to handle the form data submission and check username 
       @RequestMapping(value="/addCustomer",method = RequestMethod.POST)
       public String saveOrUpdate(@ModelAttribute("newUser")  User newUser,
                               final RedirectAttributes redirectAttributes) throws SQLIntegrityConstraintViolationException {
    
        boolean usernameUnique=staffRepository.checkUsernameUnique(newUser);
        if(usernameUnique) {
            int i = staffRepository.add(newUser);
            if (i == 0)
                //alert saying server error in inserting data to mysql
            else {
    
                //alert or dialog box confirming successful user add
            }
        }else{
            //alert saying username exists in database
        }
        return "redirect:list";
    }
      
  3. Методы репозитория для вставки пользовательских данных в базу данных и проверки имени пользователя

       /*add a new staff member*/
       @Override
        public int add(User user) throws DuplicateKeyException {
    
        int row = 0;
    
        String un = user.getUsername();
        String pw = user.getPassword();
        String des = user.getDesignation();
        if (un != "" amp;amp; pw != "" ) {
        {
    
    
                String sql = "INSERT INTO staff "  
                        "(title,username,password,first_name,last_name,email,mobile,address_line1,address_line2,address_line3,"  
                        "designation,department,branch,register_date,status) VALUES (?,?,sha1(?),?,?,?,?,?,?,?,?,?,?,CURRENT_DATE,1)";
    
                row = jdbcTemplate.update(sql, new Object[]{user.getTitle(), user.getUsername(), user.getPassword(), user.getFirstName(), user.getLastName(),
                        user.getEmail(), user.getMobile(), user.getAddressL1(), user.getAddressL2(), user.getAddressL3(), user.getDesignation(),
                        user.getDepartment(), user.getBranch()});
                updateGroupStaff(des, un);
    
    
                log.info(row   " staff inserted");
                log.info(un);
            /*}else
                log.info("username already available");*/
        } else
            log.error("values cannot be empty");
    
        return row;
    
    }
    
    
    
       //check username availability
        @Override
        public boolean checkUsernameUnique(User user) {
    
        boolean result = true;
    
        String sql = "SELECT count(*) FROM staff WHERE  username = ? ";
    
        int count = jdbcTemplate.queryForObject(
                sql, new Object[]{user.getUsername()}, Integer.class);
    
        if (count > 0) {
            result = false;
            log.info("username already available");
        }
        log.info(result);
        return resu<
    }
      

sql-запросы работают очень хорошо, и мне нужен способ получать всплывающие оповещения в Spring mvc.
Заранее спасибо 🙂

Ответ №1:

Чтобы открыть окно предупреждения (в классическом веб-приложении), вам необходимо отправить страницу формы (с заполненными полями) и код java script для окна ошибки обратно клиенту в ответ на запрос post.

Обычно окно с ошибкой не открывается при сбое проверки формы, вместо этого можно пометить поле красной рамкой или чем-то еще и написать рядом с ним подсказку о проблеме.

 @RequestMapping(value="/addCustomer",method = RequestMethod.POST)
public ModelAndView saveOrUpdate(@ModelAttribute("newUser")  User newUser, BindingResult validationResult) throws SQLIntegrityConstraintViolationException {

   if (validationResult.hasErrors()) {
        new ModelAndView("userAdd", "command", newUser);
    }

    boolean usernameUnique=staffRepository.checkUsernameUnique(newUser);
    if(usernameUnique) {
        int i = staffRepository.add(newUser);
        if (i == 0)
            return new ModelAndView(new RedirectView("stangeFailurePage"));
        else {
            return new ModelAndView(new RedirectView("successPage"));
        }
    }else{
        validationResult.rejectValue("username", "error.username.exists", "The username is already in use.");
        new ModelAndView("userAdd", "command", newUser);
    }
    return new ModelAndView(new RedirectView("list"));
}
  

для проверки вам необходимо добавить errors -tag в каждое поле ввода

  <form:input path="username" .../>
 <form:errors path="username" cssClass="error" />
  

Комментарии:

1. Спасибо за ответ…. Но здесь происходит перенаправление на другую страницу … правильно… На самом деле я бы предпочел остаться на той же странице и сообщить об успешном добавлении пользователя или существовании имени пользователя. Здесь

2. для «имя пользователя существует» пользователь получает уже тот же jsp! Что касается всего остального: это зависит от того, что вы подразумеваете под «оставаться на той же странице»: тот же URL или тот же jsp? — конечно, вы можете использовать флаги и отображать один и тот же jsp даже для «success» и «strangeFailure»

Ответ №2:

В моем вопросе, поскольку я хотел, чтобы оповещение находилось на той же странице без какого-либо перенаправления, я написал другой метод контроллера следующим образом и код javascript.. В этом методе контроллера возвращается нулевой объект User , так что переменная «usernameUnique» всегда имеет значение true и каждый раз выдает одно и то же предупреждающее сообщение. (Учтите, что существует отдельный метод контроллера для вставки заполненных данных в базу данных)

  @RequestMapping(value="/uniqueUsername",method=RequestMethod.POST)
 public @ResponseBody int checkUser(@ModelAttribute("newUser")  User newUser ){
 boolean usernameUnique ;
 int returnMsg;

 usernameUnique=staffRepository.checkUsernameUnique(newUser);
 if(!usernameUnique){
        returnMsg= 1;
 }else
        returnType=0;

 return returnType;
  

}

js-код для этого приведен ниже. это написано для функции изменения текстового поля #username_admin

 $(document).ready(function(){
    $("#username_admin").change(function(){
        var uname = $(this).val();
        $.ajax({
            type: "POST",
            url: "https://localhost:8443/admin/users/uniqueUsername",
            data: {"uname": uname},
            success: function(msg){

                  if(msg == 0)
                    alert("OK");
                  else
                    alert("User name exists !... try another");*//*

                alert(msg   uname);


            },
            error:function(){
                alert("ajax failed"  uname);
            }
        });

    });
});