大家来讨论下业务层(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)该做什么事?该怎样做事?
因为马上就要做项目了,我想在新项目里把功能做的更完善些。
呵呵,本人还是有点可用分的,如果在这里能得到有建设性的回答的话,我是不会吝啬那点点分滴。~
...全文
1560 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
老牛同学 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)
代码下载地址: https://pan.quark.cn/s/ee8627e4e6d7 ABAP调试器是一种功能强大的工具,可用于在执行期间对ABAP代码进行检验。除了常规的核心功能(例如逐行运行代码以及检验变量、字段符号和引用的值)之外,它还提供了一些辅助性的特性,能够简化并压缩调试会话的时长。并非所有使用者都熟悉这些辅助特性。SAP ABAP调试器是处理和优化ABAP代码开发与维护工作的核心资源,它配备了多样的功能来协助开发人员在运行状态下进行检验和排除故障。此资源着重阐述了ABAP调试器的一些高级特性,涵盖了深入分析调用堆栈、系统级调试、更新会话调试以及提升调试效率的方法。 1. **深入分析调用堆栈**:除了常规的应用程序调试,开发人员有时需要对调用堆栈的内部级进行深入调试,特别是在错误出现在异步执行的更新处理或系统级程序时。通过启用**系统级调试**,可以访问通常不公开的系统代码,但这也会导致调用堆栈的显著增加,因此需要审慎操作。 2. **系统级调试**:对于不含业务逻辑的系统级程序,开发人员通常无需进行调试。然而,在特定情形下,例如进行错误追踪时,可能需要进入系统代码。借助调试器的“系统调试启用/禁用”选项,可以赋予对系统程序的调试权限。 3. **更新会话调试**:在处理异步更新任务,例如持久化业务数据时,错误可能发生在更新任务内部。激活**更新会话调试**,在更新任务完成后,调试器将自动启动,展示执行路径。比如,在变更成本中心后,通过输入调试指令 "/h" 启动调试,保存后能够看到更新过程中的错误。 4. **分析调用堆栈**:在进行深入调试时,调用堆栈是至关重要的。通过分析调用堆栈,能够定位到引发问题的具体位置,如在VB_V2_NORMAL...
内容概要:本文档为一项关于“价格型需求响应”背景下配电网供电能力综合评估的硕士论文复现资源,采用Python语言实现核心算法与模型。内容系统涵盖了需求侧响应机制建模、基于电价引导的负荷调整策略、配电网供电能力的量化评估方法,并通过编程仿真对实际配电系统进行分析,重点复现了原论文中的数学模型、优化求解流程及关键结果,旨在提升配电网运行效率与供电可靠性,同时为相关研究提供可复用的代码基础。; 适合人群:具备一定电力系统基础知识和Python编程能力的研究生、科研人员及从智能电网、需求响应、配电网规划等相关工作的技术人员。; 使用场景及目标:①复现并深入理解硕士论文中关于价格型需求响应与供电能力评估的理论模型与实现方法;②应用于学术研究、课程设计或科研项目,开展需求响应策略仿真与配电网承载力分析;③作为科研参考,支撑高水平论文撰写、课题申报及算法二次开发。; 阅读建议:建议结合文档中的代码逐行调试,深入理解优化模型的构建逻辑与求解过程,同时可对比相关Matlab版本实现,以全面掌握不同编程环境下算法实现的异同,进而深化对技术细节与工程应用的理解。

81,111

社区成员

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

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