RESTful是一种风格,不太想谈他的全称,并不是很好让人理解。通过RESTful风格,用户会使用同一个url发起请求:

如 localhost:8080/rest/user

然鹅...这个地址与我们之前写的 localhost:8080/rest/user/doFindUser?id=1234并不一样,也就是说我们无法直观的从REST风格url中了解到用户想要执行的操作。

RESTful是怎么实现的呢?

其实是使用不同的请求方式实现的。除了之前比较常见的两个请求方式(get post)外,还有put,delete等等...

get请求:对应查

post请求:对应增

put请求:对应改

delete请求:对应删

刚好是CRUD

通过RESTful风格的设计的接口,用户发起请求的地址会变得更加优♂雅,只有名词木有动词,而让服务器通过请求来判断用户究竟是想对这个名词执行什么样的操作。

如何在Spring MVC中使用呢?

其实很简单

@RequestMapping(value = "/rest",method = RequestMethod.GET)  
 @RequestMapping(value = "/rest",method = RequestMethod.POST)  
 @RequestMapping(value = "/rest",method = RequestMethod.PUT)  
 @RequestMapping(value = "/rest",method = RequestMethod.DELETE)

将注解放在对应方法上即可实现RESTful的API开发,非常简单。

然鹅...

HTML的form表单提交中,method并没有put和delete,甚至jQuery中也没有也没有$.put和$.delete的封装,这导致了SpringMVC并不能直接的接受通过put和delete方式传过来的参数。

使用RESTful风格需要注意的问题:

1.在使用Servlet管理url时,使用/实现RESTful风格,但这样做会导致静态资源被拦截,如js,css,image等...非常头疼,研究了一上午才发现js没有被加载的原因。

<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:conf/spring-*.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>



解决办法是在SpringMVC配置文件中加上资源映射配置来管理静态资源

<mvc:resources mapping="/css/**" location="/css/" />  
<mvc:resources mapping="/image/**" location="/image/" />  
<mvc:resources mapping="/js/**" location="/js/" />

还没完,一定要加上这句话

<mvc:default-servlet-handler/>

加入这句话之后会在上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler来检查url中静态资源,如果发现静态资源就交给default的servlet解决而不是我们定义的DispatcherServlet,在tomcat中默认的服务器就是default,如果是其他的还需要上网查找web容器默认的名称。

2.注意jsp中js的路径

在jsp中写js路径是出了一点小差错,一是将js文件放在了WEB-INF下导致资源无法访问,所以要把他放到webapp下,新建一个js文件夹便于管理。在这里我是用了jstl标签

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="basePath" value="${pageContext.request.contextPath}"></c:set>

然后js的路径我选择了绝对路径

<script type="text/javascript" src="${basePath }/js/jquery-3.2.1.js"></script>

3.ajax的写法:

在使用ajax做异步请求时,实际上是把put和delete伪装成post,在参数中定义_method来实现响应请求

$('#editBut').on("click",function(){
    $.ajax({
        url: "restful",
        type : "post",
        data : {
            _method : "put",
            name : "RESTful",      
        },
        success : function(data){
            $(showDiv).append("<p> 数据更新成功:"+data+"</p>");
        },  
    })
});

$('#deleteBut').on("click",function(){
    $.ajax({
        url: "restful",
        method : "post" ,
        data : {
            _method : "delete",
            id : 1
        },
        success : function(data){
            $(showDiv).append("<p> 数据删除成功:"+data+"</p>");
        },
    })
});



以上是RESTful的小学习笔记,如果在工作学习上遇到新的问题会随时补充。