Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Глобальне объекты в контроллере


Автор: Flogrimm 1.4.2010, 07:39
Как мне в spring mvc annotation-контроллере передать на страницу объекты, чтобы они были глобальными для всех методов. Т.е. если я передам на страницу через model объект в GET-методе, но в POST методе снова нужно передавать его. Есть способ сделать это единожды?

Код

/**
 * AddQuestionaryController.java
 */
package web;

import idao.IQuestionaryDao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import validator.QuestionaryValidator;
import beans.Questionary;
import beans.User;

@Controller
public class AddQuestionaryController {

    @Autowired
    public IQuestionaryDao questionaryDao;

    @ModelAttribute("questionary")
    public Questionary getQuestionObject() {
        return new Questionary();
    }

    @RequestMapping(value = "/questionaries/new", method = RequestMethod.GET)
    public String setupForm(Model model) {
        model.addAttribute("questionaries", questionaryDao.getAllObjects());
        model.addAttribute("pagetitle", "Управление опросниками");
        model.addAttribute("questionary", new Questionary());
        return "questionaries/form";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(
            @ModelAttribute("questionary") Questionary questionary,
            BindingResult result) {

        new QuestionaryValidator().validate(questionary, result);

        if (result.hasErrors())
            return "questionaries/form";

        User user = (User) SecurityContextHolder.getContext()
                .getAuthentication().getPrincipal();

        questionary.getUsers().add(user);

        questionaryDao.saveObject(questionary);

        return "redirect:/questionaries/new";
    }

    @RequestMapping(value = "/questionaries/{questionaryId}/{action}", method = RequestMethod.GET)
    public String setupEditForm(@PathVariable("action") String action,
            @PathVariable("questionaryId") long questionaryId, Model model) {
        
        model.addAttribute("questionaries", questionaryDao.getAllObjects());
        
        if (action.equals("delete")) {
            questionaryDao.deleteObject(questionaryId);
            return "redirect:/questionaries/new";
        }
        
        Questionary questionary = questionaryDao.getObject(questionaryId);
        model.addAttribute("questionary", questionary);
        return "questionaries/form";
    }

}

Автор: Kangaroo 1.4.2010, 10:51
Цитата(Flogrimm @  1.4.2010,  07:39 Найти цитируемый пост)
Т.е. если я передам на страницу через model объект в GET-методе, но в POST методе снова нужно передавать его. Есть способ сделать это единожды?

Че-то не понял я проблемы, попробуй еще раз объяснить. Можешь на примере твоего кода, так будет легче.

Автор: Flogrimm 1.4.2010, 16:29
Да, сорри.

Я захожу на страницу "questionaries/new", это ГЕТ. В нее передается атрибут "pagetitle". Когда я отправляю данные через форму — это ПОСТ. 

Например я ввел что-нибудь неправильно, сработала валидация 

Код

        if (result.hasErrors())
            return "questionaries/form";


и я попал на эту же страницу, только уже через ПОСТ.

И вот, если в методе 

Код

    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(


не положить в model "pagetitle", то этот объект с jsp-страницы будет недоступен.

Не хочется дублировать model.addAttribute всех объекты в ПОСТ-методе, хочется в контроллере положить их в страницу один раз.

Автор: afon 1.4.2010, 18:31
Можно вот этот участок 

Код

model.addAttribute("questionaries", questionaryDao.getAllObjects());
        model.addAttribute("pagetitle", "Управление опросниками");
        model.addAttribute("questionary", new Questionary());


вынести в отдельный метод. В неаннотированных контроллерах это решалось простым наследованием от XYZ_FormController, который все за тебя делал.

Автор: Flogrimm 1.4.2010, 18:54
Ну все-равно же потом этот метод надо вызывать несколько раз? Наверняка есть какое-то решение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)