springmvc定制REST风格 以及 与JSR303 Bean校验整合
springmvc定制REST风格 以及 与JSR303 Bean校验整合
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 中的字段的值进行验证。
Bean validation 下载地址 : http://download.oracle测试数据/otndocs/jcp/bean_validation-1_1_0_cr1-pfd-spec/index.html
实例演示
实体类
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 : 苏若年 <a href="mailto:DennisIT@163测试数据">发送邮件</a>
*
* @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 文件
<? xml version="1.0" encoding="UTF-8" ?>
< web-app version ="2.5"
xmlns ="http://java.sun测试数据/xml/ns/javaee"
xmlns:xsi ="http://HdhCmsTestw3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://java.sun测试数据/xml/ns/javaee
http://java.sun测试数据/xml/ns/javaee/web-app_2_5.xsd" >
<!-- 配置字符过滤器,必须在OpenSessionInViewerFilter之前 -->
< filter >
< filter-name > CharacterFilter </ 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 >
</ filter >
< filter-mapping >
< filter-name > CharacterFilter </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >
< servlet >
< servlet-name > dispatcher </ servlet-name > <!-- 此处用的是dispacter,所以同目录下的想xml文件名应该为dispacter-servlet.xml -->
< servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > dispatcher </ servlet-name >
< url-pattern > / </ url-pattern >
</ servlet-mapping >
< welcome-file-list >
< welcome-file > index.jsp </ welcome-file >
</ welcome-file-list >
</ web-app >
dispatcher-servlet.xml
<? xml version="1.0" encoding="UTF-8" ?>
< beans xmlns ="http://HdhCmsTestspringframework.org/schema/beans"
xmlns:aop ="http://HdhCmsTestspringframework.org/schema/aop"
xmlns:context ="http://HdhCmsTestspringframework.org/schema/context"
xmlns:mvc ="http://HdhCmsTestspringframework.org/schema/mvc"
xmlns:tx ="http://HdhCmsTestspringframework.org/schema/tx"
xmlns:xsi ="http://HdhCmsTestw3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://HdhCmsTestspringframework.org/schema/aop
http://HdhCmsTestspringframework.org/schema/aop/spring-aop-3.0.xsd
http://HdhCmsTestspringframework.org/schema/beans
http://HdhCmsTestspringframework.org/schema/beans/spring-beans-3.0.xsd
http://HdhCmsTestspringframework.org/schema/context
http://HdhCmsTestspringframework.org/schema/context/spring-context-3.0.xsd
http://HdhCmsTestspringframework.org/schema/mvc
http://HdhCmsTestspringframework.org/schema/mvc/spring-mvc-3.0.xsd
http://HdhCmsTestspringframework.org/schema/tx
http://HdhCmsTestspringframework.org/schema/tx/spring-tx-3.0.xsd
" >
<!--
指定使用注解方式配置,配置自动扫描的包名,
base-package指定自己应用中控制器所在的包目录
<context:component-scan/> 扫描指定的包中的类上的注解,常用的注解有:
@Controller 声明Action组件
@Service 声明Service组件
@Service("myMovieLister")
@Repository 声明Dao组件
@Component 泛指组件, 当不好归类时.
@RequestMapping("/menu") 请求映射
@Resource用于注入,( j2ee提供的 ) 默认按名称装配,
@Resource(name="beanName")
@Autowired用于注入,(srping提供的) 默认按类型装配
@Transactional(rollbackFor={Exception.class}) 事务管理
@ResponseBody @Scope("prototype")设定bean的作用域
-->
< context:component-scan base-package ="com.springmvc.demo.controller" />
<!-- 默认的注解映射的支持 -->
<!-- JSR-303 support will be detected on classpath and enabled automatically -->
< mvc:annotation-driven />
<!-- http://static.springsource.org/spring/docs/3.0.0.RC3/reference/html/ch05s07.html --> <!-- 配置视图解析器 -->
< bean class ="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!-- 配置视图层 使用jstl标签 -->
< property name ="viewClass" value ="org.springframework.web.servlet.view.JstlView" />
<!-- 定义视图前缀格式 -->
< property name ="prefix" value ="/WEB-INF/jsp/" />
<!-- 定义视图后缀格式 -->
< property name ="suffix" value =".jsp" />
</ bean >
</ beans >
控制器
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 : 苏若年 <a href="mailto:DennisIT@163测试数据">发送邮件</a>
*
* @since : 1.0 创建时间: 2013-4-13 下午06:21:34
*
* TODO :
*
*/
@Controller
@RequestMapping(value ="/user" )
public class UserController {
private Map<String,User> users = new HashMap<String, User> ();
public UserController(){
users.put( "suruonian", new User("suruonian","suruonian","suruonian@demo测试数据" ));
users.put( "linyunxi", new User("linyunxi","linyunxi","linyunxi@163测试数据" ));
users.put( "dennisit", new User("dennisit","dennisit","dennisit@163测试数据" ));
users.put( "moshaobai", new User("moshaobai","bing_he","1325103287@qq测试数据" ));
}
/**
*
*
* 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请求,执行该方法 <a href="add">添加</a>
* @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
View Code
add.jsp
View Code
detail.jsp
View Code
update.jsp
View Code
转载请注明出处:[ http://HdhCmsTestcnblogs测试数据/dennisit/archive/2013/04/13/3019391.htm l ]
热爱生活,热爱Coding,敢于挑战,用于探索 ...
分类: JavaEE
标签: springmvc , rest , jsr303
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于springmvc定制REST风格 以及 与JSR303 Bean校验整合的详细内容...