一、简介
RESTful(即Representational State Transfer的缩写)其实是一个开发理念,是对http的很好的诠释。RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
下面通过实现用户的crud来对RESTful的url格式进行学习
二、RESTful的crud应用
1、首先需要配置web.xml的前端控制器拦截方式:
<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:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- / RESTful 拦截路径的配置-->
<url-pattern>/</url-pattern>
</servlet-mapping>
并且需要在springmvc.xml配置静态资源解析方法:
<!--
default-servlet-handler 将在 SpringMVC 上下文中定义一个DefaultServletHttpRequestHandler,它会对进入 DispatcherServlet 的请求进行筛查, 如果发现是没有经过映射的请求, 就将该请求交由 WEB 应用服务器默认的 Servlet 处理. 如果不是静态资源的请求,才由 DispatcherServlet 继续处理。 一般 WEB 应用服务器默认的 Servlet 的名称都是 default.若所使用的 WEB 服务器的默认 Servlet 名称不是 default,则需要通过 default-servlet-name 属性显式指定
-->
<!-- 静态资源解析 -->
<mvc:default-servlet-handler/>
2、pojo类
package top.einino.pojo;
public class User {
private Integer id;
private String username;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
3、controller类,完成对所有用户的查询操作
@RequestMapping("/users")
public String users(Model model){
List<User> users = new ArrayList<User>();
User user1 = new User();
user1.setId(1);
user1.setUsername("李四");
User user2 = new User();
user2.setId(2);
user2.setUsername("王五");
users.add(user1);
users.add(user2);
model.addAttribute("users", users);
return "user/userList";
}
显示界面userList.jsp:
所有用户:
<table border="1">
<tr>
<td>用户id</td>
<td>用户姓名</td>
<td>用户操作</td>
</tr>
<c:forEach items="${users }" var="user">
<tr>
<td>${user.id }</td>
<td>${user.username }</td>
<td>
<a href="javascript:void(0)" οnclick="window.open('${pageContext.request.contextPath }/user/${user.id }')">修改</a>
<a href="${pageContext.request.contextPath}/user/${user.id}" class="delete">删除</a>
</td>
</tr>
</c:forEach>
</table>
4、controller类,完成对用户的保存操作
//转到添加用户界面
@RequestMapping("/addUser")
public String addUser(){
return "user/addUser";
}
//RESTFul的保存用户形式
@RequestMapping(value="/user",method=RequestMethod.POST)
public String save(User user){
System.out.println(user.getId());
System.out.println(user.getUsername());
return "redirect:/users";
}
显示界面
userList.jsp:
<input type="button" value="添加用户" οnclick="addUser()"/></br>
<script type="text/javascript">
function addUser(){
window.location.href="${pageContext.request.contextPath}/addUser";
}
</script>
addUser.jsp:
<form action="${pageContext.request.contextPath }/user" method="post">
用户id: <input type="text" name="id"/></br>
用户姓名: <input type="text" name="username"/></br>
<input type="submit" value="添加 "/>
</form>
5、controller类,完成对用户的删除操作
a、 //RESTful的删除用户形式
@RequestMapping(value="/user/{id}",method=RequestMethod.DELETE)
public String deleteUser(@PathVariable("id") Integer id){
System.out.println(id);
//重定向所有用户列表
return "redirect:/users";
}
b、userList.jsp
<a href="${pageContext.request.contextPath}/user/${user.id}" class="delete">删除</a>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script>
<script type="text/javascript">
$(function(){
//为删除链接添加按钮事件
$(".delete").click(function(){
if(window.confirm("确定要删除该用户么?")){
//获取到删除路径
var href = $(this).attr("href");
//更改deleteform的请求路径并完成提交
$("form").attr("action", href).submit();
return false;
}
});
});
</script>
<form action="" method="POST">
<!--将post请求转换成delete请求-->
<input type="hidden" name="_method" value="DELETE"/>
</form>
c、需要在web.xml中配置将post请求转换成delete和put,如果请求时有隐藏域为_method,就会将post转换成相应的请求方式
<!-- 将post请求转换为put、delete请求 -->
<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>
6、controller类,完成用户修改操作
a、显示操作
//显示修改的用户信息
@RequestMapping(value="/user/{id}", method=RequestMethod.GET)
public String toEdit(@PathVariable("id") Integer id, Model model){
User user = new User();
user.setId(id);
user.setUsername("李四");
model.addAttribute("user", user);
return "user/addUser";
}
c、修改addUser.jsp界面,使之与修改界面共用
<form action="${pageContext.request.contextPath }/user" method="POST">
用户id: <input type="text" name="id" value="${user.id }"/></br>
用户姓名: <input type="text" name="username" value="${user.username }"/></br>
<c:if test="${user.id!=null }">
<input type="hidden" name="_method" value="PUT"/>
<input type="submit" value="修改 "/>
</c:if>
<c:if test="${user.id==null }">
<input type="submit" value="添加 "/>
</c:if>
</form>
d、controller类,完成修改操作
//修改用户
@RequestMapping(value="/user", method=RequestMethod.PUT)
public String editUser(User user){
System.out.println(user.getId());
System.out.println(user.getUsername());
return "redirect:/users";
}
三、小结
本博文介绍了RESTful的基本概括,并介绍了RESTful在springmvc的使用。通过一个小例子完成对RESTful四种请求方式的学习。
如果有疑问或者对本博文有何看法或建议或有问题的,欢迎评论,恳请指正!