颠覆软件

关注 : 架构与设计,敏捷,快速开发,项目管理,执行力,SSH,RoR

Archive for May, 2007

行万里路,读万卷书

May 29, 2007

key words: 读书

这次出差坐火车,感觉还是有收获,买了两本 ruby的书 <应用Rail进行敏捷web开发>和<Ruby on rails快速开发>,感觉坐火车的好处就是时间比较充足,人也比较放松,在20多个小时的旅途中居然把两本书都看了一遍,呵呵,看来古人说的读万卷书,行万里路还是有点道理

兄弟们,你最近在读什么书呢?
大家一起分享分享啊

说一下我最近在读的书:

于丹的论语:看了一半的视频,一半的书,感觉于丹的风格我不是太喜欢,有点矫情  :)
赢 :关于GE,关于管理,原来已经读了一遍,最近重温一下,还是有不少的收获
易中天的三国:看的是视频,感觉易中天是个人物,至少从听者的角度觉得效果不赖

一直对快速开发有自己的一些想法,也一直在搜集一些资料,所以最近把关注点也移到了RoR,效果感觉不错,适合中小企业的快速开发,至少在一个全新的小项目中是可行的,愿意与大家一起交流。

最近在关注 林伟贤,感觉从他那里能学到很多东西,有激情,有思想,有方法,兄弟们有空多看看  :)

过段时间打算买一个空间,听说dreamhost不错,支持 php和ruby,正合吾意,大家有什么好的想法可以推荐下啊。

比较罗嗦了今天,凑合点吧.

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

接触rails

May 24, 2007

最近突然对Rails产生了兴趣,花了2天时间把这本《应用Rails进行敏捷Web开发》看完了,感觉不错。

在书的开始的地方介绍了开发的大致流程,值得借鉴:(该事例是一个购物车)
1。user case
就是有哪些参与者或者角色,本例是seller,buyer
2. page flow
页面流转,即各个角色的页面流转过程会有哪些。

购买者的流程

商家的流程

3.data:数据

then,Let’s code :)

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

Spring中的service之间如何调用

May 14, 2007

key word : spring,service

在基于struts+spring+hibernate的开发框架下,一般service都是直接通过在Struts的action中getBean(“yourServiceName”)来获取,那么如果在serviceA中想调用serviceB中的方法该如何呢?

直接new 一个serviceB是不行的,因为里面可能还有依赖注入的dao等其他本来需要容器管理的资源,可以象在action中一样getBean()么?

获得applicationContext就可以了:

AppContext :

public class AppContext {
    
private static ApplicationContext applicationContext;

    
public static ApplicationContext getApplicationContext() {
        
return applicationContext;
    }

    
public static void setApplicationContext(
            ApplicationContext applicationContext) 
{
        AppContext.applicationContext 
= applicationContext;
    }

}

SpringService:

public class SpringBeanService {
    
private static SpringBeanService instance;

    
private ApplicationContext applicationContext;

    
public static synchronized SpringBeanService getInstance() {
        
if (instance == null{
            instance 
= new SpringBeanService();
        }

        
return instance;
    }


    
public ApplicationContext getApplicationContext() {
        
return this.applicationContext;
    }


    
public void setApplicationContext(ApplicationContext applicationContext) {
        
this.applicationContext = applicationContext;
    }


    
public UserService getUserService(){
        
return (UserService)AppContext.getApplicationContext().getBean(userService);
    }


    }

ApplicationContext的初始化:

public class ConfigLoadListener implements ServletContextListener {

    
public void contextInitialized(ServletContextEvent contextEvent) {
        
try {
            WebApplicationContext context =WebApplicationContextUtils.getRequiredWebApplicationContext(contextEvent.getServletContext());
            AppContext.setApplicationContext(context);

            
//读配置
            try {
                ServletContext context2
=contextEvent.getServletContext();
                String path
=context2.getInitParameter(setting.properties);
                InputStream in 
=context2.getResourceAsStream(path);
                Properties properties 
= new Properties();
                properties.load(in);
                GlobalConstant.setCmdbProperties(properties);
                in.close();
            }
 catch (IOException e) {
                e.printStackTrace();
            }

        }
 catch (HibernateException e) {
            System.out.println(
系统无法初始化,异常退出);
            System.out.println(e);
        }

    }


    
public void contextDestroyed(ServletContextEvent contextEvent) {
    }

}

感觉有点麻烦,有更简便的办法了么?

update(2007-5-15):
这篇文章大家可以参考一下,和本文有类似之处:
 Struts调用Spring服务类的三种方法

引用:

3.朋友帮忙型  朋友多了好办事,凡事都自己动手总有一天会活活累死,所有Action为自己需要的Service提供setter,并且在Spring中注入,好累啊。小学生都在减负了,我们也来为Action减减负吧–提供一个专门
查找Serivice的ServiceLocator,负责获取所有的Service,该类为每个Service提供专门的获得方法,如:  

VN:F [1.6.3_896]
Rating: 10.0/10 (1 vote cast)
VN:F [1.6.3_896]
Rating: -1 (from 1 vote)

简单就是美 — 简化hibernate,简化dao

May 13, 2007

key word : hibernate,dao

一。简化hibernate
首先hibernate是一个优秀的ORM工具(此话鉴定为废话:))
其次,按照20/80的规律,有80%的问题不需要那20%学习起来比较麻烦的东西。

很多人在用hibernate的时候一定把关系作为精华来学习,比如一对多,多对一,以及多对多,认为只有熟练运用这个才是对hibernate的真正掌握。
说实话,这个想法从技术的角度讲有点道理,问题是很多人对这些始终是一头雾水,反正不要好看,我现在仍然是一头雾水,今天我终于给自己
解放了出来,我回头去看自己的项目,发现N多的时候100%的不要关系(在 hibernate中)也不会出人命,而且效果很好。

现在,每个mapping文件中没有了set,list,map,我相信一定有N多人说我这个不符合OO什么的,不过大家反过来想,在我的项目组中会有一个明显
的好处就是我将问题简化了,
大家都会做,比如Org与User的关系,1:N的关系,我不用考虑这个,直接手工去维护,dao.save(org);user.setOrgId(“11″);dao.save(user);

有一段时间我依次问各个项目组,你们的hibernate中用到了关联操作了么,回答清一色的“NO”,看来大家都在无意识的回避这个陷阱,呵呵,
很合吾意。

二.简化dao

可能是受到appfuse的影响,一个service就有一个dao,现在从实际的角度来看仍然觉得没有太大的必要,当然,如果你是类似测试驱动的想法
那么可能另当别论。现在我更喜欢一个通用的dao全部搞定,确实舒服。

service中的操作全部调用通用dao(getObjects(),saveObject(),updateObject(),removeObject())

public BeanValue saveItem(RequestMap rMap) {
        BeanValue value 
= null;
        
try {
            log.info(
=====begin to save alexItem object);
            value 
= new BeanValue();
            AlexItem alexItem 
= (AlexItem) BeanUtil.convertObject(AlexItem.class, rMap.getMap());
            dao.saveObject(alexItem);
            log.info(
=====end to save alexItem object);
            value.addRequestMap(
admin,alexItem);
            value.setForword(
success);
        }
 catch (BaseException e) {
           value.addErrorMap(
errorName,e);
           value.setForword(
error);
        }

        
return value;
    }

愿意听听各位在项目中的做法。

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

谈谈方法中的返回值类型和参数类型

May 13, 2007

和大家谈谈方法中的返回值类型和参数类型。

大多数时候我们用具体的返回类型,比如要么是一个具体的对象,要么是一个Collection作为返回类型,对于参数同样如此,
现在我看到另一种做法,即参数和返回类型都是HashMap,大家以为此种做法是否可取?

代码如下:

public BeanValue saveMyPo(RequestMap rMap) {

        BeanValue value 
= new BeanValue();

        
try {

            MyPo mypo
= (MyPo) BeanUtil.convertObject(MyPo.class,
                    rMap.getMap());

            mypo.setTtime(
new Date());




            dao.saveObject(mypo);

            value.addRequestMap(
hi, mypo);

        }
 catch (Exception e) {
            value.addErrorMap(Constants.MyException, e);
            value.setForword(
fail);
        }


        
return value;

    }

目前这个做法看得到的好处有几点:
1。返回的类型可以存放更多的内容,包括错误信息以及更多的其他内容
2。参数传递的内容更丰富,可以减少不必要的重载,减少代码量。

不过,如果说有什么缺点的话可能就是语义不够明确,那么除了这一点还有什么别的问题么? 请大家拍砖。

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

在oracle application server中部署jstl和struts,以及log4j

May 8, 2007

key words: jstl,struts,log4j

1.jstl
jstl的配置参考这篇文章:
http://foolmouse.cnblogs.com/archive/2006/04/20/380695.html

在iAS904服务器上的jstl的版本只能用1.0 的
“standard.jar和jstl.jar文件拷贝到\WEB-INF\lib\

2.struts
struts的配置主要是把 相关jar文件(struts.jar,struts-legacy.jar)拷贝到\WEB-INF\lib
,另外,struts需要用到一些apache的commons的包(commons-beanutils.jar,commons-collections-2.1.1.jar,commons-digester.jar)

3.log4j
log4j经常有莫名其妙的问题,有时候能出来log有时候又不能出来log,最后把log4j.xml统一改为log4j.properties,暂时看好像有效果。

4。web.xml配置

<taglib>
        
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
        
<taglib-location>/WEB-INF/c-1_0.tld</taglib-location>
    
</taglib>
    
<taglib>
        
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
        
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
    
</taglib>
    
<taglib>
        
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
        
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
    
</taglib>
    
<taglib>
        
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
        
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
    
</taglib>

今天终于先在iAS里部署完了struts,下一步把hibernate放进去,上次部署过一次,没有成功,据说是和toplink有点冲突。 知道的兄弟分享下oc4j中部署hibernate

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)