【问题标题】:I dont want Spring to redirect我不希望 Spring 重定向
【发布时间】:2016-06-09 15:50:17
【问题描述】:

我正在使用 Spring 和 Thymeleaf。在用户注册表单中,我将内容发布到特定的 URL。在 Spring 中,我正在检查是否发生了一些错误。因此,如果有一些错误,我将添加一些用于显示错误的属性。比我不希望 Spring 重定向到任何地方。我希望他更新模型而不做其他任何事情。我有没有机会做到这一点?

控制器

@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(@ModelAttribute Person person, Model model){
    model = loginPageService.register(person, model);
    return "loginPage";
}

服务

public Model register(Person person, Model model){
    //check if user exists
    Person existingPerson = personService.findByEmail(person.getEmail());

    if(existingPerson != null){
        model.addAttribute("emailUsedError", true);
    }
    else{
        personService.save(person);
        model.addAttribute("registered", true);
    }

    return model;
}

部分html

<div id="singup">
            <p class="error" th:if="${registerError}">Wypełnij wszystkie pola!</p>
            <p class="error" th:if="${emailUsedError}">Podany email został już użyty!</p>

            <form th:action="@{/register}" th:object="${person}" method="post" onsubmit="return checkPassword(this)">
                <input type="text" id="imie" name="firstName" placeholder="Imię" onfocus="this.placeholder=''"
                       onblur="this.placeholder='Imię'" required>
                <input type="text" id="nazwisko" name="lastName" placeholder="Nazwisko" onfocus="this.placeholder=''"
                       onblur="this.placeholder='Nazwisko'" required>
                <input type="text" id="identityNumber" name="identityNumber" placeholder="Nr. indeksu" onfocus="this.placeholder=''"
                       onblur="this.placeholder='Nr. indeksu'" required>
                <input type="email" id="email" name="email" placeholder="example@google.com"
                       onfocus="this.placeholder=''" onblur="this.placeholder='example@google.com'" required>
                <input type="password" id="password" name="password" placeholder="Hasło" onfocus="this.placeholder=''"
                       onblur="this.placeholder='Hasło'" required>
                <input type="password" id="confirm_password" name="confirm_password"
                       placeholder="Potwierdź hasło" onfocus="this.placeholder=''" onblur="this.placeholder='Potwierdź hasło'" required>
                <input type="submit" value="Zarejestruj">
            </form>
        </div>

【问题讨论】:

  • 您可以使用 AJAX 请求。
  • 为什么 Spring 会重定向?如果您的意思是您不希望浏览器加载新页面,那么您需要使用 AJAX。

标签: java spring spring-mvc thymeleaf


【解决方案1】:

Thymeleaf + Spring 正在服务器端创建 HTML 视图,因此它需要重定向并创建有错误的新 HTML 视图。您可以创建一些 API 来检查电子邮件是否存在并使用 AJAX 来处理。

如果您的项目很小并且您不关心效率和安全性,您可以传递所有不可用的电子邮件以查看并尝试在视图端验证这一点(但此解决方案是最差的解决方案)

【讨论】:

    【解决方案2】:

    你最好使用 Spring Validator

    创建一个类验证器,如下所示

    import org.springframework.stereotype.Component;
    import org.springframework.util.StringUtils;
    import org.springframework.validation.Errors;
    import org.springframework.validation.Validator;
    
    import com.med.quraa.models.User;
    
    
    @Component(value = "personValidator")
    public class PersonValidator implements Validator{
    @Override
        public boolean supports(Class<?> arg0) {
    
            return  Person.class.isAssignableFrom(arg0);
        }
    
    @Override
        public void validate(Object form, Errors errors) {
            Person person=(Person) form;
            Person existingPerson = personService.findByEmail(person.getEmail());
            if(existingPerson != null){
            errors.rejectValue("email","", "User already exists");}
            if(person.getIdentityNumber.isEmpty()){
            errors.rejectValue("identityNumber","", "Identifier cannot be blank");}
            //validate Other Fields
    }
    
    }
    

    稍后在你的控制器中

    @Autowired
        private PersonValidator validator;
    
    @RequestMapping(value = "/register", method = RequestMethod.POST)
        public String register(@ModelAttribute @Valid Person person ,BindingResult result,final Model model) {
    
            validator.validate(Person, result);
            if(result.hasErrors()){
                    model.addAttribute("errorMsg",result.getAllErrors().get(0).getCode());
    //you can manipulate all errors here
    
            return "register";
            }
            loginPageService.register(person);//you dont need to add Model as param
    
            return "loginPage";
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多