Spring RESTful风格url示例

REST是设计风格而不是标准

  • 资源是由URI来指定。

  • 对资源的操作包括获取、创建、修改和删除资源

    这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。

  • 通过操作资源的表现形式来操作资源。

常用操作

GET 获取
POST 提交
PUT 更新
Delete 删除

REST确实不是标准,只是设计风格,目的只是让url看起来更简洁实用,是资源状态的一种表达。

实战篇

Demo下载地址http://pan.baidu.com/s/1o6sJLZs

项目结构

Maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    
< properties >
< springframework >4.0.2.RELEASE springframework >
< log4j >1.2.17 log4j >
< jstl >1.2 jstl >
properties >
< dependencies >
< dependency >
< groupId >org.springframework groupId >
< artifactId >spring-webmvc artifactId >
< version >${springframework} version >
dependency >
< dependency >
< groupId >jstl groupId >
< artifactId >jstl artifactId >
< version >${jstl} version >
dependency >
< dependency >
< groupId >log4j groupId >
< artifactId >log4j artifactId >
< version >${log4j} version >
dependency >
< dependency >
< groupId >junit groupId >
< artifactId >junit artifactId >
< version >3.8.1 version >
< scope >test scope >
dependency >
dependencies >

web.xml配置

需要注意,HiddenHttpMethodFilter是针对浏览器表单不支持put和delete方法而设计的,通过在表单中设置隐藏域,来分发到相应的处理器上,如

开发后记:最近把RESTful风格融入到了项目中去了,在开发过程中发现一个问题,就是aJax提交的PUT请求,无法通过HiddenHttpMethodFilter这个过滤器拿到值,后来搜索一番,改用HttpPutFormContentFilter即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
xml  version = "1.0"  encoding = "UTF-8" ?>
< web-app  xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"  xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version = "3.0" >
< display-name >SpringActivemqServer display-name >
< context-param >
< param-name >webAppRootKey param-name >
< param-value >example.SpringActivemqServer param-value >
context-param >
< context-param >
< param-name >log4jConfigLocation param-name >
< param-value >classpath:log4j.properties param-value >
context-param >
< context-param >
< param-name >log4jRefreshInterval param-name >
< param-value >6000 param-value >
context-param >
< listener >
< listener-class >org.springframework.web.util.Log4jConfigListener listener-class >
listener >
< filter >
< filter-name >characterEncoding filter-name >
< filter-class >org.springframework.web.filter.CharacterEncodingFilter filter-class >
< init-param >
< param-name >encoding param-name >
< param-value >UTF-8 param-value >
init-param >
< init-param >
< param-name >forceEncoding param-name >
< param-value >true param-value >
init-param >
filter >
< filter-mapping >
< filter-name >characterEncoding filter-name >
< url-pattern >/* url-pattern >
filter-mapping >
< context-param >
< param-name >contextConfigLocation param-name >
< param-value >classpath*:applicationContext.xml param-value >
context-param >
< listener >
< listener-class >org.springframework.web.context.ContextLoaderListener listener-class >
listener >
< 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:spring-mvc.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 >
< filter >
< filter-name >HiddenHttpMethodFilter filter-name >
< filter-class >org.springframework.web.filter.HiddenHttpMethodFilter filter-class >
filter >
< filter-mapping >
< filter-name >HiddenHttpMethodFilter filter-name >
< servlet-name >SpringMVC servlet-name >
filter-mapping >
< welcome-file-list >
< welcome-file >index.jsp welcome-file >
welcome-file-list >
web-app >

spring-mvc.xml配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
xml  version = "1.0"  encoding = "UTF-8" ?>  
< beans  xmlns = "http://www.springframework.org/schema/beans" 
        xmlns:context = "http://www.springframework.org/schema/context"  
        xmlns:mvc = "http://www.springframework.org/schema/mvc" 
        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://www.springframework.org/schema/beans   
         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd   
         http://www.springframework.org/schema/context   
         http://www.springframework.org/schema/context/spring-context-4.0.xsd   
         http://www.springframework.org/schema/mvc   
         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">  
  
     < bean  class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
     < property  name = "messageConverters" >
         < list >
             < bean
                 class = "org.springframework.http.converter.StringHttpMessageConverter" >
                 < property  name = "supportedMediaTypes" >
                     < list >
                         < bean  class = "org.springframework.http.MediaType" >
                             < constructor-arg  index = "0"  value = "text"  />
                             < constructor-arg  index = "1"  value = "plain"  />
                             < constructor-arg  index = "2"  value = "UTF-8"  />
                         bean >
                     list >
                 property >
             bean >
         list >
     property >
bean >
      
     < mvc:annotation-driven  />
    
     < mvc:resources  location = "/resources/"  mapping = "/resources/**" />
     
    
     < context:component-scan  base-package = "org.xdemo.example"  >
        
         < context:include-filter  type = "annotation"  expression = "org.springframework.stereotype.Controller" />
     context:component-scan >
      
     < bean  class = "org.springframework.web.servlet.view.InternalResourceViewResolver" >  
         < property  name = "prefix"  value = "/WEB-INF/views/"  />  
         < property  name = "suffix"  value = ".jsp"  />
         < property  name = "order"  value = "1"  />
     bean >
beans >

applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"1.0"  encoding= "UTF-8" ?>
"http://www.springframework.org/schema/beans"
xmlns:context= "http://www.springframework.org/schema/context"
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http: //www.springframework.org/schema/beans   
         http: //www.springframework.org/schema/beans/spring-beans-4.0.xsd
         http: //www.springframework.org/schema/context   
         http: //www.springframework.org/schema/context/spring-context-4.0.xsd">
     
      package = "org.xdemo.example" >
       
       
       
       
        "annotation"  expression= "org.springframework.stereotype.Controller" />
     

User实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package  org.xdemo.example.springrestful.entity;
/**
  * @作者 Goofy
  * @邮件 [email protected]
  * @日期 2014-4-2下午1:40:32
  * @描述 用户实体类
  */
public  class  User {
private  String userId;
private  String userName;
public  User(){}
public  User(String userId,String userName){
this .userId=userId;
this .userName=userName;
}
/**
  * @return the userId
  */
public  String getUserId() {
return  userId;
}
/**
  * @param userId the userId to set
  */
public  void  setUserId(String userId) {
this .userId = userId;
}
/**
  * @return the userName
  */
public  String getUserName() {
return  userName;
}
/**
  * @param userName the userName to set
  */
public  void  setUserName(String userName) {
this .userName = userName;
}
}

UserController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package  org.xdemo.example.springrestful.controller;
import  java.util.ArrayList;
import  java.util.List;
import  org.springframework.stereotype.Controller;
import  org.springframework.ui.ModelMap;
import  org.springframework.web.bind.annotation.PathVariable;
import  org.springframework.web.bind.annotation.RequestMapping;
import  org.springframework.web.bind.annotation.RequestMethod;
import  org.springframework.web.bind.annotation.ResponseBody;
import  org.springframework.web.servlet.ModelAndView;
import  org.xdemo.example.springrestful.entity.User;
/**
  * @作者 Goofy
  * @邮件 [email protected]
  * @日期 2014-4-2下午1:28:07
  */
@Controller
@RequestMapping ( "/user" )
public  class  UserController {
public  List list= null ;
/**
  * user路径下默认显示用户列表
  * @return
  */
@RequestMapping (method=RequestMethod.GET)
public  ModelAndView index(){
if (list== null ){
list=getUserList();
}
ModelMap model= new  ModelMap();
model.addAttribute( "list" ,list);
return  new  ModelAndView( "user/index" ,model);
}
/**
  * 跳转到添加用户页面,约定优于配置,默认匹配文件/WEB-INF/views/user/add.jsp
  */
@RequestMapping ( "add" )
public  void  add(){}
/**
  * 新增保存用户
  * @param user
  * @return ModelAndView
  */
@RequestMapping (method=RequestMethod.POST)
public  ModelAndView addUser(User user){
if (list== null ){
list=getUserList();
}
list.add(user);
ModelMap model= new  ModelMap();
model.addAttribute( "list" ,list);
return  new  ModelAndView( "user/index" ,model);
}
/**
  * 查看用户详细信息
  * @param id
  * @return ModelAndView
  */
@RequestMapping (method=RequestMethod.GET,value= "{id}" )
public  ModelAndView viewUser( @PathVariable ( "id" )String id){
User user=findUserById(id);
ModelMap model= new  ModelMap();
model.addAttribute( "user" ,user);
return  new  ModelAndView( "user/view" ,model);
}
/**
  * 删除用户
  * @param id
  */
@ResponseBody
@RequestMapping (method=RequestMethod.DELETE,value= "{id}" )
public  String deleteUser( @PathVariable ( "id" )String id){
if (list== null ){
list=getUserList();
}
removeUserByUserId(id);
return  "suc" ;
}
/**
  * 跳转到编辑页面
  * @param id
  * @return ModelAndView
  */
@RequestMapping ( "{id}/edit" )
public  ModelAndView toEdit( @PathVariable ( "id" )String id){
User user=findUserById(id);
ModelMap model= new  ModelMap();
model.addAttribute( "user" ,user);
return  new  ModelAndView( "user/edit" ,model);
}
/**
  * 更新用户并跳转到用户列表页面
  * @param user
  * @return ModelAndView
  */
@RequestMapping (method=RequestMethod.PUT)
public  ModelAndView edit(User user){
updateUser(user);
return  new  ModelAndView( "redirect:/user/" );
}
/********************下面方法是操作数据的*********************/
/**
  * 造10个用户
  * @return List
  */
private  List getUserList(){
List list= new  ArrayList();
for ( int  i= 0 ; i< 10 ;i++){
list.add( new  User((i+ 1 )+ "" , "李四" +(i+ 1 )));
}
return  list;
}
/**
  * 删除用户
  * @param id
  * @return List
  */
private  List removeUserByUserId(String id){
if (list== null ) return  null ;
for (User user:list){
if (user.getUserId().equals(id)){
list.remove(user); break ;
}
}
return  list;
}
/**
  * 查找用户
  * @param id
  * @return User
  */
private  User findUserById(String id){
User user= null ;
if (list== null ) return  null ;
for (User _user:list){
if (_user.getUserId().equals(id)){
user=_user; break ;
}
}
return  user;
}
/**
  * 更新用户
  * @param user
  */
private  void  updateUser(User user){
for (User _user:list){
if (_user.getUserId().equals(user.getUserId())){
_user.setUserName(user.getUserName()); break ;
}
}
}
}

用户列表页面index.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<%@ page language= "java"  import = "java.util.*"  pageEncoding= "UTF-8" %>
<%@ taglib uri= "http://java.sun.com/jsp/jstl/core"  prefix=

你可能感兴趣的:(java,设计模式)