1、简介
BeanUtils工具包是由Apache公司所开发,提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。
我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。
如果我们使用BeanUtils工具包就可以很方便的对JavaBean类能够进行简便的操作。
使用与依赖包:commons-beanutils-1.9.3.jar ;commons-logging-1.2.jar
2、BeanUtils工具对JavaBean类的操作
① BeanUtils 可以便于对javaBean的属性进行赋值。
② BeanUtils 可以便于对javaBean的对象进行赋值。
③ BeanUtils 可以将一个MAP集合的数据拷贝到一个javabean对象中。
3、BeanUtils常用方法
方法名 | 返回值 | 说明 |
copyProperties(Object dest,Object orig) | void | 把orig中的值copy到dest中 |
describe(Object bean) | Map | 把Bean的属性值放入一个Map里面 |
populate(Object bean,Map properties) | void | 把properties里面的值放如bean中 |
setProperty(Object bean,String name,Object value) | void | 设置bean对象的名称为name的property的值为value |
getProperty(Object bean,String name) | String | 取得bean对象中名为name的属性的值 |
4、BeanUtils的使用
约定前提:参数名称必须要和JavaBean的属性名称保持一致。
1 public class User { 2 3 private int id; 4 private String username; 5 private String email; 6 private String password; 7 private String name; 8 private String phone; 9 private String address; 10 11 public User() { 12 super(); 13 } 14 15 public User(String username, String email, String password, String name, String phone, String address) { 16 super(); 17 this.username = username; 18 this.email = email; 19 this.password = password; 20 this.name = name; 21 this.phone = phone; 22 this.address = address; 23 } 24 25 public int getId() { 26 return id; 27 } 28 29 public void setId(int id) { 30 this.id = id; 31 } 32 33 public String getUsername() { 34 return username; 35 } 36 37 public void setUsername(String username) { 38 this.username = username; 39 } 40 41 public String getEmail() { 42 return email; 43 } 44 45 public void setEmail(String email) { 46 this.email = email; 47 } 48 49 public String getPassword() { 50 return password; 51 } 52 53 public void setPassword(String password) { 54 this.password = password; 55 } 56 57 public String getName() { 58 return name; 59 } 60 61 public void setName(String name) { 62 this.name = name; 63 } 64 65 public String getPhone() { 66 return phone; 67 } 68 69 public void setPhone(String phone) { 70 this.phone = phone; 71 } 72 73 public String getAddress() { 74 return address; 75 } 76 77 public void setAddress(String address) { 78 this.address = address; 79 } 80 81 @Override 82 public String toString() { 83 return "User [id=" + id + ", username=" + username + ", email=" + email + ", password=" + password + ", name=" 84 + name + ", phone=" + phone + ", address=" + address + "]"; 85 } 86 87 }
例如:用户注册,服务器端获取浏览器端提交的注册表单数据,然后将用户输入的注册信息持久化到数据库中。
浏览器端:表单中<input type="text" name="username">的name属性必须与JavaBean类的属性名一致。
1 <form action="${pageContext.request.contextPath }/user_register" 2 method="post"> 3 <div class="register-top-grid"> 4 <h3>注册新用户</h3> 5 <div class="input"> 6 <span>用户名 <label style="color: red;">*</label></span> 7 <input type="text" name="username" placeholder="请输入用户名" required="required"> 8 </div> 9 <div class="input"> 10 <span>邮箱 <label style="color: red;">*</label></span> 11 <input type="text" name="email" placeholder="请输入邮箱" required="required"> 12 </div> 13 <div class="input"> 14 <span>密码 <label style="color: red;">*</label></span> 15 <input type="text" name="password" placeholder="请输入密码" required="required"> 16 </div> 17 <div class="input"> 18 <span>收货人<label></label></span> 19 <input type="text" name="name" placeholder="请输入收货"> 20 </div> 21 <div class="input"> 22 <span>收货电话<label></label></span> 23 <input type="text" name="phone" placeholder="请输入收货电话"> 24 </div> 25 <div class="input"> 26 <span>收货地址<label></label></span> 27 <input type="text" name="address" placeholder="请输入收货地址"> 28 </div> 29 <div class="clearfix"></div> 30 </div> 31 <div class="register-but text-center"> 32 <input type="submit" value="提交"> 33 <div class="clearfix"></div> 34 </div> 35 </form>
服务器端:在不使用BeanUtils的情况下获取数据,每一条数据都进行获取并对每个属性逐个赋值;
通过这样的方法如果表单属性字段很多,达到了100、1000甚至更多,那我们不是要写100、1000行重复的代码了吗。谁都不愿意这样做。
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 4 // 构建User对象 5 User user = new User(); 6 7 // 获取请求中表单提交的数据 8 String username = request.getParameter("username"); 9 String email = request.getParameter("email"); 10 String password = request.getParameter("password"); 11 String name = request.getParameter("name"); 12 String phone = request.getParameter("phone"); 13 String address = request.getParameter("address"); 14 15 // 把获取到的数据赋值到user对象中 16 user.setUsername(username); 17 user.setEmail(email); 18 user.setPassword(password); 19 user.setName(name); 20 user.setPhone(phone); 21 user.setAddress(address); 22 23 // 将user对象持久化到数据库中 24 uService.register(username); 25 request.setAttribute("msg", "注册成功,请登录"); 26 request.getRequestDispatcher("/user_login.jsp").forward(request, response); 27 }
而我们使用 BeanUtils.copyProperties() 方法以后,代码量大大的减少,而且整体程序看着也简洁明朗,代码如下:
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 4 // 构建User对象 5 User user = new User(); 6 7 try { 8 // 获取表单请求中的Map集合,将集合中的数据copy到user对象中;所提交请求中的请求参数和请求参数值的映射关系。 9 BeanUtils.copyProperties(user, request.getParameterMap()); 10 } catch (IllegalAccessException e) { 11 e.printStackTrace(); 12 } catch (InvocationTargetException e) { 13 e.printStackTrace(); 14 } 15 16 // 将user对象持久化到数据库中 17 uService.register(user); 18 request.setAttribute("msg", "注册成功,请登录"); 19 request.getRequestDispatcher("/user_login.jsp").forward(request, response); 20 21 }
注:如果User和表单之间存在名称不相同的属性,则BeanUtils不对这些属性进行处理。