2015-03-31 2 views
4

Я основываю свои знания о том, как это сделать on this Crunchify tutorial.Как вернуть обычный текст для запроса AJAX?

У меня есть одностраничное приложение.

Он имеет две функции. Он должен либо отправить запрос на сервлет HTTP, который будет вызывать его собственную java, и из которого он получит строку JSON, содержащую любые ошибки/рекомендации сервлета, что делать дальше.

Другая функция заключается в том, что она запрашивает диалог сохранения файла из сервлета.

Вопрос в том, как я могу структурировать свой сервлет таким образом, чтобы он возвращал 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 сервлет. Затем сервлет возвращает ModelAndView из ViewName = text, ModelName = model.

Затем диспетчер перенаправляет на /jsp/text.jsp (указанное представление), отображает на нем модель. Этот окончательный вывод будет возвращен объекту AJAX, который затем сможет получить к нему доступ, как он хочет.

Есть ли более прямой способ сделать это?

ответ

2

Ниже Вы найдете некоторые из наблюдений:

  • MyServlet класс, который помечается @Controller не сервлет. Он заботится о аспекте контроллера шаблона проектирования MVC.
  • Единственный сервлет, который используется здесь, это DispatcherServlet. Это фронтальная сервлет для всех на основе Spring MVC appliations
  • Я хотел бы предложить переименовать название DispatcherServlet как MyServlet имя дает ощущение, что сервлет рукописные

И НЕТ, это не вокруг пути реализации. Шаги, которые вы выполнили, являются стандартным способом работы с Spring MVC.

Этого блог дает пример реализацию Ajax с использованием Spring MVC: http://www.mkyong.com/spring-mvc/spring-mvc-jquery-autocomplete-example/

+0

Уверен, что хорошее имя сервлета, скорее, должно называться '' MyServletController'. – dwjohnston

4

Там в немного более прямом способе сделать это, и она включает в себя @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"); 
} 
11

Да, для этого существует более прямой способ.

В соответствии с руководством 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

Теперь пришел другой способ, в котором вам нужно вернуть обычный текст.

Аннотируйте ваш метод submitQuery() в контроллере с @ResponseBody аннотацию:

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

@ResponseBody можно поставить на метод и указывает на то, что тип возвращаемого должен быть записан прямо в тело ответа 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(); 
} 
+0

Я не думаю, что 'window.location.href =" ваш url "' необходим. Он на самом деле не ищет перенаправления, он просто ищет текст ответа. – wholevinski

+0

Я читал его несколько раз. Переадресация слов является побочным продуктом его непонимания в том, как работает JSP-рендеринг: «Затем диспетчер перенаправляет на /jsp/text.jsp (указанное представление), отображает на нем модель. Этот окончательный визуализированный вывод возвращается объекту AJAX, который может затем получить к нему доступ, как он хочет ». – wholevinski

+0

Не должно быть абсолютно никакой логики перенаправления; в его вопросе четко сказано: «Вопрос в том, как я могу структурировать свой сервлет таким образом, чтобы он возвращал HTTP-ответ с открытым текстом для рассматриваемого AJAX-запроса». Он даже упоминает, возможно, о необходимости JSON: «и из которого он получит строку JSON, содержащую любые ошибки/рекомендации сервлета, что делать дальше». – wholevinski

Смежные вопросы