9

根据几天前发布的问题,我意识到这SimpleFormController不适合处理 Ajax 请求。因此,我正在将我的应用程序迁移到带注释的控制器。

我正在尝试使用Jackson 1.9.8(其下载页面java.util.List)通过 Ajax 使用 Spring MVC 3.0.2 和 Hibernate 从 Oracle 数据库返回一个,但我还没有在任何技术中使用 JSON。我已经阅读了一些教程/文章,但我不知道如何在 Spring 中返回如此复杂的数据结构并使用 JSON 解析它们。我正在尝试首先学习类似 JSON 的概念。

基本上我正在尝试的是,当从国家/地区选择框中选择一个国家/地区时,应通过 Ajax 从数据库中填充与该国家/地区对应的州。我不知道如何java.util.List通过 Ajax 响应返回,如何解析它并再次在 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);
        }
    });
}

onchangeSpring 控制器类中的方法,当在国家选择框的事件上发出 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>我需要使用EL 循环使用 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 请求和响应。从互联网上找到的那些教程中,我无法理解更多内容。更准确地说,如何items在前面<c:forEach><c:forEach>循环的属性中使用 Ajax 响应,例如items="${stateList}"

你能给我一些提示/想法我如何返回数据列表并在前面的循环中使用它来填充状态选择框?你能从这里带我走几步吗?

我使用的是 NetBeans 6.9.1(不是 Eclipse)。在一些关于 Eclipse 中 Marvan 项目的教程中,提到该pom.xml文件需要配置为包含<dependencies></dependencies>(Jackson 依赖项)。pom.xml在我的 NetBeans 项目中没有这样的东西。是否需要在 NetBeans 中的某个 xml 文件中的某个位置进行配置,例如此处提到的那个?

4

2 回答 2

13

您应该使用的策略是从 jQuery 进行 AJAX 调用,获取 JSON 响应并使用它从 jQuery 而不是 java 动态更新表单。我可以看到 JSP 标记的唯一用途是在页面加载时呈现页面。这是我将如何处理这个...

  1. 更改您的控制器以使用 GET 而不是 POST。一方面,在 REST 中在这里使用 POST 是不正确的(您只是在检索数据,而不是更改它)。但是,更重要的是,只需将 URL 放入浏览器以查看 JSON 响应,您就可以更轻松地测试控制器。使用@ResponseBody注释并在类路径中包含 Jackson 应该会在此处产生 JSON 响应(除非您有一些 Hibernate 延迟加载问题)。

  2. 验证控制器返回 JSON 后,更新 jQuery 成功处理程序以动态填充下拉列表。这应该相对容易。在浏览器中测试这个。

  3. 编写一个新的控制器来处理这个表单提交。在这个控制器中,只需包含一个方法来返回列表并将其注释为@ModelAttribute("stateList"). 这将使列表可用于您的<c:forEach>循环以在加载时呈现页面。您将有另一种方法来处理同一控制器中的实际表单提交。

要考虑的另一件事是通过将数据库代码放在自己的服务或存储库中来更好地分离关注点。在 MVC 架构中的控制器中进行数据访问是一种不好的做法。作为奖励,您无需复制任何代码即可将列表加载到两个不同的控制器中。

另外,请查看 Spring 的@Transactional声明式事务处理。这样您就不需要为事务处理编写任何代码。您也可以简单地注入SessionFactory而不是编写自己的HibernateUtils.

希望有帮助

编辑:在 REST 中,这里是映射到其相应 CRUD 操作的 HTTP 方法。

  • 发布- 创建
  • GET - 检索
  • PUT - 更新
  • 删除- 删除
于 2012-08-14T16:38:36.290 回答
4

您应该尝试在 ajax 响应中使用您的选项列表,而不是像下面这样的 json

<option value="1">Mumbai</option>
<option value="2">Delhi</option>
<option value="3">Kerala</option>
<option value="4">Rajasthan</option>

然后你应该将它添加到你的选择框下面一个

function getStates(countryId)
{
    $.ajax({
    datatype:"html",
    type: "POST",
    url: "/wagafashion/ajax/TempAjax.htm",
    data: "countryId=" + countryId,

    success: function(response)
    {
        $('#stateList').html(response);
    },
    error: function(e)
    {
        alert('Error: ' + e);
    }
  });
}

或者您可以在服务器端创建 json,如下所示

[{"key":1, "value": "Mumbai"}, {"key":2, "value":"Delhi"}....]

并在 javascript 代码中

function getStates(countryId)
{
    $.ajax({
    datatype:"html",
    type: "POST",
    url: "/wagafashion/ajax/TempAjax.htm",
    data: "countryId=" + countryId,

    success: function(response)
    {
         if(response !=''){
              jQuery("#stateList").html("");
              jQuery.each(response, function(index,item) {
                jQuery("#stateList").append(jQuery("<option />")
                .attr("value",item.value)
                .text(item.key)); 
            });
         }

    },
    error: function(e)
    {
        alert('Error: ' + e);
    }
  });
}
于 2012-08-18T12:24:18.743 回答