我是Spring MVC和JSP开发的新手,所以请温柔地告诉我,我做的事情很愚蠢:P 告诉他们,问题是:
我研究了一下Spring MVC并获得了一段很好的工作代码。现在我陷入了一个明显愚蠢的问题:似乎我无法获得我在控制器中传递给JSP的对象。 我需要做的是:用户填写两个文本框,然后他点击一个按钮,系统应查询数据库,找到用户搜索的元素,将找到的元素添加到数组“capitolospesas”并重新渲染包含数组中所有对象的jsp(前一个+刚刚添加的对象)。
我创建的循环是:controller ---> 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”正确填充了用户输入的内容,但我调试了代码,发现每次方法“selectCapitoloSpesaFromProposte”启动一个新数组“capitolospesas”实例化而不是从我先前传递的数组中获取值到了jsp。
如果有人有任何建议,请发帖。
答案 0 :(得分:3)
当JSP被发送到客户端(即呈现为HTML)时,保留的唯一数据是生成的HTML文档中的数据。不存在Java对象,只有文本 - 可以作为表单提交返回给服务器。因此JSP可以访问java对象,但是一旦生成了Web页面,它就会被遗忘。请记住:网页只是一个文本文档,所有在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)
答案 1 :(得分:1)
您必须在控制器中将对象保存在会话变量或数据库(或其他持久性存储)中。你无法从ModelAndView
对象中获取它。该对象被发送到JSP,之后被垃圾收集。您处于新请求中,除非您将模型对象保存在某处,否则无法访问先前请求中的模型对象。