springside筆記二
1.web層(action)
StrutsAction類:
java 程式碼
- public class StrutsAction extends DispatchAction
繼承了分發Action類,在StrutsAction裡還做了幾個重要處理
A:設定Struts 中數字<->字串轉換
B:Object和Form之間的copyProperties
C:Save出錯的Message
StrutsEntityAction類:這個類是供具體的實體Action來繼承的
java 程式碼
- public abstract class StrutsEntityAction < T, M extends EntityDao < T > >
- extends StrutsAction implements InitializingBean
因為implements了InitializingBean類,所以需要實現方法:afterPropertiesSet
java 程式碼
- /**
- * Init回撥函式,初始化一系列泛型引數.
- */
- public void afterPropertiesSet() {
- // 根據T,反射獲得entityClass
- entityClass = GenericsUtils.getSuperClassGenricType(getClass());
- // 根據M,反射獲得符合M型別的manager
- List < Field > fields = BeanUtils.getFieldsByType(this, GenericsUtils.getSuperClassGenricType(getClass(), 1));
- Assert.isTrue(fields.size() == 1, "subclass's has not only one entity manager property.");
- try {
- entityManager = (M) BeanUtils.forceGetProperty(this, fields.get(0).getName());
- Assert.notNull(entityManager, "subclass not inject manager to action sucessful.");
- } catch (Exception e) {
- ReflectionUtils.handleReflectionException(e);
- }
- // 反射獲得entity的主鍵型別
- try {
- idName = entityManager.getIdName(entityClass);
- idClass = BeanUtils.getPropertyType(entityClass, idName);
- } catch (Exception e) {
- ReflectionUtils.handleReflectionException(e);
- }
- }
具體看下上面這段程式碼:
java 程式碼
- entityClass = GenericsUtils.getSuperClassGenricType(getClass());
這個和HibernateEntityDao里根據T,運用反射獲得實際繫結entityClass(實體類)是一樣的。
java 程式碼
- List < Field > fields = BeanUtils.getFieldsByType(this, GenericsUtils.getSuperClassGenricType(getClass(), 1));
這句程式碼裡GenericsUtils.getSuperClassGenricType(getClass(), 1)獲得實體Action傳遞過來的第2個泛型引數.比如:UserManager.class
然後又呼叫BeanUtils裡的getFieldsByType方法。該方法具體為:
java 程式碼
- /**
- * 按Filed變數的型別取得Field變數列表.
- */
- public static List< Field > getFieldsByType(Object object, Class type) {
- List< Field > list = new ArrayList< Field >();
- Field[] fields = object.getClass().getDeclaredFields();
- for (Field field : fields) {
- System.out.println(field.getType() + ":" + field.getName());
- if (field.getType().isAssignableFrom(type)) {
- list.add(field);
- }
- }
- return list;
- }
這段程式碼也就是根據傳遞進來的Class型別,獲得用該型別定義的變數的列表List,也就是在具體的某個實體Action裡,用該實體Manager定義的具體例項變數的一個List,比如:UserAction裡用UserManager定義的例項變數的列表
繼續看StrutsEntityAction裡的afterPropertiesSet方法
java 程式碼
- entityManager = ( M ) BeanUtils.forceGetProperty(this, fields.get(0).getName());
java 程式碼
- /**
- * 暴力獲取物件變數值,忽略private,protected修飾符的限制.
- *
- * @throws NoSuchFieldException 如果沒有該Field時丟擲.
- */
- public static Object forceGetProperty(Object object, String propertyName) throws NoSuchFieldException {
- Assert.notNull(object);
- Assert.hasText(propertyName);
- Field field = getDeclaredField(object, propertyName);
- boolean accessible = field.isAccessible();
- field.setAccessible(true);
- Object result = null;
- try {
- result = field.get(object);
- } catch (IllegalAccessException e) {
- logger.info("error wont' happen");
- }
- field.setAccessible(accessible);
- return result;
- }
相關文章
- springside筆記一SpringIDE筆記
- 筆記二(JavaWeb)筆記JavaWeb
- RUST 筆記(二)Rust筆記
- Spring筆記二Spring筆記
- 【工具】git筆記(二)Git筆記
- 英國史筆記(二)筆記
- 軟考筆記二筆記
- springside是什麼?SpringIDE
- Java學習筆記記錄(二)Java筆記
- ANFIS學習筆記(二)筆記
- activiti學習筆記二筆記
- Java筆記-Java反射(二)Java筆記反射
- Flutter 高效自學筆記(二)Flutter筆記
- Typescript學習筆記(二)TypeScript筆記
- JavaScript學習筆記(二)JavaScript筆記
- 『筆記』二分圖筆記
- React 學習筆記【二】React筆記
- goLang學習筆記(二)Golang筆記
- vue學習筆記二Vue筆記
- Kotlin Coroutines 筆記 (二)Kotlin筆記
- Linux筆記 篇(二)Linux筆記
- Docker筆記二之容器Docker筆記
- vue學習筆記(二)Vue筆記
- 科二學習筆記筆記
- koa原始碼筆記(二)原始碼筆記
- jQuery 學習筆記(二)jQuery筆記
- ChartDirector應用筆記(二)筆記
- git學習筆記(二)Git筆記
- Java學習筆記二Java筆記
- EJB基礎筆記(二)筆記
- 基督教筆記(二)筆記
- TS學習筆記(二)筆記
- python學習筆記(二)Python筆記
- vue + typescript 踩坑筆記(二)VueTypeScript筆記
- TensorFlow學習筆記(二)筆記
- InnoDB文件筆記(二)—— Redo Log筆記
- TS學習筆記(二):介面筆記
- github--學習筆記(二)Github筆記