Как отправить параметры в JSP и получить их обратно обновлено в Spring MVC - PullRequest
0 голосов
/ 20 сентября 2011

Я новичок в разработке Spring MVC и JSP, поэтому, пожалуйста, будьте осторожны, рассказывая мне, что я делаю что-то глупое: P Сказал, что вопрос:

Я немного изучил Spring MVC и получил хорошийкусок рабочего кода.Теперь я застрял на явно глупой проблеме: кажется, я не могу вернуть объекты, которые я передаю, JSP обратно в контроллер.Что мне нужно сделать, так это: пользователь заполняет два текстовых поля, затем он нажимает кнопку, и система должна запросить БД, найти элемент, который искал пользователь, добавить найденный элемент в массив «capitolospesas» и выполнить повторную визуализацию.jsp со всеми объектами в массиве (предыдущий + только что добавленный).

Созданный мной цикл: controller ---> jsp ---> controller ---> jsp.Сопоставление «newProposte» инициализирует страницу newEditProposte.jsp с пустыми значениями, jsp правильно получает отображаемые значения, пользователь редактирует / заполняет то, что необходимо, и нажимает кнопку «Отправить».Элемент управления переходит к методу «selectCapitoloSpesaFromProposte», где система должна выполнить запрос и добавить результат в массив «capitolospesas», но он всегда пуст, когда я добавляю новый объект, поэтому на странице он отображает только последний найденный элемент.

@RequestMapping("/newProposte")
public ModelAndView newProposte()
{
    System.out.println("ProposteController.newProposte()");
    ModelAndView mav = new ModelAndView();

    mav.addObject("proposte", new ProposteWeb());
    mav.addObject("newFlag", true);
    mav.addObject("capitolospesas", new HashSet<Capitolospesa>());

    mav.setViewName("proposte/newEditProposte.jsp");

    return mav;
}

@RequestMapping("/selectCapitoloSpesaFromProposte")
public ModelAndView selectCapitoloSpesaFromProposte(@ModelAttribute ProposteWeb proposte, @ModelAttribute HashSet<Capitolospesa> capitolospesas)
{
    ModelAndView mav = new ModelAndView();

    mav.addObject("proposte", proposte);
    mav.addObject("newFlag", true);        
    capitolospesas.add(capitolospesaDAO.findCapitolospesaByCapitoloSpesaCapitoloAndCapitoloSpesaArticolo(proposte.getCapitoloSpesaCapitoloProposte(), proposte.getCapitoloSpesaArticoloProposte()));
    mav.addObject("capitolospesas", capitolospesas);

    mav.setViewName("proposte/newEditProposte.jsp");

    return mav;
}

JSP:

<script language="Javascript">       
function selectCapitoloSpesa()
{
    alert("selectCapitoloSpesaFromProposte");
    document.getElementById("tabProposteForm").action = "${pageContext.request.contextPath}/selectCapitoloSpesaFromProposte";
    submitForm();
    return true;
}
function submitForm()
{
    alert("submit");
    document.getElementById("tabProposteForm").submit();
    return true;
}
</script>
....
....
the form
....
....
the foreach iterating on the array "capitolospesas" showing it in a table
....
....
<input type="button" value="selectCapitoloSpesaFromProposte"    name=selectCapitoloSpesaFromProposte    onclick="return selectCapitoloSpesa();">

Я сделал пост таким образом, потому что в зависимости от нажатой кнопки (есть разные кнопки), форма должна работать по-разному.

Я прочитал во всех руководствах, что для передачи параметров на страницу jsp мне нужно добавить их в объект ModelAndView, и я правильно делаю это.В jsp у меня есть доступ ко всем объектам, которые я передаю, в данном случае «newFlag», «capitolospesas» и «offerte».Что я не понимаю, как я могу получить эти объекты, когда они возвращаются из JSP?До сих пор я использовал аннотацию @ModelAttribute перед единственным параметром, который мне был нужен для сохранения, редактирования или удаления единственной сущности, которая была у меня на странице, но теперь мне нужно получить несколько объектов со страницы.В приведенном выше коде я несколько раз пытался использовать аннотацию @ModelAttribute, но безуспешно;объект «предложить» правильно заполнен вещами, набранными пользователем, но я отлаживал код, чтобы обнаружить, что каждый раз, когда запускается метод «selectCapitoloSpesaFromProposte», создается новый массив «capitolospesas» вместо получения значений из массива, который я передал ранеена jsp.

Если у кого-либо есть какие-либо предложения, пожалуйста, напишите их.

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Когда JSP отправляется клиенту (т. Е. Отображается в HTML), сохраняются ТОЛЬКО данные, которые находятся в результирующем документе HTML. Java-объектов не существует, только текст, который можно вернуть на сервер в виде отправки формы. Таким образом, JSP может получить доступ к объектам Java, но как только он сгенерировал веб-страницу, он забывается. Помните: веб-страница - это просто текстовый документ, и все, что обменивается между веб-браузером и сервером, - это текст. Объекты Java не передаются.

Чтобы сохранить объект Java (который вы можете изменить при отправке формы), вы должны хранить его в другом месте. В частности, вы можете использовать объект сеанса для непосредственного хранения объекта или для хранения какого-либо другого указателя на него (например, имя для входа, которое вы можете использовать для ссылки на запись в базе данных, или имя файла для чтения из и т. Д.).

Чтобы использовать значение сеанса в обычном сервлете, сделайте что-то вроде:

HttpSession session = request.getSession(true);
session.setAttribute( "keyForObject", myObject );

для хранения объекта. , , то

HttpSession session = request.getSession(true);
myObject = (ObjectType)session.getAttribute( "keyForObject" );

чтобы получить его.

В Spring RequestMapping вам просто нужно добавить параметр HttpSession, чтобы получить объект сеанса:

@RequestMapping
public void myMethod(... HttpSession session)
1 голос
/ 20 сентября 2011

Вы должны сохранить объект в вашем контроллере, либо в переменной сеанса, либо в базе данных (или другом постоянном хранилище).Нет способа вернуть его от объекта ModelAndView.Этот объект был отправлен в JSP и впоследствии был собран мусором.Вы находитесь в новом запросе, вы не сможете получить доступ к объектам модели из предыдущего запроса, если не сохраните их где-нибудь.

...