ssh整合,action与logic之间统一接口问题

struts1.3+hibernate3.0+spring2.0整合已经整合完了,但是有个问题就是action和logic之间的传值问题,也就是logic的接口应该怎么定义才能打到action调用的统一

这个是我项目的结构图
[img]http://dl.iteye.com/upload/attachment/540343/143fd1b4-a59c-3648-bece-5effce7a30da.jpg[/img]

LoginAction
[code="java"]
public class LoginInAction extends BaseAction {

LoginLogic loginLogic;

@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) {        
    String msg = "";
    String url = request.getParameter("url");         
    LoginVO vo = new LoginVO
    msg = getLoginLogic().doIt(vo);
    //判断doit返回的string是成功还是失败
    if(msg.toLowerCase().indexOf("error") >= 0){            
        request.setAttribute(ERROR_KEY.ERROR_INFO_NAME, msg);
        return mapping.findForward("error");            
    }
    if(msg.equals(ERROR_KEY.SUCCESS)){
        userLoginVO = new UserLoginVO();
        //成功就把logic里面的vo获得到,传送到页面和session中
        userLoginVO = getLoginLogic().getUserLoginVO();

        request.getSession().setAttribute(WEB_KEY.VO_USER_LOGIN, userLoginVO);            

        return mapping.findForward("success");
    }
    return mapping.findForward("error");
}
private LoginLogic getLoginLogic() {
    return loginLogic;
}
public void setLoginLogic(LoginLogic loginLogic) {
    this.loginLogic = loginLogic;
}

}

[/code]

LoginLogic 接口
[code="java"]
public interface LoginLogic {
/**
* 主函数
* @param loginVO
* @return ERROR_KEY
*/
public String doIt(LoginVO loginVO);

/**
 * 获取userVO
 *
 * @return LoginVO
 */
public UserLoginVO getUserLoginVO();

}

[/code]

LoginLogicImpl
[code="java"]
public class LoginLogicImpl extends BaseLogicImpl implements LoginLogic {

private LoginService loginService;

private UserLoginVO userLoginVO;

public LoginLogicImpl() {
}

public String doIt(LoginVO vo) {
    String msg = ERROR_KEY.ERROR_USERIDPWD_500;

    return msg;

}

private LoginService getLoginService() {
    return loginService;
}

public void setLoginService(LoginService loginService) {
    this.loginService = loginService;
}

public UserLoginVO getUserLoginVO() {
    return userLoginVO;
}

private void setUserLoginVO(UserLoginVO userLoginVO) {
    this.userLoginVO = userLoginVO;
}

[/code]
可以看出,为了获取一个uservo只能在logic的实现类里面定义一个
private UserLoginVO userLoginVO;
大家知道,spring默认是单例模式,所以这样的话可能回导致vo被其他请求修改

我想问问有没有一种方法能达到logic返回值可以支持多个,并且接口能定义为通用的,例如doit()这样的接口,所有的logic都是这一个主入口

我目前想到的就是,把返回值定义为成Map的
请问谁还有好的办法,谢谢了,前提是还是使用spring单例模式.谢谢

5个回答

[quote]
呵,其实我问这些问题,就是我一直想往架构师方向发展,也就是您现在的这个职位.
最后在问您一个关键的问题.我想往架构师方向发展,您能给我一些宝贵的建议好吗?谢谢了!!!呵呵
[/quote]
哈哈,你误会了,其实我不是工作上的架构师,这只是javaeye上的头衔。这个也是我的职业发展方向。个人觉得架构师主要在宏观上的把控,知识面要广,考虑问题需要从全局出发。所以很多知识你都需要了解。
你可以看看这个:[url]http://blog.csdn.net/cutesource/article/details/6007460[/url],这个人才是真正的淘宝架构师。

[quote]
我想问问有没有一种方法能达到logic返回值可以支持多个,并且接口能定义为通用的,例如doit()这样的接口,所有的logic都是这一个主入口
[/quote]
你可以在service层定义一个Facade,并且里面可以只定义一个方法,方法签名包含:被调用service的Class,调用方面名,参数列表以及返回值Class,这样你的Action调用全部都统一了,而返回值的多样性通过泛型来支持,类似于spring 3.0里面定义的:
[code="java"]
T getBean(String name, Class requiredType) throws BeansException;
[/code]

不过,我觉得这样刻意把action对service的调用统一,反而不好,所有调用都统一到一个方法上,然后在委派到具体的service,这样模糊了业务边界。

为什么你的包里面会把service和logic分开呢?一般不都是service里面包含业务逻辑的么?
你可以按业务分包或者技术分层来分包,这个两个差别不是特别大,如果一个开发人员完全负责整个业务模块,那么采用业务分包,然后内部采用技术分层分包,这样比较清晰,因为从Acion到DAO都有一个人员完成,所以业务分包包含所有部分,这种方式优先。

是的,这是以业务优先的方式来划分的。这种方式对于业务系统比较复杂的情况比较合适。每个负责业务模块的人开发也比较独立,较少会出现冲突(比如,SVN提交)。
对于比较简单的业务系统,我建议采用技术分层优先的方式,不同的业务通过类命名来区分,比如:NewsAction,NewsService,NewsDAO,这样避免太多的分包,把简单问题复杂化。

[quote]
我想问问,您说5层架构和3层架构哪一种比较灵活而且能达到大众化也就是一种标准呢?那一种对项目的管理和开发上起到一种良好的方式
[/quote]
其实你这里说的5层架构其他和我们通常说的架构含义不太一样了,一般说架构分层,指的是“layer”,即逻辑上的划分,这样划分是为了层次清晰,如果划分太多也有过度设计的毛病。你看看ruby on rails里面,它其他是就是一个MVC架构,只分三层,然后其他都是按业务划分包,结构也很清晰。
就分层来说,采用多层机构是对的,但不能太多,通常划分:表现层,业务层,基础设施层就可以了,而你的代码更多应该关注业务层。复杂系统的设计我建议你参考DDD(领域驱动设计)的一些原则。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问