Потеря модельного атрибута между методами - PullRequest
2 голосов
/ 09 февраля 2011

Этот контроллер работает так, как и должен

@SessionAttributes("giveForm")
@Controller
public class GiveFormController {

    private PersonDao personManager;
    private KeyCardManager database;
    private GiveFormValidator validator;

    public GiveFormController() {
    }

    @Autowired
    public GiveFormController(KeyCardManager database, PersonDao personManager, GiveFormValidator validator) {

        this.database = database;
        this.validator = validator;
        this.personManager = personManager;
    }

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(getValidator());
    }

    @RequestMapping(value = "/give", method = RequestMethod.GET)
    public String give(Model model) {
        GiveForm giveForm = new GiveForm();

        model.addAttribute(giveForm);

        return "give";
    }

    @RequestMapping(method = RequestMethod.POST, params = {"continue"})
    public String go(@ModelAttribute("giveForm") @Valid GiveForm giveForm,
            BindingResult result, Model model, SessionStatus status, HttpServletRequest request) {

        String customer = giveForm.getCustomer();

        if (!customer.isEmpty()) {
            Person person = getPersonManager().findByUid(customer);

            if (person != null) {
                model.addAttribute("customerName", person.getCn());
                model.addAttribute("userIdActive", person.isActive());
            }
        }
        if (result.hasErrors()) {

            return "give";

        } else {

            return "give-confirm";

        }
    }

    @RequestMapping(method = RequestMethod.POST, params = {"cancel"})
    public String cancel(@ModelAttribute("giveForm") GiveForm giveForm, SessionStatus status) {

        status.setComplete();

        return "index";

    }

    @RequestMapping(method = RequestMethod.POST, params = {"ready"})
    public String ready(@ModelAttribute("giveForm") GiveForm giveForm, SessionStatus status,
          HttpServletRequest request, Model model) {
        System.out.println(giveForm.getKeyId());

         status.setComplete();

        model.addAttribute(giveForm);

      if(getDatabase().insertGive(giveForm, request.getRemoteUser())) {
        return "success";
      }
      else {
            return "operationfailed";
      }
    }

Но при получении атрибута модели для метода ready: null возвращает ноль:

@SessionAttributes("takeForm")
@Controller
public class XXTakeFormController {

private TakeFormValidator validator;
private KeyCardManager database;
private PersonDao ldap;

   public XXTakeFormController(){

   }
   @Autowired
    public XXTakeFormController(TakeFormValidator validator, KeyCardManager database, PersonDao ldap) {

        this.database = database;
        this.validator = validator;
        this.ldap = ldap;

    }
     @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(getValidator());
    }




    @RequestMapping(value = "/take", method = RequestMethod.GET)
    public String take(Model model) {

        TakeForm takeForm = new TakeForm();

        model.addAttribute(takeForm);

        return "take";
    }

    @RequestMapping(method = RequestMethod.POST, params = {"continue"})
    public String go(@ModelAttribute("takeForm") @Valid TakeForm takeForm,
            BindingResult result, Model model, SessionStatus status) {

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

        else {
             String criteria = takeForm.getCriteria();
        if (Character.isDigit(criteria.charAt(0))) {
          // criteria is a keyId
          String customer = getDatabase().getHolderOf(criteria);
          takeForm.setCustomer(customer);
          Person person = getLdap().findByUid(customer);
          if (person != null) {
            model.addAttribute("customerName", person.getCn());
          }
          model.addAttribute("customer", customer);
          List keys = new ArrayList();
          keys.add(getDatabase().getKey(criteria));
          model.addAttribute("keys", keys);
        } else {
          // criteria is a userId
          takeForm.setCustomer(criteria);
          model.addAttribute("customer", criteria);
          model.addAttribute("customerName", getLdap().findByUid(criteria).getCn());
          model.addAttribute("keys", getDatabase().getKeysOf(criteria));
        }

    }
            return "take-confirm";

    }

     @RequestMapping(method = RequestMethod.POST, params = {"cancel"})
    public String cancel(@ModelAttribute("takeForm") TakeForm takeForm,
             SessionStatus status) {

        status.setComplete();

        return "index";

    }

    @RequestMapping(method = RequestMethod.POST, params = {"ready"})
    public String ready(@ModelAttribute("takeForm") TakeForm takeForm, SessionStatus
            status, HttpServletRequest request,Model model) {

          status.setComplete();
        model.addAttribute(takeForm);

        System.out.println(takeForm.getKeyId());




        if(getDatabase().executeTake(takeForm.getKeyId(), request.getRemoteUser(), takeForm.getNotes())){

        return "success";
        }
        else {
            return "operationfailed";
        }
    }

Вероятно, это то, чего я не знаю.Оба готовых метода возвращают одно и то же простое представление.Может кто-нибудь одолжить мне глаза?:)

1 Ответ

1 голос
/ 13 декабря 2011
model.addAttribute("key","value");

В основном используется для задания данных модели в контроллере. Эти данные будут извлечены в файл JSP напрямую, используя имя ключа как ${key}
Все данные, добавляемые в модель, будут доступны непосредственно в файле jsp с помощью ${name}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...