REST风格与传统风格比较
查询用户
传统方式 /user_detail?id=120
Rest风格 /user/120
删除用户
传统方式 /user_delete?id=123
Rest风格 /user/123/delete
修改用户
传统方式 /user_update?id=123
Rest风格 /user/123/update
获取列表
传统方式 /user_list
Rest风格 /users 或者 /user/users
JSR303
JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator。
此实现与Hibernate ORM 没有任何关系。JSR 303 用于对Java Bean 中的字段的值进行验证。
实例演示
实体类
[java] view plaincopyprint?
package com.springmvc.demo.entity;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
/**
*
* User.java
*
* @version : 1.1
*
* @author : 苏若年
发送邮件
*
* @since : 1.0 创建时间: 2013-4-13 上午10:42:20
*
* TODO :
*
*/
public class User {
@NotNull(message="用户名不能为空")
private String username;
@NotNull(message="密码不能为空")
@Size(min=4,max=10,message="密码长度必须在4-10的长度")
private String password;
@Pattern(regexp="^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+.[a-zA-Z]{2,5}?((.cn)|(.jp))?$", message="邮箱格式不正确")
private String email;
public User(){
}
public User(String username, String password, String email) {
super();
this.username = username;
this.password = password;
this.email = email;
}
//getter and setter
}
web.xml文件
[java] view plaincopyprint?
xmlns=""
xmlns:xsi=""
xsi:schemaLocation="
/web-app_2_5.xsd">
CharacterFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
CharacterFilter
/*
dispatcher
org.springframework.web.servlet.DispatcherServlet
dispatcher
/
index.jsp
dispatcher-servlet.xml
[java] view plaincopyprint?
xmlns:aop=""
xmlns:context=""
xmlns:mvc=""
xmlns:tx=""
xmlns:xsi=""
xsi:schemaLocation="
/spring-aop-3.0.xsd
/spring-beans-3.0.xsd
/spring-context-3.0.xsd
/spring-mvc-3.0.xsd
/spring-tx-3.0.xsd
">
控制器
[java] view plaincopyprint?
package com.springmvc.demo.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.springmvc.demo.entity.User;
/**
*
* UserController.java
*
* @version : 1.1
*
* @author : 苏若年
发送邮件
*
* @since : 1.0 创建时间: 2013-4-13 下午06:21:34
*
* TODO :
*
*/
@Controller
@RequestMapping(value="/user")
public class UserController {
private Map
users = new HashMap();
public UserController(){
users.put("suruonian", new User("suruonian","suruonian","suruonian@demo.com"));
users.put("linyunxi", new User("linyunxi","linyunxi","linyunxi@163.com"));
users.put("dennisit", new User("dennisit","dennisit","dennisit@163.com"));
users.put("moshaobai", new User("moshaobai","bing_he","1325103287@qq.com"));
}
/**
*
*
* Description: 构建REST风格 /user/users的GET请求时才执行该方法的操作RequestMethod.GET表示
* 只处理GET请求
* @param model 用于上下文参数传递
* @return 视图页面 user/list 结合user-servlet.xml中配置的视图模型匹配视图页面
* 实例中方法返回表示/WEB-INF/jsp/user/list.jsp页面
*
*/
@RequestMapping(value="/users",method=RequestMethod.GET)
public String list(Model model){
model.addAttribute("users", users);
return "user/list";
}
/**
*
*
* Description: 链接到页面时是GET请求,执行该方法 添加
* @return 返回给用户添加页面
*
*/
@RequestMapping(value="/add",method=RequestMethod.GET)
public String add(Model model){
model.addAttribute("user",new User()); //开启ModelDriven 跳转到增加页面时使用该Model
return "user/add";
}
/**
*
* Description: 添加操作 请求/user/add form表单提交时使用的post请求调用该方法
* @param user 添加的User对象
* @param br 验证绑定
* @return 视图页面
* 添加成功 请求重定向redirect:/user/users 表示执行操作结束后请求定向为/user/users
* 添加失败 页面转到/WEB-INF/jsp/add.jsp 这里有验证绑定,将在视图页面展示验证错误信息
*
*/
@RequestMapping(value="/add",method=RequestMethod.POST)
public String add(@Validated User user,BindingResult br){
//需要说明的是BindingResult形参一定要跟@Validated修饰的形参后面写验证
if(br.hasErrors()){ //如果有错误,直接跳转到添加视图
return "user/add"; //服务端跳转 该跳转会自动在前面增加 forward
}
users.put(user.getUsername(), user);
return "redirect:/user/users"; //客户端跳转 使用 redirect
}
/**
*
*
* Description: 查看操作 根据用户名查看 REST风格: /detail/查看的用户名
* @param username 带查看的用户名@PathVariable 修饰username 表示用请求路径中的username作为 形参
* @param model 携带数据的Model
* @return 视图页面 /WEB-INF/jsp/user/detail.jsp页面
*
*/
@RequestMapping(value="/{username}",method=RequestMethod.GET)
public String detail(@PathVariable String username, Model model){
System.out.println("获取到传入的参数值为:" + username);
model.addAttribute("user", users.get(username));
return "user/detail";
}
/**
*
*
* Description: 预更新操作根据用户名查询用户信息 然后数据交给携带体 展示到视图 REST风格: /更新的用户的用户名/update
* @param username @PathVariable修饰 表示形参同URL中的请求参数
* @param model 携带数据的Model
* @return 视图页面/WEB-INF/jsp/user/update页面
*
*/
@RequestMapping(value="/{username}/update",method=RequestMethod.GET)
public String update(@PathVariable String username, Model model){
System.out.println("获取到传入的参数值为:" + username);
model.addAttribute(users.get(username));
return "user/update";
}
/**
*
*
* Description: 真正更新的操作 REST风格: /更新的用户的用户名/update
* @param username 带更新的用户的用户名
* @param user 带更新的用户的信息对象 @Validated修饰表示信息需要被验证
* @param br 验证信息绑定对象 必须紧跟在待验证的信息形参后面
* @return 视图页面
* 更新成功 请求重定向 /user/users
* 更新失败 转到/WEB-INF/jsp/user/update.jsp页面
*
*/
@RequestMapping(value="/{username}/update",method=RequestMethod.POST)
public String update(@PathVariable String username, @Validated User user,BindingResult br){
if(br.hasErrors()){ //如果有错误,直接跳转到修改视图
return "user/update";
}
users.put(username, user);
return "redirect:/user/users";
}
/**
*
*
* Description: 删除操作 REST风格:/删除的用户名/delete
* @param username 删除的用户名 类似表主键,可以标记到整个记录信息
* @return 视图页面
* 请求重定向到 /user/users
*
*/
@RequestMapping(value="/{username}/delete",method=RequestMethod.GET)
public String delete(@PathVariable String username){
System.out.println("获取到传入的参数值为:" + username);
users.remove(username);
return "redirect:/user/users";
}
}
视图层/WEB-INF/jsp/user/下的list.jsp,add.jsp,detail.jsp,update.jsp文件
list.jsp
[html] view plaincopyprint?
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
%>
<%=basePath%>
用户信息展示 添加信息
姓名: ${usermap.value.username}
密码: ${usermap.value.password }
邮箱: ${usermap.value.email }
修改
删除
add.jsp
[html] view plaincopyprint?
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="sf" uri="" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%=basePath%>
增加用户信息页面
姓名:
密码:
邮箱:
detail.jsp
[java] view plaincopyprint?
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
%>
<%=basePath%>
用户详细信息页面
姓名: ${user.username}
密码: ${user.password }
邮箱: ${user.email }
返回用户列表
update.jsp
[html] view plaincopyprint?
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="sf" uri="" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
%>
<%=basePath%>
修改用户信息页面
姓名:
密码:
邮箱:
阅读(1868) | 评论(0) | 转发(0) |