很简单的一个东西,这里就不做过多介绍了,写一个小Demo,随手记录下。
首先,在搭好SpringMVC工程环境之后,如果想用Spring自带的Json,需要额外的添加2个JAR包:
1、jackson-core-asl-1.9.9.jar
2、jackson-mapper-asl-1.9.9.jar
我这里使用的是Maven,也相对应的给出pox.xml
1 <dependency>
2 <groupId>org.codehaus.jackson</groupId>
3 <artifactId>jackson-core-lgpl</artifactId>
4 <version>1.8.1</version>
5 </dependency>
6
7 <dependency>
8 <groupId>org.codehaus.jackson</groupId>
9 <artifactId>jackson-mapper-lgpl</artifactId>
10 <version>1.8.1</version>
11 </dependency>
当然也可以不使用Spring自带的Json,还有很多第三方的Json支持包,比如谷歌的Gson,都是很好用的东西。
关于Gson的使用,之前的文章里也有做介绍,请戳:《Gson简要使用笔记》
好了,进入正题,要使用Spring自带的Json,需要在SpringMVC配置文件里做一些配置:
1 <!-- 处理在类级别上的@RequestMapping注解 -->
2 <bean
3 class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
4 <!-- 处理在方法级别上的@RequestMapping注解 -->
5 <bean
6 class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
7 <property name="messageConverters">
8 <list>
9 <bean
10 class="org.springframework.http.converter.StringHttpMessageConverter">
11 <property name="supportedMediaTypes">
12 <list>
13 <!-- 默认是ISO-88859-1,避免乱码这里设置为UTF-8 -->
14 <value>
15 text/html;charset=UTF-8
16 </value>
17 </list>
18 </property>
19 </bean>
20 <!-- 启动JSON格式的配置 -->
21 <bean id="jacksonMessageConverter"
22 class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
23 <!-- 解决 HttpMediaTypeNotAcceptableException: Could not find acceptable
24 representation -->
25 <property name="supportedMediaTypes">
26 <list>
27 <value>application/json;charset=UTF-8</value>
28 </list>
29 </property>
30 </bean>
31 </list>
32 </property>
33 </bean>
有了以上的配置之后,我们只需要在对应处理AJAX请求的方法上加上注解@ResponseBody,这样Spring就会帮我们把内容或对象作为HTTP响应的正文返回,会跳过视图处理部分,而调用适合HttpMessageConverter,将返回值(对象、字符串、List集合等)写入输出流。
SpringMVC的用法这里就不再多说了,直接给出关键代码:
//向页面直接输出Json字符串
@ResponseBody
@RequestMapping(value="/showUser",params="json",produces="application/json")
public User showUserJson(){
User user=userService.getUserById(1);//获取数据库的一条信息
return user;
}
@RequestMapping
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params: 指定request中必须包含某些参数值,才让该方法处理。
看一下页面输出:
怎么样?相比Struts2输出Json要简单的多吧,少去了很多配置和通配符的设定。
再来看一下和AJAX的配合使用,服务端的代码依旧如上,然后我们写一个JSP页面进行测试
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%
4 String path = request.getContextPath();
5 String basePath = request.getScheme() + "://"
6 + request.getServerName() + ":" + request.getServerPort()
7 + path + "/";
8 %>
9 <html>
10 <head>
11 <script type="text/javascript" src="<%=basePath %>js/jquery-1.4.4.min.js"></script>
12 <script type="text/javascript">
13 $(document).ready(function(){
14 $("#send").click(function(){
15 $.ajax({
16 type:"get",
17 url:"<%=basePath %>userController/showUser?json",
18 dataType:" json",
19 success:function(data){
20 alert(data);
21 }
22 });
23 });
24 });
25 </script>
26 </head>
27 <body>
28 <h3>点击下面按钮,输出Json信息</h3>
29 <input type="button" id="send" name="send" value="获取json信息">
30 </body>
31 </html>
这里要提到一个注意事项,我们在整合SpringMVC的时候需要在web.xml进行对DispatcherServlet的配置
1 <!-- SpringMVC配置 -->
2 <servlet>
3 <servlet-name>springDispatcherServlet</servlet-name>
4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
5 <init-param>
6 <param-name>contextConfigLocation</param-name>
7 <param-value>classpath:springmvc.xml</param-value>
8 </init-param>
9 <load-on-startup>1</load-on-startup>
10 </servlet>
11
12 <servlet-mapping>
13 <servlet-name>springDispatcherServlet</servlet-name>
14 <url-pattern>/</url-pattern>
15 </servlet-mapping>
如果你配置DispatcherServlet拦截*.do就不会存在静态资源访问的问题,
但如果你和我一样配置DispatcherServlet拦截 / (所有),那么对*.js,*.css,*.jpg等资源的访问也就被拦截了,也就访问不到了。
这里顺带说下解决方法:
激活Tomcat的defaultServlet来处理静态文件
1 <servlet-mapping>
2 <servlet-name>default</servlet-name>
3 <url-pattern>*.jpg</url-pattern>
4 </servlet-mapping>
5 <servlet-mapping>
6 <servlet-name>default</servlet-name>
7 <url-pattern>*.js</url-pattern>
8 </servlet-mapping>
9 <servlet-mapping>
10 <servlet-name>default</servlet-name>
11 <url-pattern>*.css</url-pattern>
12 </servlet-mapping>
每种文件类型都要配置,要写在DispatcherServlet的前面, 让defaultServlet先拦截,这个就不会进入Spring了。
看下实现效果: