2016-09-13 110 views
0

我試圖發送從數據庫發送到我的JSP的對象的發送列表。我設法成功地將數據從JSP發送到我的控制器。我的控制器內的方法採用該參數,填充List(我在調試模式下檢查它)並且控制器返回該列表。Spring ajax發送從控制器到jsp的對象列表

@RequestMapping(value="/test.html", method=RequestMethod.GET, produces="application/json") 
public @ResponseBody List<ModelVechicle> fetchListModelById(@RequestParam Integer number) { 

    System.out.println(number); 

    List<ModelVechicle> modelList = vechicleService.fetchModelById(number); 

    return modelList; 
} 

當我嘗試讓我的JSP中列表中,我得到

HTTP Status 406 - 

type Status report 

message 

description The resource identified by this request is only capable of generating 
responses with characteristics not acceptable according to the request "accept" headers. 

Apache Tomcat/8.0.32 

這裏是我的JSP與AJAX代碼

<script type="text/javascript"> 
$(document).ready(function(){ 
    $("#brand").change(onSelectChange); 
}); 

function onSelectChange() { 
    var selected = $("#brand option:selected");  
    var output = ""; 
    var number = parseInt(selected.val()); 


     $.ajax({ 
      type: "GET", 
      url: "test.html", 
      dataType : 'json', 
      data: ({number: number}), 
      success: function(response){ 
       $('#result').html(""); 
        var obj = JSON.parse(response); 
        $('#result').html(obj.modelName); 
       }, 
       error: function(xhr,e){      
        alert('Error while request..'+xhr.responseText); 
       } 
      }); 

    if(selected.val() != 0){ 
     output = "You selected brand " + selected.text(); 

    } 
    $("#output").html(number); 


} 

而且,這裏是我的ModelVechicle類,這是我添加到列表中的對象類:

@Entity 
@Table(name = "CARDEALERSHIP.MODEL") 
public class ModelVechicle implements Serializable { 

private static final long serialVersionUID = 7420515051961158192L; 

@Id 
@Column(name = "ID") 
private Integer modelId; 

@Column(name = "MODELNAME") 
private String modelName; 

@ManyToOne 
@JoinColumn(name = "BRANDID") 
private Brand brand; 

public ModelVechicle(Integer modelId, String modelName, Brand brand) { 
    super(); 
    this.modelId = modelId; 
    this.modelName = modelName; 
    this.brand = brand; 
} 

public ModelVechicle() {} 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((brand == null) ? 0 : brand.hashCode()); 
    result = prime * result + ((modelId == null) ? 0 : modelId.hashCode()); 
    result = prime * result + ((modelName == null) ? 0 : modelName.hashCode()); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    ModelVechicle other = (ModelVechicle) obj; 
    if (brand == null) { 
     if (other.brand != null) 
      return false; 
    } else if (!brand.equals(other.brand)) 
     return false; 
    if (modelId == null) { 
     if (other.modelId != null) 
      return false; 
    } else if (!modelId.equals(other.modelId)) 
     return false; 
    if (modelName == null) { 
     if (other.modelName != null) 
      return false; 
    } else if (!modelName.equals(other.modelName)) 
     return false; 
    return true; 
} 

public Integer getModelId() { 
    return modelId; 
} 

public void setModelId(Integer modelId) { 
    this.modelId = modelId; 
} 

public String getModelName() { 
    return modelName; 
} 

public void setModelName(String modelName) { 
    this.modelName = modelName; 
} 

public Brand getBrand() { 
    return brand; 
} 

public void setBrand(Brand brand) { 
    this.brand = brand; 
} 

有人請解釋我該怎麼做才能動態地將List列表到JSP頁面,並正確顯示List成員?

編輯:這是我的web.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 
    <display-name>CarDealership</display-name> 
    <welcome-file-list> 
    <welcome-file>addVechicle.html</welcome-file> 
    </welcome-file-list> 

    <servlet> 
    <servlet-name>springDispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/dispatchers.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>springDispatcher</servlet-name> 
    <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 

    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/app-config.xml 
    </param-value> 
    </context-param> 

</web-app> 
+0

您使用的是哪個版本的Spring框架? – jlumietu

+0

@jlumietu 4.2.6.RELEASE –

回答

1

在Spring 3.2+的,內容協商有其他事實在之前的帳戶EVAL Accept頭:

https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc

在Spring MVC中啓用內容協商

Spring支持兩種約定來選擇所需的格式 :URL後綴和/或URL參數。這些工作與 一起使用Accept標頭。因此,內容類型可以通過以下三種方式中的任何一種來請求: 。默認情況下,它們在此處被選中:

  • 在URL中添加路徑擴展名(後綴)。所以,如果傳入的URL類似http://myserver/myapp/accounts/list.html,那麼HTML 是必需的。對於電子表格,URL應爲 http://myserver/myapp/accounts/list.xls。媒體類型 映射的後綴通過JavaBeans激活 Framework或JAF自動定義(因此activation.jar必須位於類路徑中)。
  • 這樣的URL參數:http://myserver/myapp/accounts/list?format=xls。 參數的名稱默認爲格式,但可能會更改。默認情況下,使用 參數是禁用的,但啓用時,將檢查 秒。

  • 最後檢查Accept HTTP標題屬性。這就是HTTP的實際定義如何工作,但正如前面提到的那樣,它可能會使用問題。

這實際上意味着,如果你映射一個@Controller方法與.htm(l)後綴,它打算返回html並且不會返回json甚至你發送其他格式Accept標題任何其他格式。

我總是將我的控制器映射爲.htm,並且當我升級到Spring 3.2及更新版本時,必須改變我用於映射@ResponseBody註釋方法的方式。

編輯: 看到你的web.xml,因爲我認爲,你在每一個映射的.html後綴請求到調度的servlet後:

`<servlet-mapping> 
    <servlet-name>springDispatcher</servlet-name> 
    <url-pattern>*.html</url-pattern> 
    </servlet-mapping>` 

我估計,現在在你的控制器的@RequestMapping是像這樣:

@RequestMapping(value="/test", method=RequestMethod.GET, produces="application/json") 
public @ResponseBody List<ModelVechicle> fetchListModelById(@RequestParam Integer number) { 

由於/test不匹配.html後綴,請求不會到達至springDispatcher,而這正是WH Ÿ你得到一個404

現在,選擇解決這個問題:

1)添加一個新的映射,其中該控制器相匹配的web.xml文件:

<servlet-mapping> 
    <servlet-name>springDispatcher</servlet-name> 
    <url-pattern>*.html</url-pattern> 
    <url-pattern>*/test</url-pattern> 
</servlet-mapping> 

這種方式,你會被迫包含任何新的非HTML返回方法。似乎不適合我。

2)地圖的所有傳入的請求的DispatcherServlet

<servlet-mapping> 
    <servlet-name>springDispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
    </servlet-mapping> 

我真的不喜歡這個選擇,我寧願篩選我真正想達到的調度的servlet。

3)爲這類請求找到一個新的匹配模式。我百達發佈某種通用的後綴,這將不會被JAF被獲取,如*。服務的:

<servlet-mapping> 
    <servlet-name>springDispatcher</servlet-name> 
    <url-pattern>*.html</url-pattern> 
    <url-pattern>*.service</url-pattern> 
    </servlet-mapping> 
在控制器方法

所以它會返回XML或JSON(或任何其他形式,只取決於Accept的頭),I映射是這樣的:

@RequestMapping(value="/test.service", method=RequestMethod.GET, produces="application/json") 
public @ResponseBody List<ModelVechicle> fetchListModelById(@RequestParam Integer number) { 

4)你可以使用一個「http://com.xxx.yyy/myApp/service/resource」模式以及發佈所有這種控制器@ResponseBody方法和在web.xml使用/service/作爲servlet映射

 <servlet-mapping> 
     <servlet-name>springDispatcher</servlet-name> 
     <url-pattern>*.html</url-pattern> 
     <url-pattern>/service/</url-pattern> 
     </servlet-mapping> 
+0

現在我有新的: HTTP狀態404 -/CarDealership /測試 類型狀態報告 消息/ CarDealership /測試 描述所請求的資源不可用。 我想View resorlver試圖將「/ test」解析爲jsp,但我想保留在同一頁面上,並動態地將List發送到當前的JSP頁面。 –

+0

請顯示您的web.xml – jlumietu

+0

我使用web.xml配置編輯了帖子。 –

相關問題