Использовать проверку аннотации Spring 3 MVC с Freemarker - PullRequest
2 голосов
/ 26 мая 2011

Я использую Spring 3 MVC Annotation Validation. Я знаю, как это сделать в JSP (используя свойство modelAttribute в JSP), но я понятия не имею, как применить этот тип привязки данных в Freemarker.

Пример эквивалентности JSP

<c:url var="addUrl" value="/admin/workerAdd" />
<form:form modelAttribute="worker" action="${addUrl}" method="post">
    <p>
 <form:label for="code" path="code">Code</form:label>
     <form:input path="code" readonly="false" />
    </p>
...

Пример контроллера:

@Controller
@RequestMapping("/admin/*")
public class AdminController {    
    @Autowired
    private CommonService commonService;

    /**
     * For every request for this controller, this will 
     * create a person instance for the form.
     */
    @ModelAttribute
    public Worker newRequest(@RequestParam(required=false) String id) {
        return (id != null ? commonService.getWorkerById(id) : new Worker());
    }

    @RequestMapping(value="/workerAdd", method=RequestMethod.POST)
    public final String performAddUser(@Valid Worker worker, BindingResult result) throws Exception {
        if (result.hasErrors()) {
            return null;
        }

            // Create the worker here.

        return "redirect:/administration/manageUser";
    }

Теперь я хочу использовать тот же контроллер, но представления написаны Freemarker (ftl). Привязка данных в моем нижеприведенном freemarker не работает (что понятно, поскольку у него должен быть другой синтаксис). Я провел некоторое исследование и узнал об объекте команды в FTL, но я не понял суть. Я думаю, что это должен быть похожий атрибут, который сообщает Spring, чтобы связывание выполнялось, но я до сих пор не нашел его.

<form id="worker" modelAttribute="worker" action="${rc.getContextUrl('/admin/workerAdd')}" method="post" >          
            <div class="Entry">
            <label for="code">Code</label>
            <input type="text" id="code" name="code" value="${worker.code}" />
            </div>

Есть ли какой-нибудь простой способ заставить этот способ проверки аннотаций (и привязку данных) работать с FTL? Любая помощь будет оценена.

Спасибо

Хоанг Лонг

Ответы [ 2 ]

4 голосов
/ 28 июня 2011

Я бы хотел добавить следующее пояснение, чтобы сэкономить время людям. При чтении документов он говорит, что если вы не переопределите @ModelAttribute (value = ...), к вашему компоненту будет обращаться как " command " в вашем представлении.

Для Freemarker (протестировано с 3.1M1) значением по умолчанию является className (например, если класс Command называется " Change PasswordCommand ", то bean-компонент будет привязан к changePasswordCommand с помощью по умолчанию.

3 голосов
/ 26 мая 2011

Ваш JSP-код можно переписать во Freemarker следующим образом:

<#import "spring.ftl" as spring />
...
<form id="worker" action="${rc.getContextUrl('/admin/workerAdd')}" method="post" > 
    <p>
        <label for = "code">Code</label>
        <@spring.formInput "worker.code" />
    </p> 
...

Обратите внимание, что библиотека Spring для Freemarker не имеет специального элемента для form, поэтому вам нужно использовать обычный html form и добавлять имя атрибута модели к путям отдельных полей.

Смотри также:

...