读书人

大家来讨论下业务层(BO)该做什么事?该

发布时间: 2012-01-28 22:06:13 作者: rapoo

大家来讨论下业务层(BO)该做什么事?该怎样做事?
本人表达能力较差,举个例子来说明:
假设有个有个用户登录的功能,Servlet url是:login.do,BO是UserBo,简略代码如下:

Java code
//实体类public class User {    String name;    String password;        public User(){    }        public User(String name, String password) {        super();        this.name = name;        this.password = password;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    }//Dao 类public class UserDao {    public User findUserByName(String username){        return new User(username, "password");    }        public boolean addUser(User user){        // do something...        return true;    }}//Bo 类public class UserBo {    private UserDao dao = new UserDao();        public boolean login(String username,String password){        User u = dao.findUserByName(username);        if( u != null && u.getPassword().equals(password)){            return true;        }        return false;    }    public boolean addUser(User user){        return dao.addUser(user);    }}//Servletimport java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Login extends HttpServlet {        private UserBo bo = new UserBo();        public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        this.doPost(request, response);    }        public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String username = request.getParameter("username");        String password = request.getParameter("password");        boolean b = bo.login(username, password);        if( b ){            request.setAttribute("user", username);            response.sendRedirect("loginSuccess.jsp");        }else{            response.sendRedirect("loginError.jsp");        }    }}


以上是简单的代码,现在很明显的一个问题摆在面前了,那就是Bo类的login方法只是简单的返回一个boolean值
是无法满足我们需求的,因为只返回boolean值的话只能知道登录是成功和失败,但是不能知道失败的原因是什么
所以无法给客户端一个丰富的结果。这只是一个小小的例子,大家来分析一下BO层如何设计才能解决这类问题。
还有,BO类的addUser方法,我以前做的项目里类似的add、update、delete、方法都只是简单的包装下dao的方法
BO在这里又能做些什么呢?都知道分层有好处,但是,如果只是简单的包装,BO就差不多算是没用的了,直接在
Servlet里面引用Dao的接口一样不会影响程序的偶和性。
我的问题的很明确,就是:业务层(BO)该做什么事?该怎样做事?
因为马上就要做项目了,我想在新项目里把功能做的更完善些。
呵呵,本人还是有点可用分的,如果在这里能得到有建设性的回答的话,我是不会吝啬那点点分滴。~


[解决办法]
Java code
public User login(String username,String password) throws LoginException{        User u = dao.findUserByName(username);        if(u == null) {            throw new LoginException("不存在的用户");        }        if(!u.getPassword().equals(password)){            throw new LoginException("密码错误");        }        return u;}
[解决办法]
业务层(BO)该做什么事?该怎样做事?


业务复杂些的话你就需要在public class Login extends HttpServlet {
调用多个DAO------什么能称为业务就是这种方式

LZ您知道了么,如果调用了多个DAO就知道他的好处了。

[解决办法]
分不分层跟你的项目的业务需求相关,一些简单的业务逻辑BO层是可以忽略的,如果业务逻辑复杂,这样分层就更能体会到其中奥妙的,总的来说还是从更好的维护性,可扩展性上进行思索。
[解决办法]

------解决方案--------------------


BO业务层,处理业务的流程的


BO又调用DAO层,DAO直接与数据库进行访问。。。
[解决办法]
up
[解决办法]
D=Data
B=Business

data是天然的,孤立的
Business是逻辑的,是处理关系的

所以,如果没有逻辑可处理,也确实无需BO,
技术只是手段,需要我们合理利用。


----------

具体问题,你说的Bo的login返回boolean信息少,
可以为UserBo增加方法返回详细信息:

Java code
//Dao 类public class UserDao {    public User findUserByName(String username){        return new User(username, "password");    }        public boolean addUser(User user){        // do something...        return true;    }} //Bo 类public class UserBo {    private UserDao dao = new UserDao();        public boolean login(UserDao user){        User u = dao.findUserByName(username);        if( u != null && u.getPassword().equals(password)){            return true;        }        errMsg="登录失败原因在这里。";        return false;    }    public String getErrorMsg(){        return errMsg;    }    public boolean addUser(User user){        return dao.addUser(user);    }}
[解决办法]
dao是操作数据的最小原子,bo是多个原子的统一调用。没有bo的话如何实现事务,如何进行事务嵌套,如何进行代码复用

至于登陆参数返回值可使用exception方式或传统的错误定义 用int做为返回值 方式 0 为成功 定义大于0 的或者小于0的为失败方式,
同时对应错误代码表
0 成功
1 用户不存在
2 密码错误
.....

后一种方式可降低错误提示信息与代码的耦合度,方便修改
[解决办法]
探讨
D=Data
B=Business

data是天然的,孤立的
Business是逻辑的,是处理关系的

所以,如果没有逻辑可处理,也确实无需BO,
技术只是手段,需要我们合理利用。


----------

具体问题,你说的Bo的login返回boolean信息少,
可以为UserBo增加方法返回详细信息:


Java code
//Dao 类
public class UserDao {
public User findUserByName(String username){
return new User(use…

[解决办法]
业务层做除去交互的操作部分的功能部分

[解决办法]
你可以自己另写一个方法,然后自己判断可能出现在各种异常..根据异常类型来返回不同的错误信息..

读书人网 >Java Web开发

热点推荐