注意:所有文章除特别说明外,转载请注明出处.
前言
@ResponseBody转换为JSON秘密
1.在控制器中,其在进入控制器方法之前,遇到@ResponseBody之后,处理器就会记录这个方法的响应类型是JSON数据集。
2.在执行完控制器返回之后,处理器启用结果解析器(ResultResolver)解析此结果,轮询注册给SpringMVC的HttpMessageConverter接口的实现类。
操作会话对象
@SessionAttribute 该注解应用于参数,将HttpSession中的属性读出,赋予控制器的参数
@SessionAttributes 用于类的注解,其会将相关数据模型的属性保存到Session中
给控制器增加通知
@ControllerAdvice 定义控制器通知类
@InitBinder 定义控制器参数绑定规则
@ExceptionHandler 定义控制器发生异常后的操作
@ModelAttribute 在控制器方法执行之前,对数据模型进行操作
数据回显
数据回显,表示在提交之后如果出现错误,将刚才提交的数据回显到刚才提交的页面。
POJO数据回显方法
1.SpringMVC默认对POJO数据作回显
POJO数据传入controller方法后,springmvc自动将POJO数据放到request域,key等于POJO类型(首字母小写),使用@ModelAttribute指定pojo回显到页面在request中的key。
2.@ModelAttribute将方法的返回值传到页面
在商品查询列表页面,通过商品类型查询商品信息。在controller中定义商品类型查询方法,最终将商品类型传到页面。
//商品分类
//itemtypes表示最终将方法返回值放在request中的key
@ModelAttribute("itemtypes")
public Map<String, String> getItemTypes() {
Map<String, String> itemTypes = new HashMap<String, String>();
itemTypes.put("101", "数码");
itemTypes.put("102", "母婴");
return itemTypes;
}
然后在页面上可以得到itemTypes数据。
<td>
商品名称:<input name="itemsCustom.name" />
商品类型:
<select name="itemtype">
<c:forEach items="${itemtypes}" var="itemtype">
<option value="${itemtype.key }">${itemtype.value }</option>
</c:forEach>
</select>
</td>
3.使用最简单方法使用model,可以不用@ModelAttribute
//可以直接使用model将提交pojo回显到页面
//model.addAttribute("items", itemsCustom);
//简单类型数据回显
//使用最简单方法使用model
model.addAttribute("id", id);
SpringMVC JSON数据交互
1.环境
1.pom.xml添加依赖
<!-- json 转换-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
2.配置JSON转换器
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</list>
</property>
</bean>
提示:这里可以直接使用
<mvc:annotation-driven />
,然后就不用再定义上面的内容。
这里的前台和controller方法省略。
RESTful支持
概念
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。RESTful(即Representational State Transfer的缩写)其实是一个开发理念,是对http的很好的诠释。
1.对url进行规范,写RESTful格式的url
1.非REST的url:http://...../queryItems.action?id=001&type=T01
2.REST的url风格:http://..../items/001
特点:url简洁,将参数通过url传到服务端
2.http的方法规范
不管是删除、添加、更新,等等。使用url是一致的,如果进行删除,需要设置http的方法为delete,其他同理。后台controller方法:判断http方法,如果是delete执行删除,如果是post执行添加。
3.对http的contentType规范
请求时指定contentType,要json数据,设置成json格式的type。
案例 - 查询商品信息,返回JSON数据
1.controller
定义方法,进行url映射使用REST风格的url,将查询商品信息的id传入controller。输出json使用@ResponseBody将java对象输出json。
//查询商品信息,输出json
//itemsView/{id}里边的{id}表示占位符,通过@PathVariable获取占位符中的参数,
//@PathVariable中名称要和占位符一致,形参名无需和其一致
//如果占位符中的名称和形参名一致,在@PathVariable可以不指定名称
@RequestMapping("/itemsView/{id}")
public @ResponseBody ItemsCustom itemsView(@PathVariable("id") Integer items_id)throws Exception{
//调用service查询商品信息
ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
return itemsCustom;
}
@RequestMapping(value=”/ itemsView/{id}”):{×××}占位符,请求的URL可以是/viewItems/1或/viewItems/2,通过在方法中使用@PathVariable获取{×××}中的×××变量。@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。如果@RequestMapping中表示为/itemsView/{id},id和形参名称一致,@PathVariable不用指定名称。
2.REST方法的前端控制器配置
<!-- springmvc前端控制器,rest配置 -->
<servlet>
<servlet-name>springmvc_rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等等) 如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-serlvet.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>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.对静态资源的解析
配置前端控制器的url-parttern中指定/,对静态资源的解析会出现问题,报404错误。在springmvc.xml中添加静态资源解析方法。
<!-- 静态资源解析
包括 :js、css、img、..
-->
<mvc:resources location="/js/" mapping="/js/**"/>
这时访问http://localhost:8080/ssm1/js/jquery-1.4.4.min.js,可以在浏览器中看到js的内容。