2016-09-07 4 views
1

Я пытаюсь отобразить ошибки проверки на странице регистрации пользователя, построенной с помощью шаблона freemarker, если контроллер возвращает ошибки привязки.Ошибки проверки Spring MVC не отображаются в шаблоне Freemarker

код моего контроллера заключается в следующем:

@Controller 
@RequestMapping("/") 
public class UserController { 

@Autowired 
private UserService userService; 

@Autowired 
private SecurityService securityService; 

@Autowired 
private UserValidator userValidator; 

@RequestMapping(value = "/registration", method = RequestMethod.GET) 
    public String registration(Model model) { 
    model.addAttribute("userForm", new User()); 
    return "registration"; 
    } 

@RequestMapping(value = "/registration", method = RequestMethod.POST) 
public String registration(@ModelAttribute("useraccount") User userForm,  BindingResult bindingResult, Model model) { 

    userValidator.validate(userForm, bindingResult); 

    if (bindingResult.hasErrors()) { 

     return "registration"; 
     } 

    userService.save(userForm); 

    securityService.autologin(userForm.getUsername(), userForm.getPasswordConfirm()); 

    return "redirect:/explore"; 
} 

в то время как это шаблон registration.ftl FreeMarker Я пытаюсь построить:

<div> 
<fieldset> 
    <h1>Create your Account</h1> 
    <form id="regForm" class="idealform" action="registration" method="post" name='useraccount'> 
      Username: <input type="text" name="username" /> <errors path="username" cssClass="error"/><br/> 
      Password: <input type="text" name="password" /><errors path="password" cssClass="error"/><br/> 
       <label class="main-label" style="width: 91px;">&nbsp;</label> 
     <input type="submit" value="submit"> 
    </form> 
</fieldset> 

Я попытался также рекомендовал решение здесь:

Displaying Spring MVC validation errors in Freemarker templates

и registration.ftl становится:

<#assign form=JspTaglibs["http://www.springframework.org/tags/form"] /> 

    <#macro formErrors> 
    <#assign formErrors><@form.errors path="*" /></#assign> 
    <#if formErrors?has_content> 
    <div id="errors"> 
    <@spring.message "admin.error.globalMessage" /> 
    </div> 
    </#if> 
</#macro> 

<div> 
<fieldset> 
    <h1>Create your Account</h1> 
    <@form.form id="regForm" class="idealform" action="registration" method="post" name='useraccount'> 
      Username: <input type="text" name="username" path="username" /> <br/> 

      Password: <input type="text" name="password" path="password" /><br/> 

    <@formErrors /> 
     <label class="main-label" style="width: 91px;">&nbsp;</label> 
     <input type="submit" value="submit"> 
    </@form.form> 
</fieldset> 

</div> 

, но до сих пор сообщения проверки не отображаются.

Не могли бы вы поделиться своими мыслями со мной по этому вопросу? спасибо.

ответ

1

я переписал код контроллера на что-то вроде этого:

@Controller 
@RequestMapping("/") 
public class UserController { 

@Autowired 
private UserService userService; 

@Autowired 
private SecurityService securityService; 

@Autowired 
private UserValidator userValidator; 

@RequestMapping(value = "/registration", method = RequestMethod.GET) 
public String registration(@ModelAttribute(name = "userForm") User user) { 
    return "registration"; 
} 

@RequestMapping(value = "/registration", method = RequestMethod.POST) 
public String registration(@ModelAttribute(name = "userForm") User user, BindingResult result) { 
    userValidator.validate(user, result); 

    if (result.hasErrors()) { 
     return "registration"; 
    } 

    userService.save(user); 

    securityService.autologin(user.getUsername(), user.getPasswordConfirm()); 

    return "redirect:/explore"; 
} 
} 

1) Там нет необходимости использовать model.addAttribute("modelName", model), если вы используете конструктор без аргументов, вместо этого вы можете использовать @ModelAttribute аннотации с указанием имени атрибута (по умолчанию имя идет от имени класса). Вы должны быть уверены, что эта модель находится в постоянном состоянии. Также вам нужно передать имя точно так же, как вы используете в своем представлении (шаблон freemarker).

Теперь «registration.ftl»

... 
<#import "/spring.ftl" as spring/> 
... 
<fieldset> 
    <h1>Create your Account</h1> 
    <form id="regForm" class="idealform" action="<@spring.url '/registration'/>" method="post"> 
    <@spring.bind 'userForm.username'/> 
    Username: <input type="text" name="${spring.status.expression}" value="${spring.status.value?html}"/> 
    <#list spring.status.errorMessages as error> 
     <span class="error">${error}</span> 
     <br> 
    </#list> 
    <@spring.bind 'userForm.password'/> 
    Password: <input type="password" name="${spring.status.expression}" value="${spring.status.value?html}"/> 
    <#list spring.status.errorMessages as error> 
     <span class="error">${error}</span> 
     <br> 
    </#list> 
    <label class="main-label" style="width: 91px;">&nbsp;</label> 
    <input type="submit" value="submit"> 
    </form> 
</fieldset> 
... 

1) Вам нужно <#import "/spring.ftl" as spring/> для добавления определенных пользователем директивы весны, которые очень полезны.
2) Используйте директиву <@spring.bind 'userForm.username'> для привязки следующего ввода к вашей модели. Здесь «userForm» - ваша модель, а «имя пользователя» - это поле, которое вы хотите связать. Эта директива также объявляет новую переменную «spring.status», которая содержит переменную «выражение» - для пути, «значение» - для заполнения формы в случае, если она возвращается с ошибками, и «errorMessages» из BindingResult.
3) Если вы используете источник сообщений для поддержки разных языков, вы должны изменить <span class="error">${error}</span> на что-то вроде <@spring.message '${error}'/>, иначе вы получите только коды сообщений.

Надеюсь, что это поможет.

Смежные вопросы