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

2019-03-25 13:33|来源: 网路

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

这个是我项目的结构图


LoginAction
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;
    }
}



LoginLogic 接口
public interface LoginLogic {
    /**
     * 主函数
     * @param loginVO
     * @return ERROR_KEY
     */
    public String doIt(LoginVO loginVO);
    
    /**
     * 获取userVO
     *
     * @return LoginVO
     */
    public UserLoginVO getUserLoginVO();
}



LoginLogicImpl
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;
    }

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

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

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

问题补充:
myali88 写道
引用

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

你可以在service层定义一个Facade,并且里面可以只定义一个方法,方法签名包含:被调用service的Class,调用方面名,参数列表以及返回值Class,这样你的Action调用全部都统一了,而返回值的多样性通过泛型来支持,类似于spring 3.0里面定义的:
<T> T getBean(String name, Class<T> requiredType) throws BeansException;


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

请问我这种的结构怎么样改一改才比较合理一点呢

问题补充:
myali88 写道
为什么你的包里面会把service和logic分开呢?一般不都是service里面包含业务逻辑的么?

我一直在考虑怎么把包和层分的很合理,多人开发起来1是方便开发,2是方便日后维护和扩展,3是方便类的管理,4是能够标准化统一化
所以我看了写资料,有说把业务和数据操作都放倒service层中(3层架构),有的说可以把业务逻辑和数据操作分开(5层架构),我也没太多的经验,但是感觉5层架构的这种能分的很详细,可以达到我想的那种方式吧,所以就采用了这种所谓的5层架构,所以现在的问题来了,logic和action之间的接口调用我不知道怎么达到统一调用.


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

我认真的看了您的回复,做了一个空项目,不知道您说的是否是我截图的这个意思,如果不是,还请您能抽出宝贵时间帮我做一下您所说的项目分包分层的结构,感谢您了.



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

我想问问,您说5层架构和3层架构哪一种比较灵活而且能达到大众化也就是一种标准呢?那一种对项目的管理和开发上起到一种良好的方式

问题补充:
myali88 写道
引用

我想问问,您说5层架构和3层架构哪一种比较灵活而且能达到大众化也就是一种标准呢?那一种对项目的管理和开发上起到一种良好的方式

其实你这里说的5层架构其他和我们通常说的架构含义不太一样了,一般说架构分层,指的是“layer”,即逻辑上的划分,这样划分是为了层次清晰,如果划分太多也有过度设计的毛病。你看看ruby on rails里面,它其他是就是一个MVC架构,只分三层,然后其他都是按业务划分包,结构也很清晰。
就分层来说,采用多层机构是对的,但不能太多,通常划分:表现层,业务层,基础设施层就可以了,而你的代码更多应该关注业务层。复杂系统的设计我建议你参考DDD(领域驱动设计)的一些原则。

呵呵,其实我问这些问题,就是我一直想往架构师方向发展,也就是您现在的这个职位.
最后在问您一个关键的问题.我想往架构师方向发展,您能给我一些宝贵的建议好吗?谢谢了!!!呵呵

相关问答

更多
  • 楼上没有注意框架的版本吧?到了Struts2.0和Spring2.5整合方式改变了很多,我之前做过这样的项目遇到了不小的困难,特意写了一篇教程,地址在这里,一定能解决你的问题: NetBeans6.1下搭建Struts2.0+Spring2.5+Hibernate3开发环境 http://www.blogjava.net/tanjiazhang/archive/2008/08/07/220732.html
  • 配置Shiro的filter,因为在web系统中,Shiro也是通过filter进行拦截。【Shiro会提供很多filter】 下面的filter拦截后,会将操作权给我等等在下面贴出的applicationContext-shiro.xml(Spring中配置的filter,过滤链)!
  • 首先你要了解 这几个部分都是做什么用的 struts1给你提供了一个框架,这个框架是方便你数据处理用的,hibernate主要做数据库的连接 和数据的查询。spring是整体控制 你哪个提交动作找到哪个action 。 service呢 不是框架 ~是一个层 这个层是做数据返回~dao数据查询 action就是去查询数据,一般会有个接口,service要去实现接口~ 直接用action调用接口~希望能帮助到你~
  • 因为N多人觉得struts比spring mvc好,在他们看来只用spring的aop和ioc就足够了,其他的都用不着。 在我看来spring mvc和struts1.x比起来很不错,跟struts2.0比起来确实是要差一点的。 另外最重要的是struts出了很多年了,功能也很完善,spring mvc是后出的,别人用的好好的struts为什么要换呢?一来有学习成本,二来用不熟悉的技术写出的代码未必比以前的好。 如果是重头开始学我觉得用哪个都无所谓,毕竟不用struts的话至少xml可以少些那么几行。。。
  • 这个是Spring 3.0 核心类库必须Hibernate支持,直接ok,最好建议不要用工具直接生成!
  • hibernate:在构建数据层时候可以通过JDBC生成数据层的java代码,在项目运行过程中程序与数据库的交互将从这些地方实现。 spring:一般在项目启动时创建一组系统将要使用到的对象,交由spring管理,项目中需要使用的对象模型可以从这里获取。数据源也可以作为一组由spring管理的对象。 struts:解析获取到的http请求,根据URL分派跳转的类 整个流程从解析http请求开始,根据业务需要一般会涉及数据层操作(hibernate),这些操作完成后,根据返回结果由struts确定请求的返回内 ...
  • 为什么没法写,你的spring配置用的是xml还是注解?
  • spirng管理对象,struts 管理页面跳转。及处理流程。hibernate 操作数据库.
  • 不需要啊,有一个持久层框架就行啦
  • 兄弟呀,现在公司都很少用SSH的啦,他们一般都是用自家公司的框架,不过我手上有一份SSH的整合版,有strust1.2和struts2.0的整合好的了.