前言
最近准备深入学习Android网络请求这一块,为了能够更好的了解移动端在请求的过程,便准备自己动手通过SpringMVC搭建一个服务端。由于自己spring这块的知识点掌握地不够,整个过程遇到了一些问题,在这做个记录。
正题
在实际开发中,服务端的数据是以json串的形式发送给移动端的,因此只是实现服务端能够返回json串就达到我的目的了。可以通过两种方式来实现返回json串:
- 先将数据转换为json串,然后通过
HttpServletResponse
对象中的PrintWriter
对象中的write()
方法来实现数据的返回。
参考代码:
public static void printAjax(HttpServletResponse response, String result) {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
try {
response.getWriter().write(result);
} catch (IOException e) {
e.printStackTrace();
}
} - 通过spring的
@ResponseBody
实现,它用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区
。因此通过配置可以转换成的json的HttpMessageConverter
,就能返回json串了。
配置完HttpMessageConverter
,然后仅仅只需要在Controller
方法上添加@ResponseBody
注解就欧了,这种方式明显逼格上要高一点,果断采用此种方式来实现。(毕竟高逼格是我一直的追求)
实现步骤
- 在maven中添加依赖,由于我所使用的spring版本是4.0.4,因而不支持Gson(spring 4.1之后才支持Gson,不知道是否可以通过其他办法支持gson,没有深入研究,毕竟只要能够给移动端返回json串就ok了)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.0.1</version>
</dependency>
- 配置
spring-mvc.xml
文件
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json; charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven> - 在Controller中实现方法
@RequestMapping(value = "/login", method = RequestMethod.POST)
@ResponseBody // 重点在这,其余都是浮云
public Map<String, String> login(String username, String password, HttpServletRequest request, HttpServletResponse response) {
TsUser loginUser = tsLoginService.consoleLogin(request, response, username, password, false, request.getRemoteAddr());
Map<String, String> map = new HashMap<String, String>();
map.put("username", loginUser.getUsername());
map.put("ip", loginUser.getRegisterIp());
return map;
}
这就大功告成了!