7使用分层实现业务处理
-
问题:
- 什么是连接池?为什么要使用连接池?
- 什么是JNDI?JNDI可以做什么?
- 使用JNDI获取资源的关键代码是什么?
- 在Tomcat中配置数据源所涉及的文件和标签是什么?
- 在分层模式中,三层指的是哪三层?
-
任务
- 实现在Web应用中访问Tomcat中发布的信息
- 使用JNDI查找新闻发布系统数据源
- 使用三层架构实现删除新闻主题,删除新闻和单挑新闻显示的功能
- 掌握数据库连接池原理
- 熟练应用分层架构开发应用系统
-
JNDI简介
- 什么时JNDI?
- Java Nameing and Directory Interface,Java 命名和目录接口
- 通过名称将资源与服务器进行关联
- 什么时JNDI?
-
- 它的作用和优点
- 在应用与Java对象或资源之间建立松耦合的逻辑关联,简化应用对于资源的配置和维护工作
- 可以在更大范围,不同应用之间共享资源
- 它的作用和优点
- JNDI的简单应用
如何实现在Tomcat中发布一条信息供所有的Web应用程序使用?
发布信息: 修改Tomcat\conf\context.xml文件
<Cintext>
<Environment name=”tjndi” value=”hello JNDI” type=”java.lang.String”/>
</Cintext>
tjndi -----JNDI查找的名称
获取资源: 使用lookup()进行查找
//javax.naming.Context提供了查找JNDI的接口
Context ctx=new InitialContext(); //初始化Context对象
//java:comp/env/为前缀
String testjndi=(String ) ctx.lookup(“java:comp/env/tjndi”); //调用lookup()方法
out.print(“JNDI:” +testjndi);
- 为什么使用连接池?
传统数据库连接方式的不足:
-
-
- 需要经常与数据库建立连接,在访问结束后必须关闭连接释放资源
- 当并发访问数量较大时候,执行速度收到极大影响
- 系统的安全性和稳定性相对较差
-
- 连接池技术原理
- DataSource与连接池
javax.sql.Data.Source接口的实现类
- 负责管理与数据库的连接
- 以连接池的形式对数据库连接进行管理
-
获取DataSource实例
- Tomcat支持将DataSource实现发布为JNDI资源
- Web应用通过JNDI获得DataSource引用
- 访问数据源-1
使用连接池实现数据库连接
- 访问数据源-2
<Context>
<Resource name="jdbc/news" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" username="newsu"
password="123456" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/newsmanagersystem?
useUnicode=true&characterEncoding=utf-8" />
</Context>
-
访问数据源-3
- 添加数据库驱动文件
- 把数据库驱动jar文件,加入到Tomcat的lib中
- 配置应用程序的web.xml文件
- 在web.sml中配置<resource-ref>
- 添加数据库驱动文件
- 访问数据源-4
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class BaseDao {
public Connection getConnection () {
Connection conn = null;
try { //获取与逻辑名相关联的数据源对象
Context ctx = new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/news");
conn = ds.getConnection();
} catch (SQLException exception) {
exception.printStackTrace();
} catch (NamingException namingException)
namingException.printStackTrace();
}
return conn;
}
}
- 小结
使用连接池实现数据库连接
- 为什么需要分层
JSP开发时分两层的弊端
- 三层模式
结构划分
- 层与层之间的关系
- 分层实现删除新闻主题-1
编写数据访问层组件
数据库连接的开闭由业务层统一管理
public class TopicsDaoImpl extends BaseDao implements TopicsDao {
// Connection对象由业务层通过构造方法注入
public TopicsDaoImpl(Connection conn) {
super(conn);
}
…… // 省略部分方法
}
- 分层实现删除新闻主题-2
编写业务逻辑层组件
封装业务流程并同意管理数据库连接和事务
try {
conn = DatabaseUtil.getConnection();
conn.setAutoCommit(false); // 关闭自动提交,开启事务
// 为DAO组件设置数据库连接对象,保证整个流程使用同一个Connection对象
NewsDao newsDao = new NewsDaoImpl(conn);
TopicsDao topicsDao = new TopicsDaoImpl(conn);
// 控制业务流程的执行
……
conn.commit(); // 执行成功,提交事务
} catch (SQLException e) {
……
conn.rollback(); // 出现异常,回滚事务
……
} finally { // 业务完成后统一关闭数据库连接
DatabaseUtil.closeAll(conn, null, null);
}
- 分层实现删除新闻主题-3
修改控制页面
<%…… // 省略部分代码
TopicsService topicsService = new TopicsServiceImpl();
if ("del".equals(opr)) { //删除主题
String tid = request.getParameter("tid");
int result = topicsService.deleteTopic(Integer .parseInt(tid));
if (result == -1) {
out.print("<script type=\"text/javascript\">");
out.print("alert(\"该主题下还有文章,不能删除!\");");
out.print("location.href=\"topic_control.jsp?opr=list\";");
out.print("</script>");
} else if (result == 0) {
……
}
……
} …… // 省略其他操作代码
%>
-
分层原则
- 上层依赖下层,依赖关系不夸层
- 表示层不能直接访问数据访问层
- 上层调用下层的结果,取决于下层的实现
- 下一层不能调用上一层
- 下一层不依赖上一层
- 上层的改变不会影响下一层
- 下层的改变会影响上一层得到的结果
- 在上一层中不饿能出现下一层的概念
- 分工明确,各司其职
- 上层依赖下层,依赖关系不夸层
- 小结
- 总结