Как сделать так, чтобы переменные Spring 3.0 MVC @ModelAttribute не появлялись в URL? - PullRequest
56 голосов
/ 29 января 2010

Используя Spring MVC 3.0.0.RELEASE, у меня есть следующий контроллер:

@Controller
@RequestMapping("/addIntake.htm")
public class AddIntakeController{

  private final Collection<String> users;

  public AddIntakeController(){
    users = new ArrayList<String>();
    users.add("user1");
    users.add("user2");
    // ...
    users.add("userN");
  }

  @ModelAttribute("users")
  public Collection<String> getUsers(){
    return this.users;
  }

  @RequestMapping(method=RequestMethod.GET)
  public String setupForm(ModelMap model){

    // Set up command object
    Intake intake = new Intake();
    intake.setIntakeDate(new Date());
    model.addAttribute("intake", intake);

    return "addIntake";
  }

  @RequestMapping(method=RequestMethod.POST)
  public String addIntake(@ModelAttribute("intake")Intake intake, BindingResult result){

    // Validate Intake command object and persist to database
    // ...

    String caseNumber = assignIntakeACaseNumber();

    return "redirect:intakeDetails.htm?caseNumber=" + caseNumber;

  }

}

Контроллер считывает информацию о поступлении из объекта команды, заполненного из формы HTML, проверяет объект команды, сохраняет информацию в базе данных и возвращает номер дела.

Все отлично работает, за исключением того, что когда я перенаправляю на страницу потреблениеDetails.htm, я получаю URL, который выглядит следующим образом:

http://localhost:8080/project/intakeDetails.htm?caseNumber=1&users=user1&users=user2&users=user3&users=user4...

Как предотвратить отображение пользовательской коллекции в URL-адресе?

Ответы [ 13 ]

0 голосов
/ 08 апреля 2016

попробуйте добавить приведенный ниже код в servlet-config.xml

<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" />

иногда это решит проблему.

0 голосов
/ 07 января 2012

Существует обходной путь, если он помогает вашей причине.

      @ModelAttribute("users")
      public Collection<String> getUsers(){
           return this.users;
      }

Здесь вы заставили его вернуть коллекцию строк. Сделайте это коллекцией пользователя (это может быть строка переноса класса, представляющая пользователя, или класс с кучей данных о пользователе). Проблема возникает только со строками. Если возвращенная Коллекция содержит какой-либо другой объект, этого никогда не происходит. Тем не менее, это всего лишь обходной путь, и он может быть совсем не обязательным. Просто мои два цента. Просто сделай это как -

      @ModelAttribute("users")
      public Collection<User> getUsers(){
           return this.users;
      }
0 голосов
/ 29 января 2010

Не используйте @ModelAttribute. Храните пользователей в ModelMap явно. Вы все равно делаете с командным объектом.

@RequestMapping(method=RequestMethod.GET)
    public String setupForm(ModelMap model){

        // Set up command object
        Intake intake = new Intake();
        intake.setIntakeDate(new Date());
        model.addAttribute("intake", intake);

        model.addAttribute("users", users);

        return "addIntake";
    }

Недостатком является то, что в addIntake() возникает ошибка проверки. Если вы хотите просто вернуть логическое имя формы, вы должны также не забывать заполнять модель пользователями, иначе форма будет настроена неправильно.

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