草庐IT

java - 使用 Jackson 通过 AJAX 从 Spring MVC Controller 返回 java.util.List

coder 2024-03-05 原文

基于 my question几天前发布,我意识到 SimpleFormController 不适用于处理 Ajax 请求。因此,我正在将我的应用程序迁移到带注释的 Controller 。

我正在尝试返回 java.util.List从 Oracle 数据库使用 Spring MVC 3.0.2 和 Hibernate 通过 Ajax 使用 Jackson 1.9.8 (它的下载 page )但我还没有在任何技术中使用过 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);
        }
    });
}

onchange 上发出 Ajax 请求时调用的 Spring Controller 类中的方法国家选择框的事件。

@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;
}

我需要用 Ajax 响应使用 <c:forEach></c:forEach> 返回的状态列表来填充状态选择框。 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 请求和响应。从互联网上找到的那些教程中,我无法理解更多。更准确地说,我如何在 items 中使用 Ajax 响应?前面的属性 <c:forEach><c:forEach>循环如 items="${stateList}"

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

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

最佳答案

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

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

  2. 一旦您确认 Controller 正在返回 JSON,请更新您的 jQuery 成功处理程序以动态填充下拉列表。这应该是相对容易的。在浏览器中对此进行测试。

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

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

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

希望对你有帮助

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

  • POST - 创建
  • GET - 检索
  • PUT - 更新
  • DELETE - 删除

关于java - 使用 Jackson 通过 AJAX 从 Spring MVC Controller 返回 java.util.List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11856005/

有关java - 使用 Jackson 通过 AJAX 从 Spring MVC Controller 返回 java.util.List的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  8. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  9. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  10. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

随机推荐