可单例开发、典型的教科书式的mvc构架----springmvc----day02(五)
8.json数据交互
8.1为什么要进行json数据交互
json数据格式在接口调用中、html页面中较常用,json格式比较简单,解析还比较方便。
比如:webservice接口,传输json数据。
8.2springmvc进行json交互
1.请求json,输出json,要求请求的是json串,所以在前端页面中需要将请求的内容转成json,不太方便。
2.请求key/value,输出json。此方法比较常用。
8.3环境准备
8.3.1加载json串的jar包
springmvc中使用jackson的包进行json转换(@requestBody和@responseBody使用下边的包进行json串)。
8.3.2配置json转换器
在注解适配器中加入messageConverters
<!-- mvc:annotation-driven代替上边注解映射器和注解适配器的配置 mvc:annotation-driven默认加载很多的参数绑定方法,比如json转换解析器就默认加载了,
如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequsetMappingHandleAdaper
实际开发中使用:mvc:annotation-driven -->
8.4json交互测试
8.4.1输入json串,输出是json串
8.4.1.1jsp页面
使用jquery的ajax提交json串,对输出的json结果进行解析。
function requestJson() {
//请求json,输出的是json
$.ajax({
type : 'post',
url : '${pageContext.request.contextPath }/requestJson.action',
contentType : "application/json;charset=UTF-8",
//数据格式是json 串
data : '{"name":"手机", "price":9090}',
success : function(data) {
alert(data);
}
});
}
8.4.1.2controller
@RequestMapping("/requestJson")
public @ResponseBody ItemsCustom requestJson(@RequestBody ItemsCustom itemsCustom) {
itemsCustom.setName(itemsCustom.getName() + "王际");
return itemsCustom;
}
8.4.2输入key/value,输出是json串
8.4.2.1jsp页面
function responseJson() {
//请求key/value,输出的是json
$.ajax({
type : 'post',
url : '${pageContext.request.contextPath }/responseJson.action',
// contentType : "application/json;charset=UTF-8",
//数据格式是key/value
data : 'name=手机&price=999',
success : function(data) {
alert(data);
}
});
}
8.4.2.2controller
@RequestMapping("/responseJson")
public @ResponseBody ItemsCustom responseJson(ItemsCustom itemsCustom) {
return itemsCustom;
}
9.RESTful支持
9.1什么是RESTful
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符号标准、易于理解、扩展方便、所以正得到越来越多网站的采用。
RESTful(即Representational State Transfer的缩写)其实是一个开放理念,是对http的很好的诠释。
1.对url进行规范,写RESTful格式的url
非REST的url:http://...../queryItems.action?id=001&type=T01
REST的url:http://..../items/001
特点:url简洁,将参数通过url传到服务端
2.http的方法规范
不管是删除、添加、更新。。使用url是一致的,如果进行删除,需要设置http的方法为delete,同理添加。。。
后台controller方法:判断http方法,如果是delete执行删除,如果是post执行添加。
3.对http的contentType规范
请求时指定contentType,要json数据,设置成json格式的type。。
9.2REST的例子
9.2.1需求:
查询商品信息,返回json数据。
9.2.2controller
定义方法,进行url映射使用REST风格的url,将查询商品信息的id传入controller
输出json使用@ResponseBody将java对象输出json。
@RequestMapping("/requestJson")
public @ResponseBody ItemsCustom requestJson(@RequestBody ItemsCustom itemsCustom) {
itemsCustom.setName(itemsCustom.getName() + "王际");
return itemsCustom;
}
@RequestMapping(value="/itemsView/{id}"):{XXX}占位符,请求的url可以是“/viewItems/1”或“viewItems/2”,通过在方法中使用@PathVariable获取{XXX}中的XXX变量。
@PathVariable用于将请求url中的模板变量映射到功能处理方法的参数上。
如果RequestMapping中表示为“/itemsView/{id}”,id和形参名称一致,@PathVariable不用指定名称。
9.2.3REST方法的前端控制器配置
在web.xml配置:
<!-- springmvc-rest前端控制器 -->
<servlet>
<servlet-name>springmvc-rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器、映射器、适配器等等) 如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc-rest</servlet-name>
<!-- 第一种:*.action,访问以.action结尾由DispatcherServlet进行解析 第二种:/,所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet解析
使用此种方法可以实现RESTful风格的url 第三种:/*,这样配置不对,使用这种配置,最终需要发到一个jsp页面时, 仍然会有DispatcherServlet解析jsp地址值,不能提供jsp页面找到handler,会报错 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
9.3对静态资源的解析
配置前端控制器的url-parttern中指定/,对静态资源的解析出现问题:
在springmvc.xml中添加静态资源解析方法。
<!-- 静态资源 -->
<mvc:resources location="/assets/css/" mapping="/css/**" />
<mvc:resources location="/assets/font/"
mapping="/font/**" />
<mvc:resources location="/assets/images/"
mapping="/images/**" />
<mvc:resources location="/assets/js/" mapping="/js/**" />
<mvc:resources location="/assets/musics/"
mapping="/musics/**" />
<mvc:resources location="/assets/scripts/"
mapping="/scripts/**" />
<mvc:resources location="/assets/upload/"
mapping="/upload/**" />