網頁

2014年2月10日 星期一

Commons Beanutils使用setProperty()

有時不能只依靠getter/setter操作bean,如:需要名字動態取得的,或是訪問bean內的field,甚至是集合或陣列內bean的field,利用反射機制對bean的field進行處理,這時候就需要Apache Commons Beanutils來協助處理。





  1. 官網下載: http://commons.apache.org/proper/commons-beanutils/
  2. commons-beanutils-1.8.3.jar導入到專案中。
  3. 或使用 Maven Reponsitory,選擇版本後,在 pom.xml貼上:
<dependency>
 <groupId>commons-beanutils</groupId>
 <artifactId>commons-beanutils</artifactId>
 <version>1.9.1</version>
</dependency>






Mix建立了1個bean:Magazine,只有3個屬性,同時利用ToStringBuilder覆寫toString(),以利console印出,快速查看物件field值。

  1. id:唯一識別碼。
  2. name:名稱。
  3. price:價格。

package org.openyu.java.commons.beanutils;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * The Class Magazine.
 */
public class Magazine {
 /** The id. */
 private long id;

 /** The name. */
 private String name;

 /** The price. */
 private int price;

 /**
  * Instantiates a new Magazine.
  */
 public Magazine() {
 }

 /**
  * Gets the id.
  *
  * @return the id
  */
 public long getId() {
  return id;
 }

 /**
  * Sets the id.
  *
  * @param id
  *            the new id
  */
 public void setId(long id) {
  this.id = id;
 }

 /**
  * Gets the name.
  *
  * @return the name
  */
 public String getName() {
  return name;
 }

 /**
  * Sets the name.
  *
  * @param name
  *            the new name
  */
 public void setName(String name) {
  this.name = name;
 }

 /**
  * Gets the price.
  *
  * @return the price
  */
 public int getPrice() {
  return price;
 }

 /**
  * Sets the price.
  *
  * @param price
  *            the new price
  */
 public void setPrice(int price) {
  this.price = price;
 }

 /*
  * (non-Javadoc)
  *
  * @see java.lang.Object#toString()
  */
 @Override
 public String toString() {
  // return new ToStringBuilder(this)
  return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
    .append("id", id)
    .append("name", name)
    .append("price", price)
    .toString();
 }
}






setProperty()

Mix建構1個Magazine的實例,將值指派給特定名稱的field。

package org.openyu.java.commons.beanutils;

import static org.junit.Assert.*;

import org.apache.commons.beanutils.BeanUtils;
import org.junit.Test;

public class BeanutilsTest {

 @Test
 public void setProperty() throws Exception {
  Magazine magazine = new Magazine();

  BeanUtils.setProperty(magazine, "id", 1L);
  BeanUtils.setProperty(magazine, "name", "OpenYu");
  BeanUtils.setProperty(magazine, "price", 1000);

  // 不存在field,不會拋出exception
  BeanUtils.setProperty(magazine, "notExist", 1000);

  System.out.println(magazine);
  assertEquals(1L, magazine.getId());
  assertEquals("OpenYu", magazine.getName());
  assertEquals(1000, magazine.getPrice());
 }
}



console查看其結果。

log4j:WARN No appenders could be found for logger (org.apache.commons.beanutils.converters.BooleanConverter).
log4j:WARN Please initialize the log4j system properly.
Magazine[id=1,name=OpenYu,price=1000]



當出現log4j:WARN No appenders...,是因為BooleanConverter,有用到Log4j,但卻找不到log4j.properties的設定檔,將它放在src或test的root下就可以了。

log4j.properties

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n











Mix覺得,在建構網站寫網頁,從前端傳送String給後端時,要指派到bean上的field,Commons BeanutilssetProperty()這個method就比較常用,如:HTML上的URL參數值,要直接塞值給後端的bean。



沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...