第五章 Spring MVC支持Restful

x33g5p2x  于2021-03-14 发布在 其他  
字(5.5k)|赞(0)|评价(0)|浏览(293)

REST和RESTFUL

REST是一种架构风格,REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。其核心是面向资源。

面向操作的URL:
/getAllUsers
/getUser?userid=1
/getUser?userid=2

面向资源的URL:
1.URL中不体现操作,即没有动词。
2.每个资源对应不同的URL, /user/1, /user/2

[info]GET /users:列出所有用户
POST /users:新建一个用户
GET /user/ID:获取某个指定用户的信息
PUT /user/ID:更新某个指定用户的信息
DELETE /user/ID:删除某个用户

复杂一些的URL(注意,URL中的中文涉及URL编码的问题):
Get /users/{username}/name
Get /users/{username}/{password}/validate
Get /users/2012/10

Rest常用的5个verb
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE):不建议用,因为不是HTTP标准请求,有兼容性问题。
DELETE(DELETE):从服务器删除资源。

Http1.2的8种请求

[success]OPTIONS
HEAD
GET
POST
PUT
DELETE
TRACE
CONNECT

ajax提交时,chrome浏览器测试结果,GET, POST, DELETE,PUT都支持,

在PUT时,后台无法获得参数,解决方法:在web.xml中配置过滤器

<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>

代码实现

Spring MVC控制器

@Controller
public class TestRestful {
	
	public List<UserInfo> users = new ArrayList<>();
	
	public TestRestful()
	{
		UserInfo u1 = new UserInfo();
		u1.setUserid(1);
		u1.setUsername("feiyy");
		u1.setPassword("123");
		users.add(u1);
		
		UserInfo u2 = new UserInfo();
		u2.setUserid(2);
		u2.setUsername("xx");
		u2.setPassword("123");
		users.add(u2);
		
		UserInfo u3 = new UserInfo();
		u3.setUserid(3);
		u3.setUsername("yy");
		u3.setPassword("123");
		users.add(u3);
	}
    
	//查询全部
	@RequestMapping(value="/users", method=RequestMethod.GET)
	@ResponseBody
	public List<UserInfo> getAllUsers()
	{
		return users;
	}
	
    //插入
	@RequestMapping(value="/users", method=RequestMethod.POST)
	@ResponseBody
	public List<UserInfo> addUser(UserInfo u)
	{
		users.add(u);
		
		return users;
	}
	
    //修改
	@RequestMapping(value="/user/{id}", method=RequestMethod.PUT)
	@ResponseBody
	public List<UserInfo> modifyUser(@PathVariable int id, UserInfo u)
	{
		System.out.println(id);
		System.out.println(u.getUserid());
		System.out.println(u.getUsername());
		for(int i=0; i<users.size();i++)
		{
			UserInfo item = users.get(i);
			if(item.getUserid() == id)
			{
				item.setUsername(u.getUsername());
			}			
		}		
		return users;
	}
	
    //删除
	@RequestMapping(value="/user/{id}", method=RequestMethod.DELETE)
	@ResponseBody
	public List<UserInfo> deleteUser(@PathVariable int id)
	{
		for(int i=0; i<users.size();i++)
		{
			UserInfo item = users.get(i);
			if(item.getUserid() == id)
			{
				users.remove(item);
				break;
			}			
		}
		
		return users;
	}
	
    //按id查询
	@RequestMapping(value="/user/{id}", method=RequestMethod.GET)
	@ResponseBody
	public UserInfo getUserById(@PathVariable int id)
	{
		for(int i=0; i<users.size();i++)
		{
			UserInfo item = users.get(i);
			if(item.getUserid() == id)
			{
				return item;
			}			
		}
		
		return null;
	}
	
    //按名字查询
	@RequestMapping(value="/user/{name}", method=RequestMethod.GET)
	@ResponseBody
	public UserInfo getUserByName(@PathVariable String name)
	{
		for(int i=0; i<users.size();i++)
		{
			UserInfo item = users.get(i);
			if(item.getUsername().equals(name))
			{
				return item;
			}			
		}
		
		return null;
	}
	
    //按名字 、密码查询
	@RequestMapping(value="/user/{name}/{pass}", method=RequestMethod.GET)
	@ResponseBody
	public UserInfo getUserByNamePass(@PathVariable String name, @PathVariable String pass)
	{
		for(int i=0; i<users.size();i++)
		{
			UserInfo item = users.get(i);
			if(item.getUsername().equals(name) && item.getPassword().equals(pass))
			{
				return item;
			}			
		}
		
		return null;
	}	
}

html页面

$("#btn_getall").click(function(){
		   
		   $.ajax({
			   url:"/TestSpringMVC/users",
			   dataType:"json",
			   success:function(data)
			   {
				   console.log(data);
			   },
			   error:function(err)
			   {
				   console.log(err);
			   }
		   });    
	   });
	   
       $("#btn_add").click(function(){
		   
		   $.ajax({
			   url:"/TestSpringMVC/users",
			   type:"post",
			   data:{userid:"4",username:"eee",password:"eee"},
			   dataType:"json",
			   success:function(data)
			   {
				   console.log(data);
			   },
			   error:function(err)
			   {
				   console.log(err);
			   }
		   });    
	   });
       
       $("#btn_delete").click(function(){
		   
		   $.ajax({
			   url:"/TestSpringMVC/user/4",
			   type:"delete",
			   dataType:"json",
			   success:function(data)
			   {
				   console.log(data);
			   },
			   error:function(err)
			   {
				   console.log(err);
			   }
		   });    
	   });
       
       $("#btn_update").click(function(){
		   
		   $.ajax({
			   url:"/TestSpringMVC/user/1",
			   type:"put",
			   data:{userid:"1",username:"feiyuanyuan",password:"123"},
			   dataType:"json",
			   success:function(data)
			   {
				   console.log(data);
			   },
			   error:function(err)
			   {
				   console.log(err);
			   }
		   });    
	   });

表单提交时,只支持get和post,解决方法:
(1)配置过滤器

 <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>

(2)表单加入隐藏属性_method

<form action="/TestSpringMVC/user/1" method="post">
    <input type="hidden" name="userid" value="1"/>
    <input type="text" name="username"/>
    <input type="hidden" name="password" value="123"/>
    <input type="hidden" name="_method" value="PUT"/>
    <button type="submit">表单提交修改</button>
</form>

<form action="/TestSpringMVC/user/1" method="post">
    <input type="hidden" name="userid" value="1"/>
    <input type="hidden" name="_method" value="DELETE"/>
    <button type="submit">表单提交删除</button>
</form>

相关文章