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

qusic 2009-05-28 09:34:54
加精
本人表达能力较差,举个例子来说明:
假设有个有个用户登录的功能,Servlet url是:login.do,BO是UserBo,简略代码如下:

//实体类
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);
}
}

//Servlet
import 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)该做什么事?该怎样做事?
因为马上就要做项目了,我想在新项目里把功能做的更完善些。
呵呵,本人还是有点可用分的,如果在这里能得到有建设性的回答的话,我是不会吝啬那点点分滴。~
...全文
1269 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
obullxl 2011-09-03
  • 打赏
  • 举报
回复
我们公司一般喜欢用Service或是Manager,Bundle之间用Servie,Bundle之内用Manager。
一毛二分钱 2010-01-10
  • 打赏
  • 举报
回复
我想的是,dao 层也就是持久层,他真正的用途就是只对数据进行操作,这样的话就有一点不好,当我们这传进来的参数进行判断的时候,如果在这里进行判断的话,会增加操作数据的负担,所以才会有业务逻辑层,直接调用dao里面的方法,到时候在servlet或是action中直接调用业务逻辑时里的方法就ok了
study999 2009-05-31
  • 打赏
  • 举报
回复
确实学习到不少好东东,谢了啊!
李世垚 2009-05-31
  • 打赏
  • 举报
回复
lsd123 2009-05-31
  • 打赏
  • 举报
回复
.
qq441733920 2009-05-31
  • 打赏
  • 举报
回复
学习
海棠无香1998 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 bao110908 的回复:]
我认为对于登录的错误信息没有必要提示得很明确,直接给出“用户名或密码错误”就可以了,这样会更为安全一些。
[/Quote]同意
tmniewei01 2009-05-30
  • 打赏
  • 举报
回复
好多高手呀!!!
xo888888 2009-05-30
  • 打赏
  • 举报
回复
帮顶,接分
qusic 2009-05-29
  • 打赏
  • 举报
回复
好了,这个帖子不再讨论如何返回丰富信息的事了,
现在在重点在于我写的那两种方法的可行性,还有哪些问题。
当然,如果有更好的解决方案也可以发出来,大家一起学习嘛~
qusic 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 jinxfei 的回复:]
再不济,将login方法的返回值改成一个对象也可以啊。
[/Quote]
那说的不就是我的第二种方法?
jinxfei 2009-05-29
  • 打赏
  • 举报
回复
再不济,将login方法的返回值改成一个对象也可以啊。
jinxfei 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 qusic 的回复:]
引用 15 楼 jinxfei 的回复:

额,为什么一定要用到ThreadLocal?

你觉得多线程有什么问题啊。

一般情况下BO是不会在使用的时候再去new一个吧?
BO一般也是单态的,当多个用户同时请求login的时候
必定会有多个线程同时访问UserBo的login方法,你说这个时候
public String getErrorMsg(){
return errMsg;
}
这个方法还安全吗?
当然,如果每个请求就new一次UserBO就不存在这个问题
[/Quote]


我觉得一个类是单例还是每次创建实例,不是取决于它属于哪一层(层实际上只是人为划分的),
而是取决于它如何访问。

如果访问量不大,每次创建,也无不可啊。
qusic 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xnjnmn 的回复:]
业务层(BO)该做什么事?该怎样做事?


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

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

[/Quote]
嗯,如果用到了多个DAO,确实是封装到BO层好点。
以前做的项目中没有遇到过这样的情况,所以没有考虑到。
qusic 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 eeight 的回复:]
Java codepublicUser login(String username,String password)throwsLoginException{
User u=dao.findUserByName(username);if(u==null) {thrownewLoginException("不存在的用户");
}if(!u.getPassword().equals(password)){thrownewLoginException("密码错误");
}returnu;
}
我个人都是这么做的。
[/Quote]
以异常来传递信息吗?倒是一种方法,但是这样会倒是程序复杂化吧?导出充斥着异常...
qusic 2009-05-29
  • 打赏
  • 举报
回复
两种实现方法,
第一种:

private static ThreadLocal<String> local = new ThreadLocal<String>();
public boolean login(String username,String password){
User u = dao.findUserByName(username);
if( u != null && u.getPassword().equals(password)){
return true;
}
local.set("some error message");
return false;
}

public String getMessage(){
return local.get();
}


第二种,要借助另外一个类:

// 引入一个BR类
public class BR<T> {

private boolean success;
private T result;
private Object error;

public BR(){}

public BR(boolean success, T result, Object error) {
super();
this.success = success;
this.result = result;
this.error = error;
}
//省略getter and setter

}

// 具体使用

public BR<?> addUser(User user){
if( dao.addUser(user)){
return new BR<Object>(true,null,null);
}
return new BR<Object>(false,null,"some error message");
}

public static void main(String[] args){
UserBo bo = new UserBo();
BR<?> br = bo.addUser(new User());
if( br.isSuccess() ){

//do something success
}else{
//failure
System.out.println("add user failed, because: " + br.getError());
}
}


大家来这两种方法可行吗?
qusic 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jinxfei 的回复:]

额,为什么一定要用到ThreadLocal?

你觉得多线程有什么问题啊。
[/Quote]
一般情况下BO是不会在使用的时候再去new一个吧?
BO一般也是单态的,当多个用户同时请求login的时候
必定会有多个线程同时访问UserBo的login方法,你说这个时候
public String getErrorMsg(){
return errMsg;
}
这个方法还安全吗?
当然,如果每个请求就new一次UserBO就不存在这个问题
lvfeng19806001 2009-05-29
  • 打赏
  • 举报
回复
顶9楼
抽风的凹凸曼 2009-05-29
  • 打赏
  • 举报
回复
我也只知道dao多了用bo封装是件很舒服的事~~
  • 打赏
  • 举报
回复
我认为对于登录的错误信息没有必要提示得很明确,直接给出“用户名或密码错误”就可以了,这样会更为安全一些。
加载更多回复(31)

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧