【问题标题】:How do I return plain text for an AJAX query?如何为 AJAX 查询返回纯文本?
【发布时间】:2015-06-05 09:12:54
【问题描述】:

我的知识基于如何做到这一点on this Crunchify tutorial

我有一个单页应用程序。

它有两个功能。它需要向 HTTP servlet 发送请求,该 servlet 将调用自己的 java,并从中接收包含任何错误的 JSON 字符串/建议 servlet 下一步该做什么。

另一个功能是它从 servlet 提示保存文件对话框。

问题是 - 我如何构建我的 servlet,使其返回纯文本 HTTP 响应以供 AJAX 查询检查。

我有一个非常全面的方法来做这件事,我想要一个关于如何以更简单的方式实现同​​样事情的建议。

web.xml

   <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/submitQuery</url-pattern>     
          <url-pattern>/saveFile
    </servlet-mapping>

MyServlet-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="world.hello.myservlets" />

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

MyServlet.java

package world.hello.myservlets;

@Controller
public class MyServlet{


    @RequestMapping("/submitQuery")
    public ModelAndView submitQuery()
    {       

        return new ModelAndView("text", "model", "hello world");
    }

}

/WEB-INF/jsp/text.jsp

{model}

index.html

<html>
<head>
<script>
function myAjax()
{
         xmlhttp.onreadystatechange=function()
          {
          if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                alert(xmlhttp.responseText)
                /*do something with the http response*/
            }     

          }


     xmlhttp=new XMLHttpRequest();
     xmlhttp.open("GET", "submitQuery", true);
     xml.send();
}
</script>
</head>
<body>
    <button onclick="myAjax()">Click me</button>
</body>
</html>

我的理解是,当/submitQuery URI 被发送时,它被映射到MyServlet servlet。然后 servlet 返回 ModelAndViewViewName = text, ModelName = model

然后调度程序重定向到 /jsp/text.jsp(指定的视图),在其上显示模型。最终呈现的输出将返回给 AJAX 对象,然后该对象可以按需要访问它。

有没有更直接的方法来做到这一点?

【问题讨论】:

    标签: ajax spring spring-mvc servlets single-page-application


    【解决方案1】:

    请在下面找到一些观察结果:

    • 带有@Controller 注释的MyServlet 类不是servlet。它负责 MVC 设计模式的控制器方面。
    • 这里使用的唯一 servlet 是 DispatcherServlet。它是面向所有基于 Spring MVC 的应用程序的前端 servlet
    • 我建议重命名 DispatcherServlet 名称,因为 MyServlet 名称给人的感觉是 servlet 是手写的

    不,这不是关于实施方式的轮回。您所遵循的步骤是使用 Spring MVC 的标准方式。

    这篇博文给出了一个使用 Spring MVC 的示例 Ajax 实现: http://www.mkyong.com/spring-mvc/spring-mvc-jquery-autocomplete-example/

    【讨论】:

    • 关于 servlet 名称当然好点,而应该称为 'MyServletController
    【解决方案2】:

    有一种更直接的方法,它涉及@ResponseBody。你可以这样做跳过jsp渲染:

    @RequestMapping(value = "/somestring", method = RequestMethod.GET)
    public @ResponseBody
    String getSomeString() {
        return "some string";
    }
    

    如果你想使用字符串以外的东西,你可以。该对象将被序列化为 JSON。示例:

    @RequestMapping(value = "/myobject", method = RequestMethod.GET)
    public @ResponseBody
    MyObject getSomeString() {
        return new MyObject("blah");
    }
    

    【讨论】:

      【解决方案3】:

      是的,有更直接的方法可以做到这一点。

      根据crunchify 教程,您将返回ModelAndView 对象。这就是你在text.jsp 上获得模型对象的原因

      ModelAndView: It returning both model and view information from a controller. Holder for both Model and View in the web MVC framework. Note that these are entirely distinct. This class merely holds both to make it possible for a controller to return both model and view in a single return value.
      

      More about ModelAndView

      现在来看另一种需要返回纯文本的方式。

      使用@ResponseBody 注释在控制器中注释您的submitQuery() 方法:

      @RequestMapping(value="/submitQuery")
      @ResponseBody
      public String submitQuery() {
          return "Response";
      }
      

      @ResponseBody可以放在方法上,表示返回 type 应该直接写入 HTTP 响应正文(而不是 放置在模型中,或解释为视图名称)

      在javascript中访问参数。

      function myAjax()
      {
          xmlhttp=new XMLHttpRequest();
          xmlhttp.onreadystatechange=function()
          {
              if (xmlhttp.readyState==4 && xmlhttp.status==200)
              {
                  alert(xmlhttp.responseText);
                  console.log(xmlhttp.responseText);
              }
          }
          xmlhttp.open("GET", "submitQuery", true);
          xmlhttp.send();
      }
      

      【讨论】:

      • 我不认为window.location.href = "your url" 是必要的。他实际上并不想重定向,他只是想获取响应文本。
      • 我读了很多遍。重定向这个词是他对 JSP 渲染工作原理的误解的副产品:“调度程序然后重定向到 /jsp/text.jsp(指定的视图),在其上显示模型。最终渲染的输出返回给 AJAX 对象,然后可以按自己的意愿访问它。”
      • 绝对没有重定向逻辑;他的问题清楚地表明:“问题是 - 我如何构建我的 servlet,使其返回纯文本 HTTP 响应以供 AJAX 查询检查。”他甚至提到了对 JSON 的需求:“它将从中接收包含任何错误的 JSON 字符串/建议 servlet 下一步该做什么。”
      • ++;只是对 OP 的一个补充建议,如果你不介意包含更多的技术,请使用 jQuery/一些 js 框架来处理你的 AJAX 请求,它可以封装跨浏览器行为。 jQuery 还有很多额外的好处。并且可以避免这样的检查。 HTH。 -- if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest();}else{// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}
      • @Gyanapriya 是的,这对跨浏览器行为总是有帮助的
      猜你喜欢
      • 2011-06-01
      • 2018-06-20
      • 2022-01-03
      • 2023-03-08
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      相关资源
      最近更新 更多