【发布时间】:2012-08-05 01:27:13
【问题描述】:
根据几天前发布的my question,我意识到SimpleFormController 不适合处理Ajax 请求。因此,我正在将我的应用程序迁移到带注释的控制器。
我正在尝试使用 Spring MVC 3.0.2 和 Hibernate 通过 Ajax 使用 Jackson 1.9.8(其下载 page)从 Oracle 数据库返回 java.util.List,但我还没有在任何技术中使用 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);
}
});
}
在国家/地区选择框的onchange事件上进行Ajax请求时调用的Spring控制器类中的方法。
@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;
}
我需要使用 EL 的 <c:forEach></c:forEach> 循环使用 Ajax 响应返回的状态列表填充状态选择框。
<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="${stateList}")的items 属性中使用Ajax 响应?
您能否给我一些提示/想法,如何返回数据列表并在前面的循环中使用它来填充状态选择框?你能从这里带我走几步吗?
我使用的是 NetBeans 6.9.1(不是 Eclipse)。在一些关于 Eclipse 中 Marvan 项目的教程中,提到需要配置 pom.xml 文件以包含 <dependencies></dependencies>(杰克逊依赖项)。在我的 NetBeans 项目中没有像 pom.xml 这样的东西。是否需要在 NetBeans 的某个 xml 文件中的某个位置进行配置,例如提到的here?
【问题讨论】:
-
我不确定我是否理解这个问题。
<c:forEach>是一个 JSP 标签,因此在服务器端执行。当呈现的 HTML 到达客户端的浏览器(将在其中发出 AJAX 请求)时,代码将已经执行。 -
@Deejay-你是对的。从一个 选择框 中选择一个项目并基于通过 Ajax 请求传递的值填充其后续 选择框 是一件非常基本且非常常见的事情。我在问其他人他们如何在 Spring MVC 中做这些事情。这并不意味着事情应该只以我在这里指出的方式发生。这是我想到的事情,我的假设可能错误。我可以想到 Ajax 的 XML 响应,但在这里,我认为这不会发生,因为控制器必须映射到可能返回复杂数据结构的 JSP 页面
-
请看下面hyness的回答。您需要使用 jquery 而不是服务器端代码来更改 HTML。另一种方法是返回 html 而不是 json(在 ajax 上),但我更喜欢前一种方法。
标签: java json ajax spring-mvc jackson