#spring #model-view-controller #alerts
#весна #model-view-controller #предупреждения
Вопрос:
У меня есть пользователь, добавляющий форму userAdd.jsp. Когда я ввожу данные и отправляю, я хочу проверить, является ли введенное поле имени пользователя уникальным по сравнению с базой данных. Только после проверки и подтверждения я вставляю данные в базу данных. Я успешно выполнил до этого момента в Spring mvc.
Теперь я хочу предоставить всплывающие оповещения или диалоговые окна для двух экземпляров в Spring MVC. — имя пользователя уже есть в базе данных — пользователь успешно добавлен в базу данных
Ниже приведены мои представления jsp, метод контроллера и метод репозитория
-
Фрагмент 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>
-
Метод контроллера
//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"; }
-
Методы репозитория для вставки пользовательских данных в базу данных и проверки имени пользователя
/*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);
}
});
});
});