0

我是 Spring MVC 和 JSP 开发的新手,所以请温柔地告诉我我在做一些愚蠢的事情:P 告诉那个问题:

我研究了一点 Spring MVC 并得到了一段很好的工作代码。现在我陷入了一个明显愚蠢的问题:似乎我无法将传递给 JSP 的对象返回到控制器中。我需要做的是:用户填写两个文本框,然后单击一个按钮,系统应该查询数据库,找到用户搜索的元素,将找到的元素添加到数组“capitolospesas”并重新渲染包含数组中所有对象的jsp(前一个+刚刚添加的那个)。

我创建的循环是:控制器---> jsp ---> 控制器---> 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”和“proposte”。我不明白的是,当它们从 jsp 中返回时,如何获取这些对象?到目前为止,我在唯一需要保存、编辑或删除页面上唯一实体的参数之前使用了 @ModelAttribute 注释,但现在我需要从页面中获取多个对象。在上面粘贴的代码中,我尝试多次使用 @ModelAttribute 注释,但没有成功;对象“proposte”正确填充了用户键入的内容,但我调试代码以发现每次方法“

如果有人有任何建议,请发表。

4

2 回答 2

3

当 JSP 被发送到客户端(即呈现为 HTML)时,唯一保留的数据是生成的 HTML 文档中的数据。不存在 Java 对象,只有文本 - 可以作为表单提交返回到服务器。所以 JSP 可能会访问 java 对象,但是一旦它生成了网页,它就会被遗忘。请记住:网页只是一个文本文档,Web 浏览器和服务器之间交换的只是文本。Java 对象不会被忽略。

要保留 java 对象(您可以在提交表单时对其进行修改),您必须将其存储在其他地方。具体来说,您将使用会话对象直接存储该对象,或存储一些其他指向它的指针(例如,可用于引用数据库条目的登录名,或用于读取的文件名等)。

要在普通 servlet 中使用会话值,请执行以下操作:

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)
于 2011-09-20T14:10:42.287 回答
1

您必须将对象保存在控制器中,无论是会话变量还是数据库(或其他持久存储)中。ModelAndView您无法从对象中取回它。该对象被发送到 JSP 并在之后被垃圾收集。您在一个新请求中,除非您将它们保存在某个地方,否则您无法从先前的请求中访问模型对象。

于 2011-09-20T13:49:58.787 回答