Spring ajax将对象列表从控制器发送到jsp

时间:2016-09-13 21:07:28

标签: ajax spring jsp

我正在尝试将从数据库获取的对象的发送列表发送到我的JSP。我设法成功地将数据从JSP发送到我的控制器。我的控制器内部的方法接受该参数,填充List(我在调试模式下检查它),控制器返回该列表。

@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上获取该List时,我得到了

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

这是我的带有AJAX代码的JSP

<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类,即我将添加到List中的对象类:

@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>

1 个答案:

答案 0 :(得分:1)

从Spring 3.2+开始,内容协商在eval Accept标题之前还有其他事实:

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

  

在Spring MVC中启用内容协商

     

Spring支持两种选择格式的约定   required:URL后缀和/或URL参数。这些工作并存   使用Accept标头。结果,内容类型可以是   以三种方式中的任何一种请求。默认情况下,它们会在此处进行检查   顺序:

     
      
  • 在网址中添加路径扩展名(后缀)。因此,如果传入的URL类似于http://myserver/myapp/accounts/list.html,那么HTML   是必须的。对于电子表格,URL应该是   http://myserver/myapp/accounts/list.xls。媒体类型的后缀   映射是通过JavaBeans Activation自动定义的   Framework或JAF(所以activation.jar必须在类路径上)。
  •   
  • 这样的网址参数:http://myserver/myapp/accounts/list?format=xls。的名字   参数是默认格式,但可以更改。用一个   默认情况下禁用参数,但启用后,将检查该参数   第二

  •   
  • 最后检查Accept HTTP标头属性。这就是HTTP的方式&gt;实际上定义为工作,但,如前所述,它可以   使用会有问题。

  •   

这实际上意味着,如果您使用@Controller后缀映射.htm(l)方法,则会返回html并且不会返回json也不会返回Accept其他格式,即使您将其他格式发送为.htm标题。

我总是将我的控制器映射为@ResponseBody,并且当我升级到Spring 3.2及更高版本时,我不得不改变用于映射 `<servlet-mapping> <servlet-name>springDispatcher</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping>` 注释方法的方式。

修改 在看到你的web.xml之后,就像我想的那样,你将每个.html后缀请求映射到调度程序servlet:

@RequestMapping

我认为现在控制器中的@RequestMapping(value="/test", method=RequestMethod.GET, produces="application/json") public @ResponseBody List<ModelVechicle> fetchListModelById(@RequestParam Integer number) { 是这样的:

/test

由于.html<servlet-mapping> <servlet-name>springDispatcher</servlet-name> <url-pattern>*.html</url-pattern> <url-pattern>*/test</url-pattern> </servlet-mapping> 后缀不匹配,请求未到达springDispatcher,这正是您获得404的原因。

现在,解决此问题的选项:

1)在web.xml中添加一个与该控制器匹配的新映射:

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

这样你就不得不包含任何新的非html返回方法。对我来说似乎没用。

2)将所有传入请求映射到dispatcherServlet

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

我不喜欢这个选项,我更愿意过滤我真正想要到达调度程序servlet的内容。

3)为这种请求找到新的匹配模式。我总是发布某种通用后缀,这些后缀不会被JAF捕获,例如* .service:

Accept

因此,在返回XML或JSON(或任何其他格式,仅取决于@RequestMapping(value="/test.service", method=RequestMethod.GET, produces="application/json") public @ResponseBody List<ModelVechicle> fetchListModelById(@RequestParam Integer number) { 标题)的Controller方法中,我的映射如下:

/service/

4)你也可以使用&#39; http://com.xxx.yyy/myApp/service/resource&#39;发布所有这种@ResponseBody控制器方法。模式并使用 <servlet-mapping> <servlet-name>springDispatcher</servlet-name> <url-pattern>*.html</url-pattern> <url-pattern>/service/</url-pattern> </servlet-mapping> 作为web.xml中的servlet映射

{{1}}