我正在尝试将从数据库获取的对象的发送列表发送到我的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>
答案 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}}