200707月份工作记录

20070704
----------------------------
JSF中的javaBean的数据成员为一个javaBean的时候,记住一定要初始化!


20070706
----------------------------
java包的结构,自己的理解:包里的函数靠接口(interface)提供给外界信息,proxy是对interface的实现,但不是具体的实现,而且做一些初始化工作,如消息预处理。
Implement是真正对接口的实现。

 ____|interface|_______
|            |  接口   |                 |
|  『 代理proxy 』              |
|  『 实现Impl  』              |
|                                            |
|___________________|

ods元数据管理平台的技术架构为如下:

视图采用 jsf和tiles框架---->jsp                                  |
                                                                 |-> 视图层采用JSF和tiles框架
支撑页面为BackingBean  ---->BB 获取页面属性,验证信息,调用 UCC  |

用例层 为 UserUseCase  ---->UCC 为BB和Bs之间的桥梁(此处不是很理解|
                            到底UCC起到什么作用,难道是所谓的    |-> 业务层采用spring框架
                            Proxy?),调用BS                      |
                                                                 |
业务逻辑层BussinessService->BS 具体的业务逻辑,调用DAO           |
                                                                                
数据存储层DataAccessObject->DAO 负责与数据库打交道并调用BO       |
                                                                 |-> 视图层采用hibernate框架
业务实体类BussinessObject-->Bo 为业务实体类,它对应于数据库表    |

20070707
----------------------------
面向对象的编程就是面向接口的编程,接口一定要慎重理解!
补充一下漏记的部分,javadoc命令可以根据你的注视自动生成文档,native2ascii命令可以将本地文字转换成asc值。


20070713
----------------------------
spring 的Ioc 和Aoc的理解:

IoC即控制反转,其实就是DI依赖注入,它的意思就是将对象的生成由Bean本事管理转到由Spring 来统一管理,
即在Bean中不用再写Object ob=new Object();这样的语句,由spring 帮bean生成并注入到bean中,即你需要的时候它就给你注入进去,注入
依靠两种方式,即setter和构造方法注入。目前我这个项目基本都是用setter方法注入。即你bean中的对象属性想要由spring给你注入,首先
必须写好getter和setter方法。然后在spring 的XML配置文件中配上要注入的属性对象,如下

xml 代码
  1. <bean id="pubStruChangeQueryService" class="cn.ccb.metadata.app.bs.structure.PubStruChangeQueryService" >  
  2.      <property name="dao" >  
  3.       <ref bean="baseDAO" />  
  4.      </property>     
  5.      <property name="service" >  
  6.       <ref bean="structureService" />  
  7.      </property>        
  8. </bean>  


以上property即属性,你bean的属性,ref bean="xx",指属性所对应的bean,该bean中的class指定了类路径。

对Aoc的理解竟停留在字面理解上,实际操作还有待日后去实践。
Aoc即面向方面的编程,其思想就是要把需要重复写的代码作为一个切面。把它抽取出来,实现代码间的模块化?自己的理解。
有个例子即,你在写jdbc的时候,要反复写查找驱动,得到一个连接,写SQL语句,执行语句,然后释放连接。等等,Aoc就把
这个繁琐的重复动作给抽取出来,你只要关注写SQL就好了,还有如事务,日志等等。。这些东西也要配在spring的XML文件中

xml 代码
  1. <bean id="codeManageUCCProxy"  
  2.           class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  3.         <property name="transactionManager">  
  4.             <ref bean="metadataTransactionManager"/>  
  5.         </property>  
  6.         <property name="proxyInterfaces">  
  7.             <list>  
  8.                 <value>cn.ccb.metadata.app.ucc.systemCode.ICodeManageUcc</value>  
  9.             </list>  
  10.         </property>  
  11.         <property name="target">  
  12.             <ref local="codeManageUcc"/>  
  13.         </property>  
  14.         <property name="transactionAttributes">  
  15.             <props>  
  16.                 <prop key="insert*">PROPAGATION_REQUIRES_NEW,-RollbackableBizException</prop>  
  17.                 <prop key="update*">PROPAGATION_REQUIRES_NEW,-RollbackableBizException</prop>  
  18.                 <prop key="delete*">PROPAGATION_REQUIRES_NEW,-RollbackableBizException</prop>  
  19.                 <prop key="query*">PROPAGATION_REQUIRES_NEW,readOnly</prop>  
  20.                 <prop key="save*">PROPAGATION_REQUIRES_NEW,-RollbackableBizException</prop>  
  21.             </props>  
  22.         </property>  
  23.     </bean>  

以上我抽出的配置是对事务的控制。prop key="xx*" 还支持通配符定义了做这些函数动作的时候,就调用这个事务控制。


今天还了解了一下AJAX技术(Asynchronous JavaScript and XML)异步的页面刷新技术,当一个页面展现给客户的时候,需要更新页面某个地方的时候
不需要从服务器中把这个页面整个传过来,只需将要更新的部分传过来即可。
这个东西以前有做过,不过不是用它的包,但是做法应该是类似的,就是用xml做传输数据的载体。这个东西还是很好的,加快web的更新浏览速度。用人家
的专门的框架做应该会更好,不过java框架也太他妈多了,做java程序员真命苦,天天要update自己的知识,不然又落后了。


20070717
----------------------------
今天搞了一天搞定两个问题。
第一个问题:不同类名相同属性的pojo类 对象之间的拷贝。虽然两个类的属性完全一样但是不能用 a=b的方式,或者类型强制转换会报ClassCastException的异常。
看似简单的问题,却要写一个转换函数才能实现。
后来用了java的反射机制写了一个pojo类属性的拷贝函数。该函数由网上载的。

java 代码
  1. public Object CopyBo(Object obj1, Object obj2) throws Exception {   
  2.   Method[] method1 = obj1.getClass().getMethods();   
  3.   Method[] method2 = obj2.getClass().getMethods();   
  4.   String methodName1;   
  5.   String methodFix1;   
  6.   String methodName2;   
  7.   String methodFix2;   
  8.   for (int i = 0; i < method1.length; i++) {   
  9.    methodName1 = method1[i].getName();   
  10.    methodFix1 = methodName1.substring(3, methodName1.length());   
  11.    if (methodName1.startsWith("get")) {   
  12.     for (int j = 0; j < method2.length; j++) {   
  13.      methodName2 = method2[j].getName();   
  14.      methodFix2 = methodName2.substring(3, methodName2.length());   
  15.      if (methodName2.startsWith("set")) {   
  16.       if (methodFix2.equals(methodFix1)) {   
  17.        Object[] objs1 = new Object[0];   
  18.        Object[] objs2 = new Object[1];   
  19.        objs2[0] = method1[i].invoke(obj1, objs1);// 激活obj1的相应的get的方法,objs1数组存放调用该方法的参数,此例中没有参数,该数组的长度为0   
  20.        method2[j].invoke(obj2, objs2);// 激活obj2的相应的set的方法,objs2数组存放调用该方法的参数   
  21.        continue;   
  22.       }   
  23.      }   
  24.     }   
  25.    }   
  26.   }   
  27.   return obj2;   
  28.  }   

第二个问题:

在使用hibernate的save函数时报
identifier of an instance of cn.ccb.metadata.app.bo.TbapStructureDetailPubhis was altered from 402885d813d337320113d3e983d1005e to 402885d813d337320113d36320dd0026;
nested exception is org.hibernate.HibernateException:
identifier of an instance of cn.ccb.metadata.app.bo.TbapStructureDetailPubhis was altered from 402885d813d337320113d3e983d1005e to 402885d813d337320113d36320dd0026;

这个错误是由于我在循环保存bo的时候,没有重新实例化要保存的bo,比如

java 代码
  1. for(int j=0;j<details.size();j++){   
  2.  TbapStructureDetail detailBo = new TbapStructureDetail();   
  3.  detailPubhisBo = new TbapStructureDetailPubhis();//由于没有写这句话报的错!   
  4.         detailBo=(TbapStructureDetail)details.get(j);   
  5.  detailPubhisBo = (TbapStructureDetailPubhis)CopyBo(detailBo,detailPubhisBo);   
  6.  detailPubhisBo.setStruAttributeId(struPubhisBo.getStruAttributeId());   
  7.  detailPubhisBo.setStructureDetailId(null);   
  8.  this.dao.save(detailPubhisBo);   
  9. }   
  10.   


20070723
----------------------------
Oracle分区表学习及应用
分区分hash、range、list和复合分区。

sql 代码
  1. -- Create table(创建分区表)   
  2.   
  3.   create table BILL_MONTHFEE_ZERO   
  4.   
  5.   (   
  6.   
  7.   SERV_ID       NUMBER(20) not null,   
  8.   
  9.   BILLING_CYCLE_MONTH NUMBER(6) not null,   
  10.   
  11.   DATE_TYPE      NUMBER(1),   
  12.   
  13.   ACC_NBR       VARCHAR2(80)   
  14.   
  15.   )   
  16.   
  17.   partition by range (BILLING_CYCLE_MONTH)   
  18.   
  19.   (partition p_200407 values less than (200407)   
  20.   
  21.   tablespace TS_ZIKEN   
  22.   
  23.   storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),   
  24.   
  25.   partition p_200408 values less than (200408)   
  26.   
  27.   tablespace TS_ZIKEN   
  28.   
  29.   storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0))   
  30.   
  31.   ;   
  32.   
  33.   create index idx_bill_monthfee_zero_idx01 on bill_monthfee_zero(billing_cycle_month)   
  34.   
  35.   tablespace TS_ZIKEN_idx   
  36.   
  37.   storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0) nologging;   
  38.   
  39.   grant all on bill_monthfee_zero to dxsq_dev;   
  40.   
  41.   --增加分区表   
  42.   
  43.   alter table BILL_MONTHFEE_ZERO add Partition p_200409   
  44.   
  45.   values less than (200409) tablespace ts_ziken;   
  46.   
  47.   --删除一分区   
  48.   
  49.   alter table part_tbl drop Partition part_tbl_08;   
  50.   
  51.   --将一个分区分为两个分区   
  52.   
  53.   alter table bill_monthfee_zero split Partition p_200409 at (200409)   
  54.   
  55.   into (Partition p_200409_1 tablespace ts_ziken,   
  56.   
  57.   Partition p_200409_2 tablespace ts_ziken_idx);   
  58.   
  59.   --合并分区   
  60.   
  61.   ALTER TABLE bill_monthfee_zero   
  62.   
  63.   MERGE PARTITIONS p_200408, p_200409 INTO PARTITION p_all   
  64.   
  65.   --将分区改名   
  66.   
  67.   alter table bill_monthfee_zero rename Partition p_200408 to p_fee_200408   
  68.   
  69.   --将分区改表空间   
  70.   
  71.   alter table bill_monthfee_zero move Partition p_200409   
  72.   
  73.   tablespace ts_ziken_01 nologging   
  74.   
  75.   --查询特定分区   
  76.   
  77.   select count(*) from BILL_MONTHFEE_ZERO partition (p_200407);   
  78.   
  79.   --添加数据   
  80.   
  81.   insert into bill_monthfee_zero select * from bill_monthfee_zero partition (p_200407)   
  82.   
  83.   --分区表的导出   
  84.   
  85.   userid=dxsq/teledoone@jndxsq154   
  86.   
  87.   buffer=102400   
  88.   
  89.   tables=bill_monthfee:P_200401,   
  90.   
  91.   file=E:\exp_para\exp_dxsq_tables.dmp   
  92.   
  93.   log=E:\exp_para\exp_dxsq_tables.log   
  94.   

  技巧:

  删除表中一个字段:

  alter table bill_monthfee_zero set unused column date_type;

  添加一个字段:alter table bill_monthfee_zero add date_type number(1);

你可能感兴趣的:(spring,工作,bean,Hibernate,JSF)