springmvc对RESTful支持
1.什么是RESTful
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
RESTful(即Representational State Transfer的缩写)其实是一个开发理念,是对http的很好的诠释。(表现层的状态转换)
1.1 对url进行规范,写RESTful格式的url
非REST的url:http://…/queryItems.action?id=001&type=T01
REST的url风格:http://…/items/001/get
特点:url简洁,将参数通过url传到服务端
1.2 http的方法规范
不管是删除、添加、更新,使用url是一致的。(四个HTTP动词)
删除资源,需要设置http的方法为delete;同理添加资源,需要设置http的方法为post;
更新资源,需要设置http的方法为put;获取资源,需要设置http的方法为get;
后台controller方法:判断http方法,如果是delete执行删除,如果是post执行添加。
PS:一个controller方法既要做逻辑,又要做上述判断,太麻烦,往往实际开发不这样写
1.3对http的contentType规范
请求时指定contentType,要json数据,设置成json格式的type。。
2.REST的例子
2.1需求
查询商品信息,返回json数据。
2.2 controller
定义方法,进行url映射使用REST风格的url,将查询商品信息的id传入controller .
输出json使用@ResponseBody将java对象输出json。
@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ktpFjycY-1640929029179)(image/wps101.jpg)]
@RequestMapping(value="/itemsView/{id}"):{×××}占位符,请求的URL可以是“/viewItems/1”或“/viewItems/2”,通过在方法中使用@PathVariable获取{×××}中的×××变量。
如果RequestMapping中表示为"/ itemsView /{id}",id和形参名称一致,@PathVariable不用指定名称。
2.3 REST方法的前端控制器配置
XML版本 - 在web.xml配置REST风格访问
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d5jwePUq-1640929029183)(image/wps102.jpg)](https://img-blog.csdnimg.cn/23c7de7cd44a463d8ab24027eab79a16.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2hhdCdzIHlvdXIgbmFtZS4=,size_11,color_FFFFFF,t_70,g_se,x_16)
<filter>
<filter-name>HttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
JavaConfig配置类版本 - 在web.xml配置REST风格访问
WebInitializer 类
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
//启动
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
}
//加载Spring的配置类
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{MyBatisConfig.class , TransConfig.class};
}
//加载MVC的配置类
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMVCConfig.class};
}
//前端控制器 DispatcherServlet RestFul风格 /
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//过滤器
@Override
protected Filter[] getServletFilters() {
Filter[] filters = {
new CharacterEncodingFilter("UTF-8"),
new HiddenHttpMethodFilter()
};
return filters;
}
}
测试:
原来url :http://localhost:8899/testSpringMVC_MyBatis/items/editItem.action?id=1
REST风格url:http://localhost:8899/testSpringMVC_MyBatis/items/viewItems/1
3.对静态资源的解析
配置前端控制器的url-parttern中指定/,对静态资源(js、css、img等)的解析出现问题:
XML版本 - 在springmvc-annotation.xml中添加静态资源解析方法
<!-- 静态资源解析,包括:js、css、img等资源 -->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/img/" mapping="/img/**"/>
<!-- 替代上述配置 -->
<mvc:default-servlet-handler/>
JavaConfig配置类版本 - 在SpringMVCConfig类中添加静态资源解析方法
//对静态资源放行
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
4.需求
操作用户(增删改查)
JSP页面:
form表单指定method为POST,且添加
<input type="hidden" name="_method" value="PUT"/>
<input type="hidden" name="_method" value="DELETE"/>
// 删
@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") Integer id) throws Exception {
restfulService.delete(id);
return "redirect:/users";
}
// 查
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
public String get(@PathVariable Integer id, Model model) throws Exception {
User user = restfulService.selectById(id);
model.addAttribute("user", user);
return "/user/userEdit.jsp";
}
// 改
@RequestMapping(value = "/update", method = RequestMethod.PUT)
public String update(User user,HttpServletRequest request) throws Exception {
restfulService.update(user);
return "redirect:/users";
}
删除资源,需要设置http的方法为delete;同理添加资源,需要设置http的方法为post;
更新资源,需要设置http的方法为put;获取资源,需要设置http的方法为get;