SimpleFormController
不适合处理Ajax请求.因此,我将应用程序迁移到带注释的控制器.
我试图从Oracle数据库返回一个java.util.List使用Spring MVC 3.0.2与Hibernate通过Ajax使用Jackson 1.9.8(其下载page),但我还没有使用任何技术的JSON.我已经阅读了一些教程/文章,但我无法理解如何返回这样复杂的数据结构,并在Spring中使用JSON进行解析.我试图首先学习类似JSON的概念.
我正在尝试的是当从国家/地区选择框中选择一个国家/地区时,应该通过Ajax从数据库填充与该国家相对应的州.我没有关于如何通过Ajax响应返回java.util.List的方法,如何解析它,并再次在Java代码中使用它.我只能达到以下水平.
JS代码.
function getStates(countryId) { $.ajax({ datatype:"json",type: "POST",url: "/wagafashion/ajax/TempAjax.htm",data: "countryId=" + countryId,success: function(response) { $('#msg').html(response); $('#stateList').val(''); },error: function(e) { alert('Error: ' + e); } }); }
Spring控制器类中的方法是在国家/地区选择框的onchange事件上执行Ajax请求时调用的.
@RequestMapping(method=RequestMethod.POST,value="ajax/TempAjax") public @ResponseBody List<StateTable> getStateList(@modelattribute("tempBean") TempBean tempBean,BindingResult error,Map model,HttpServletRequest request,HttpServletResponse response) { Session session=NewHibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List<StateTable>list=session.createQuery("from StateTable where country.countryId=:countryId order by stateId").setParameter("countryId",new BigDecimal(request.getParameter("countryId"))).list(); session.flush(); session.getTransaction().commit(); return list; }
状态选择框我需要使用< c:forEach>< / c:forEach>的Ajax响应返回的状态列表来填充. EL的循环.
<form:select path="cmbState" class="validate[required] text-input tooltip" title="Mandatory select field."> <form:option value="">Select</form:option> <c:forEach items="${stateList}" var="row"> <c:choose> <c:when test="${row.stateId==param['stateId'] and deselectCombo!=1}"> <form:option value="${row.stateId}" selected="selected">${row.stateName}</form:option> </c:when> <c:otherwise> <form:option value="${row.stateId}">${row.stateName}</form:option> </c:otherwise> </c:choose> </c:forEach> </form:select> <font style="color: red"><form:errors path="stateId"/></font><br/>
我只能使Ajax请求和响应成功.从互联网上发现的这些教程中,我无法理解.更准确地说,如何在前面的< c:forEach>< c:forEach>的items属性中使用Ajax响应.循环如items =“${stateList}”?
你能给我一些提示/想法如何返回一个数据列表,并在上一个循环中使用它来填充状态选择框?你能请我从这里领先一些步骤吗?
我使用的是NetBeans 6.9.1(而不是Eclipse).在有关Eclipse中的Marvan项目的一些教程中,有人提到pom.xml文件需要配置为包含< dependencies>< / dependencies> (杰克逊依赖).在NetBeans项目中没有像pom.xml这样的东西.是否需要在NetBeans中的某些xml文件中配置某个地方,例如here?
>更改控制器以使用GET而不是POST.一方面,在REST中使用POST是不正确的(您只是检索数据,而不是更改它).但更重要的是,通过将URL简单地放入浏览器来查看JSON响应,您可以更轻松地测试控制器.使用@ResponseBody注释并将Jackson包含在类路径中应该会产生一个JSON响应(除非你有一些Hibernate的懒惰加载问题).
>一旦您验证控制器返回JSON,请更新您的jQuery成功处理程序以动态填充下拉列表.这应该比较容易在浏览器中测试.
写一个新的控制器来处理这个表单提交.在这个控制器中,只需要一个返回列表并将其注释为@modelattribute(“stateList”)的方法.这将使列表可用于您的< c:forEach>循环来渲染页面加载.您将有另一种方法来处理同一个控制器中的实际表单提交.
另一件要考虑的问题是通过将数据库代码放在自己的服务或存储库中来更好地分离问题.在MVC架构中的控制器中进行数据访问是一种糟糕的做法.作为奖励,您不需要复制任何代码来将列表加载到两个不同的控制器中.
另外,查看Spring的@Transactional声明式事务处理.这样你就不需要编写任何代码进行事务处理.您也可以简单地注入SessionFactory而不是编写自己的HibernateUtils.
希望有帮助
编辑:在REST中,这里是映射到其对应的CRUD操作的HTTP方法.