JavaBean規範
1. JavaBean規範
- 類必須是具體的和公共的。
- 有無參的構造方法。
- 可能有getter和setter方法。
2. JavaBean的反(自)省機制
我們拿到一個JavaBean,就可以拿到它的可讀和可寫的屬性 或者屬性名,字段。一般來說我們需要拿到可讀可寫屬性;有個這些屬性,可以通過反射去完成讀寫功能。可以通過Introspector類可以拿到一個BeanInfo對象。
在JavaBean上進行內省,瞭解其所有屬性、公開的方法和事件。
static BeanInfo getBeanInfo(Class<?> beanClass)
- BeanInfo類
MethodDescriptor[] getMethodDescriptors() 獲取bean中所有的方法。
PropertyDescriptor[] getPropertyDescriptors() 獲取bean中所有的字段(包括class字段)。
- 應用
//獲取到bean對象信息
BeanInfo beanInfo = Introspector.getBeanInfo(Student.class);
//獲取到bean的字段
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
//打印每個bean的字段信息
System.out.println(propertyDescriptor);
//獲取每個字段對應的讀的方法
System.out.println(propertyDescriptor.getReadMethod());
//獲取每個字段對應的寫的方法
System.out.println(propertyDescriptor.getWriteMethod());
}
3. BeanUtils工具類
- 需要導入的包
commons-beanutils-1.9.2.jar
commons-logging-1.2.jar
commons-collections-3.1.jar
- maven依賴
<!--拷貝beanutil屬性的包-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
beanutils類主要用於對象的屬性拷貝:1、同一個類之間的屬性拷貝;2、不同類之間屬性拷貝;3、把Map裏面的元素拷貝到對象中去。
基於這種優勢,在servlet中,request攜帶前臺的數據封裝在一個map集合中,我們可以將這個map集合中的數據拷貝到JavaBean對象中,因此我們可以設計一個工具類來專門實現對象屬性的拷貝工作。
- 自定義的BeanUtil工具類
import org.apache.commons.beanutils.BeanUtils;//導入beanutils類
import javax.servlet.http.HttpServletRequest;
public class BeanUtil {
//通過泛型指定將要new的bean類型
public static <T> T getBean(HttpServletRequest request,Class<T> cls){
T t = null;
try {
//創建一個指定類型的bean對象
t = cls.newInstance();
//將request對象攜帶的數據拷貝到bean對象中
BeanUtils.copyProperties(t,request.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}
- servlet中的使用
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user = BeanUtil.getBean(req, User.class);
System.out.println(user);
}
}