2016-09-13 108 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配置编辑了帖子。 –

相关问题