hot的学习笔记

我是一只弱小的毛毛虫,想像有一天可以成为强壮的挖土机, 拥有挖掘梦想的神奇手套。。。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  8 随笔 :: 0 文章 :: 1 评论 :: 0 Trackbacks

2009年8月18日 #

     摘要: 开源报表工具现状
目前较为知名的开源报表工具有:
1、 JasperReports 一个优秀的Java  阅读全文
posted @ 2009-08-18 14:04 hot 阅读(719) | 评论 (0)编辑 收藏

2009年7月23日 #

    快下班的时候,收到小头的关于Reset Css的一封邮件,看了一下才发现,哎呀!原来css还有这么玩的。
2004年,Tantek被不同浏览器下默认样式的差异给搞烦了,于是写了一个undohtml.css,这也就诞生了世界上第一份reset.css。
    CSS Negotiation and a Sanity Saving Shortcut. * { margin: 0; padding: 0 } 的学名是Global White Space Reset. 从原文中可以看出这个方法刚问世时是非常火爆的,并且作者建议一定要先破后立,要将清扫差异和重置默认样式结合起来,这样才是正确的做法。
   为何Global White Space Reset当初风光一时,如今却黯然销魂?* { margin: 0; padding: 0 }的成功之处在于,管你三七二十八,统统抹平,人人生而平等!然而其失败之处也正是因为其威力太大,虽然捣了蜂窝得了蜜,却惹来群蜂追尾,麻烦无限(因为被抹平的样式,你得再重新设置回来,比如input的padding等)。这就如西汉一代名将韩信哪,是成也萧何,败也萧何!
    2007年,Eric Meyer的一篇文章Reset Styles, 重新唤起了一股reset热潮。下面是Eric Meyer的一个CSS Reset方案:
  

   
1. html, body, div, span, applet, object, iframe,
   
2. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
   
3. a, abbr, acronym, address, big, cite, code,
   
4. del, dfn, em, font, img, ins, kbd, q, s, samp,
   
5. small, strike, strong, sub, sup, tt, var,
   
6. b, u, i, center,
   
7. dl, dt, dd, ol, ul, li,
   
8. fieldset, form, label, legend,
   
9. table, caption, tbody, tfoot, thead, tr, th, td {
  
10.     margin: 0;
  
11.     padding: 0;
  
12.     border: 0;
  
13.     outline: 0;
  
14.     font-size: 100%;
  
15.     vertical-align: baseline;
  
16.     background: transparent;
  
17. }
    哎,真是收获良多啊!

posted @ 2009-07-23 21:49 hot 阅读(135) | 评论 (0)编辑 收藏

2009年7月22日 #

    前些日子西安项目中的任务日志,以及最近参与工作流动态表单开发中都使用到了spring的aop。所以,自己简单的进行了一下总结,也算是对前一段时间工作的一个总结吧。

 AOPAspect-Oriented Programming,面向切面编程),可以说是OOP面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

 而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

    Spring支持四种拦截类型:目标方法调用前(before),目标方法调用后(after),目标方法调用前后(around),以及目标方法抛出异常(throw)。

    前置拦截的类必须实现MethodBeforeAdvice接口,实现其中的before方法。

    后置拦截的类必须实现AfterReturningAdvice接口,实现其中的afterReturning方法。

    环绕拦截的类必须实现MethodInterceptor接口,实现其中的invoke方法。环绕拦截是唯一可以控制目标方法是否被真正调用的拦截类型,也可以控制返回对象。而前置拦截或后置拦截不能控制,它们不能印象目标方法的调用和返回。
但是以上的拦截的问题在于,不能对于特定方法进行拦截,而只能对某个类的全部方法作拦截。所以下面引入了两个新概念:切入点引入通知

切入点的定义相当于更加细化地规定了哪些方法被哪些拦截器所拦截,而并非所有的方法都被所有的拦截器所拦截。在ProxyFactoryBean的属性中,interceptorNames属性的对象也由拦截(Advice)变成了引入通知(Advisor),正是在Advisor中详细定义了切入点(PointCut)和拦截(Advice)的对应关系,比如常见的基于名字的切入点匹配(NameMatchMethodPointcutAdvisor类)和基于正则表达式的切入点匹配(RegExpPointcutAdvisor类)。这些切入点都属于静态切入点,因为他们只在代理创建的时候被创建一次,而不是每次运行都创建。

下面是spring的配置文件 当然aop的配置方式有许多种,这只是其中一种

 

<!-- 获取相应的instance对象 并且不被aop拦截 -->
   
<bean id="oaTaskInstanceService4Log" parent="transactionProxy">
        
<property name="target">
            
<bean
                
class="com.oa.task.service.impl.OaTaskInstanceServiceImpl">
                
<property name="oaTaskInstanceDao">
                    
<ref local="oaTaskInstanceDao"/>
                
</property>
            
</bean>
        
</property>
    
</bean>
   
<!-- instance日志所需DAO -->
   
<bean id="oaTaskInstanceLogDao" class="com.oa.task.dao.OaTaskInstanceLogDao">
      
<property name="sessionFactory" ref="sessionFactory"></property>
   
</bean>
   
<!-- instance日志所需Service  此接口为 日志的业务操作接口-->
    
<bean id="oaTaskInstanceLogService" parent="transactionProxy"> 
        
<property name="target">
            
<bean
                
class="com.oa.task.service.impl.OaTaskInstanceLogServiceImpl">
                
<property name="oaTaskInstanceLogDao">
                    
<ref local="oaTaskInstanceLogDao"/>
                
</property>
                
<property name="sysOperDao">
                    
<ref bean="sysOperDao" />
                
</property>
                
<property name="ibatisBase">
                    
<ref bean="ibatisBase" />
                
</property>
            
</bean>
        
</property>
    
</bean>
   
<!-- instance日志AOP拦截类 -->
   
<bean id="oaTaskInstanceLogOper" class="com.oa.task.log.OaTaskInstanceLogOper">
           
<property name="oaTaskInstanceLogService">
            
<ref local="oaTaskInstanceLogService" />
        
</property>
        
<property name="oaTaskInstanceService">
            
<ref local="oaTaskInstanceService4Log" />
        
</property>
   
</bean>
   
   
<!-- instance日志AOP配置绑定 -->
   
<bean id="oaTaskInstanceLogAutoProxy" 
          
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
          
<property name="beanNames">
             
<list>
               
<value>oaTaskInstanceService</value>  //拦截的业务接口 oaTaskInstanceService内所有方法都进行拦截
             </list>
          
</property>
          
<property name="interceptorNames">
             
<list>
                
<value>oaTaskInstanceLogOper</value>  //拦截器
             
</list>
          
</property>
    
</bean>
   下面是 拦截器oaTaskInstanceLogOper类,采用的是环绕拦截的方式。
public class OaTaskInstanceLogOper  implements MethodInterceptor{
    /**
     * 当更新动作发生时的记录
     
*/
    
public Object invoke(MethodInvocation invocation) throws Throwable {
        String method 
= invocation.getMethod().getName();
        Object result 
= null;
        
if(MODIFY_INSTANCE.equals(method)){//修改日志(业务逻辑 判断方法)
            ......//业务操作,进行日志的记录
            result
=invocation.proceed(); 
        }
else {//不做任何日志
            result=invocation.proceed();//调用原来的方法
        }
        
return result;
    }


}


posted @ 2009-07-22 22:39 hot 阅读(824) | 评论 (0)编辑 收藏

2009年7月21日 #

    前一段时间,曾经做过一点flex的开发工作,最初使用的是cairngorm,后来研究了一下 pureMvc,并进行了部分改造。
由于只是初步涉足flex领域,所以只能提出一点自己的看法,并不具有说服力。
    cairngorm 前端的控件监听用户的行为,只是监听,并不会做任何反应。控件监听以后调用Commands来做相应的事情,Command做了所有工作。把业务逻辑委托到 Bussiness Delegates中,Command调用Business Delegate 后,Business Delegate 通过Service Locator来找到相应的RPC services,然后执行实现从服务器端取数据。
    在Model Locator 保存状态并且能使Model检测到View的变化。这样一来用户操作就能直接影响Model。
    它的体系主要包含下面几部分(具体用法就不做分析了):

    1. Business(业务逻辑部分)

    2. Command(命令部分)

    3. Control(控制部分)

    4. Model(数据模型)

    5. View(界面视图)

    6. VO(ValueObject)


    使用cairngorm 对于整个事件的流程会比较的清晰。个人认为它的整个流程很符合人类的思维方式。但是在实际开发中却感觉 每当添加一个事件的时候,就要去写event command delegate,事件一多就会感觉重复写这些东西很烦。这时候就开始考虑更换一下框架,于是在头的指导下去看了pureMvc框架。
    学了两天后,就深深喜欢上pureMvc了,哈哈!
    顾名思义。pureMvc 就是纯的mvc框架,许多人都错误地把PureMVC误认为它是一个Flash的MVC框架或者是Flex的MVC框架。既然它是一个纯框架,那么,它就不仅仅是支持某种特定 的语言,它的设计是与语言无关的。它支持了好多种常用的编程语言。
    pureMvc的层次结构比cairngorm清晰的多,严格的MVC三层结构。
    1、Model保存对Proxy对象的引用,Proxy负责操作数据模型,与远程服务通信存取数据。

    2、View保存对Mediator对象的引用。由Mediator对象来操作具体的视图组件(View Component,例如Flex的DataGrid组件),包括:添加事件监听器,发送或接收Notification ,直接改变视图组件的状态。

    3、Controller保存所有Command的映射。Command可以获取Proxy对象并与之交互,通过发送Notification来执行其他的Command。

    pureMvc采用了“观察者模式”(被观察者是不关心观察者是谁的),通过消息机制,来维持command 与 mediator的关系,将它们之间的耦合度降到最低。notification机制也是我最喜欢pureMvc的一个方面。



posted @ 2009-07-21 22:03 hot 阅读(254) | 评论 (0)编辑 收藏

 在西安做项目时 遇到的一个文件下载 文件名乱码的问题 ,下面是解决方案:

 //输出文件流
       response.setContentType("application/octet-stream;charset=ISO8859-1");
   String agent = request.getHeader("USER-AGENT");
   if (null != agent && -1 != agent.indexOf("MSIE")){
    response.setHeader("Content-Disposition","attachment;" + "filename=" + URLEncoder.encode( file.getName() , "UTF8"));
   }
   else if (null != agent && -1 != agent.indexOf("Mozilla")){   
    response.setHeader("Content-Disposition","attachment;" + "filename=" + new String(file.getName().getBytes("UTF-8"),"ISO8859-1"));
   }
   else {
      response.setHeader("Content-Disposition","attachment;filename=" + file.getName() );
   }
       java.io.FileInputStream fr = new java.io.FileInputStream(fpath);
         java.io.InputStreamReader is = new java.io.InputStreamReader(fr,"ISO8859-1");  
         java.io.BufferedReader br=new java.io.BufferedReader(is);
   out = response.getOutputStream();
   
   int i = 0;
   while((i= br.read()) != -1){  
             out.write(i);
         }  
posted @ 2009-07-21 16:59 hot 阅读(187) | 评论 (0)编辑 收藏

设置变量
<s:set name="maxRowIndex" value="%{formInfo.maxRowIndex}"/>

for 循环
<s:bean name="org.apache.struts2.util.Counter" id="counter">
  <s:param name="first" value="0" />
  <s:param name="last" value="#maxRowIndex" />
  <s:iterator>
  </s:iterator>
</s:bean>

迭代<s:iterator>用于将List、Map、ArrayList等集合进行循环遍历
<s:iterator value="#rowList">
</s:iterator>

if语句
<s:if test="#rowList==null">
</s:if>

生成html代码
<s:property value="%{formInfo.jsCode}" escape="false"/>
escape="false" 不进行转义

posted @ 2009-07-21 14:21 hot 阅读(231) | 评论 (0)编辑 收藏

private List sortFieldListByRowIndex(List fieldList){
  Comparator<DynamicFormField> comparator = new Comparator<DynamicFormField>(){
   public int compare(DynamicFormField f1, DynamicFormField f2) {
     if(f1.getRowIndex()!=f2.getRowIndex()){
         return f1.getRowIndex()-f2.getRowIndex();
      }else if(f1.getColIndex()!=f2.getColIndex()){
       return f1.getColIndex()-f2.getColIndex();
      }else{
       return (int) (f1.getId() - f2.getId());
      }
   }
  };
  Collections.sort(fieldList, comparator);
  return fieldList;
 }
这是工作中 使用过的一个例子。
对fieldList中DynamicFormField对象 先按其rowIndex排序后按colIndex排序
posted @ 2009-07-21 14:03 hot 阅读(485) | 评论 (1)编辑 收藏

新手上路啊!希望以后可以跟大家多交流!

posted @ 2009-07-21 13:55 hot 阅读(116) | 评论 (0)编辑 收藏

仅列出标题