2011-09-15 22 views
3

我在我的web應用程序中使用jquery和struts2。現在我需要將谷歌地圖嵌入我的網頁並添加一些標記。我使用jquery.getJSON()命令向struts2動作發送請求。返回來自struts2的JSON消息操作

在struts.xml中

<package name="ajax" namespace="/ajax" extends="json-default"> 
    <action name="LatLngList" class="com.test.ajax.Action" method="find"> 
     <result type="json"></result> 
    </action> 
</package> 

在網頁

<script type="text/javascript"> 
    function readLatLng() { 
     var latitude = new Array(); 
     var longitude = new Array(); 
     $.getJSON("ajax/LatLngList.action?id=9", function(data){ 
      $.each(data, function(i,latlng){ 
      latitude.push(latlng.latitude); 
      longitude.push(latlng.longitude);  
      }); 
     }); 
    } 
</script> 

在操作,我讀了數據庫中的數據,並創建對象的列表,然後使用JSON傑克遜處理器的ObjectMapper到將列表轉換爲JSON字符串。最後,我返回JSON字符串作爲返回值。

public String find() throws JsonGenerationException, JsonMappingException, IOException { 

    List latlngList = new ArrayList(); 
    /* 
    latlngList.add(...); 
    */ 

    ObjectMapper mapper = new ObjectMapper(); 
    String str = mapper.writeValueAsString(latlngList); 
    System.out.println(str); 
    return str; 
} 

當我運行Web應用程序,JSON字符串在控制檯中顯示:

[ 
{"latitude":37.7935697,"longitude":121.181969}, 

{"latitude":37.7852119,"longitude":121.1759833}, 

{"latitude":37.7858117,"longitude":121.1250904}, 

{"latitude":37.794129,"longitude":121.1229535}, 

{"latitude":37.7974078,"longitude":121.0874301}, 

{"latitude":37.8280231,"longitude":121.049312} 
] 

然而,它給我的錯誤。

No result defined for action com.test.ajax.Action and result [{"latitude":37.7935697,"longitude":121.181969},{"latitude":37.7852119,"longitude":121.1759833},{"latitude":37.7858117,"longitude":121.1250904},{"latitude":37.794129,"longitude":121.1229535},{"latitude":37.7974078,"longitude":121.0874301},{"latitude":37.8280231,"longitude":121.049312}] 
    at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:375) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:277) 
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263) 
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:270) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) 
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498) 
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:680) 

我搜索了很長時間,但仍找不到解決方案。 等待你的幫助。非常感謝你。

回答

2

因爲你正在使用JSON插件進行混合,並直接渲染結果。意義既不會工作。操作返回結果的名稱,而不是原始數據。 (或者說他們可以返回原始數據,但隨後必須處理方式不同。)

Check out the documentation for the JSON plugin.

6

從我使用Struts2開始已經很長時間了,但是從內存中您不會返回操作的響應,您返回一個簡單的字符串名稱,用於確定要使用的配置中的哪個結果,然後控制器類可用於您的視圖。當返回json結果時,這些屬性會被序列化爲JSON以返回。

所以,你要更多的東西是這樣的:

private List latlngList; 
public List getLatLngList() { 
    return latlngList; 
} 

public String find() throws JsonGenerationException, JsonMappingException, IOException { 
    latlngList = new ArrayList() 
    /* 
    latlngList.add(...); 
    */ 

    return "success"; 
} 

然後在您的JavaScript搶生成的JSON的LatLngList財產(注意,從datadata.latLngList的變化):

<script type="text/javascript"> 
    function readLatLng() { 
     var latitude = new Array(); 
     var longitude = new Array(); 
     $.getJSON("ajax/LatLngList.action?id=9", function(data){ 
      $.each(data.latLngList, function(i,latlng){ 
       latitude.push(latlng.latitude); 
       longitude.push(latlng.longitude);  
      }); 
     }); 
    } 
</script> 
+1

非常感謝你。它成功返回JSON文件。我誤解了struts2的返回過程。 –