2014-01-28 2 views
0

У меня есть таблица, содержащая 40 столбцов и один компонент, соответствующий этой таблице. Но на странице я показываю только 10 полей. Когда страница отображается, путем отладки, я вижу, что компонент заполняется всеми полями из таблицы, и я добавляю его в Model с помощью model.addAttribute("emp", emp). Но после изменения некоторых полей на странице, когда я снова отправлю страницу, я вижу, что только поля заполняются, которые появляются на странице. Отдых не происходит, хотя компонент находится в области «сеанса».Что такое область компонента, указанная в аннотации @ModelAttribute

У меня есть один контроллер, который вызывается, когда я отправляю страницу. Thats что-то вроде ниже

@RequestMapping({"/update.html"}) 
public String updateData(@ModelAttribute("emp") Employee emp){ 
    // All fields of Employee bean are not getting populated 
} 

Я написал в JSP что-то вроде ниже.

<jsp:useBean class="com.Employee" id="emp" 
    scope="request" /> 

Примечание: - Я тестировал с помощью scope = "session".

Итак, мой вопрос: даже после того, как вы поместили бобы в область SESSION, почему я не получаю его в своем контроллере. Так что @ModelAttribute меняет область моего боба любым способом?

+0

Поскольку я использую jQuery, так что пока я помещал все эти поля в JSP, делал их скрытыми, а мой компонент заполнялся всеми полями моего контроллера. Правильно ли это? – Jaikrat

ответ

2

@ModelAttribute по методу аргумента по существу связывает модель (то, что вы представили через поле) с типом (в данном случае Employee) и выставляет эту оценку типа в качестве модели, которую вы можете использовать в вашем JSP. На данный момент это не Spring-компонент, а только объект, охваченный запросом.

Теперь о том, как предварительно заполнить свой боб, уборщик подход может определить другой метод в контроллере с аннотацией @ModelAttribute, который отвечает за загрузку вашей модели из базы данных таким образом:

@ModelAttribute("emp") 
public Employee loadModelAttributes(@RequestParam("empid") int empid){ 
    // return employee fully populated.. 
} 

Это гарантирует, что в вашем методе контроллера теперь будут обновлены поля, которые вы отправляете из пользовательского интерфейса, в базу Employee, которую вы заполнили из БД, таким образом, вам не нужно хранить вещи в скрытых переменных.

+0

Упрощенный для другого подхода, но это не то, что я хочу. Я думаю, пишу @ModelAttribute («emp») перед тем, как метод и написать model.addAttribute («emp»). В методе оба они одинаковы. Во-вторых, когда страница становится визуализированной, мой компонент заполняется правильно (там нет проблем). Проблема возникает, когда я отправляю страницу. В то время я не вижу в моем компоненте все не отображаемые поля. Я хочу, чтобы все поля в моем bean-компоненте были заполнены. – Jaikrat

+0

@Jai, это ожидаемое поведение с Spring MVC, когда вы указываете тип как параметр на метод '@ RequestMapping', поля, которые вы отправляете в вашей форме, будут привязаны к этому типу. Теперь, когда вы аннотируете это поле с помощью @ModelAttribute, он создаст модель с этим именем для вас. Кроме того, если вы хотите предварительно заполнить модель, а затем обновить то, что вы отправляете на себя, вы можете сделать то, что я предложил, - который должен иметь другой метод с аннотацией @ @ ModelAttribute, который может заполнять контент на основе БД. –

+0

Спасибо @Biju, но опять же, я не сталкиваюсь с какой-либо проблемой в предварительном заполнении компонента. Код, который я обнаружил здесь, имеет Employee в качестве примера, который может дать вам впечатление, что я что-то предпринимаю дома. Но это не так. Это то, с чем я столкнулся в компании, и я не могу изменить архитектуру приложения. То, что вы предлагаете, является хорошим, но не практичным в моем случае. – Jaikrat

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