引起原因:
1.web.xml配置的SpringMVC <url-pattern>*.html</url-pattern>
2.jar包的引用问题
SpringMVC4中:引入faster json包:以下给出maven依赖:引入json三大包之后:mvc配置文件中不需要配置messagehandleradapt 添加json转换器;SpringMVC会自动加载json转换器,当存在json包时;
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.5.0</version>
</dependency>
情况一:
web.xml配置如下:
1.<url-pattern>*.html</url-pattern>拦截html后缀的请求
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
此时你的请求为html的后缀,返回浏览器的request的header为
Content-Type:
text/html;charset=utf-8
实际上数据此时是json格式,于是浏览器就会报出406错误:(
HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型),浏览器使用html解析不了json数据,于是报错,也就是说此处如果是
Content-Type:
application/json;charset=UTF-8的类型,浏览器就不会报错了,如下截图:
此时浏览器不报错了!!
为此我们需要进行一个配置,我们要引入内容协商管理器,并将其加入<mvc:annotation-driven/>
代码:
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
<property name="favorParameter" value="false" />
<property name="ignoreAcceptHeader" value="false" />
<property name="mediaTypes" >
<value>
atom=application/atom+xml
html=text/html
json=application/json
*=*/*
</value>
</property>
</bean>
在管理器中
mediaTypes变量配置了对应类型value的
Content-Type,紧接着配置<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>,加入mvc的引用中;此时浏览器访问正常;
情况二:
<url-pattern></url-pattern>配置为拦截所有请求,请求无后缀情况下,引入json包,即可使用@ResponseBody 返回json数据,无需配置内容协商管理器;