大家来讨论下业务层(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 密码错误
.....
后一种方式可降低错误提示信息与代码的耦合度,方便修改
[解决办法]
[解决办法]
业务层做除去交互的操作部分的功能部分
[解决办法]
你可以自己另写一个方法,然后自己判断可能出现在各种异常..根据异常类型来返回不同的错误信息..