BCSP-玄子Java开发之Java Web编程CH05_使用三层架构实现业务处理
JNDI
JNDI是什么
- Java Naming and Directory Interface:Java命名与目录接口
- 目录服务的Java API
JNDI能做什么
- 通过将名称与资源或服务进行关联,为查找和访问各种命名和目录服务提供通用、统一的接口
JNDI的作用与优点
- 简化应用对于资源的配置及维护工作可以在更大范围、不同应用之间共享资源
JNDI API
配置资源
- 修改Tomcat的context.xml文件,配置Environment环境变量
<Context>
<!-- 省略其他代码 -->
<Environment name="tjndi" value="hello!" type="java.lang.String"/>
</Context>
- name:环境变量的名称
- type:环境变量的Java类型全类名
- value:环境变量的值
在JSP页面编写代码,通过JNDI访问发布的信息
- 通过Context的lookup()方法查找资源
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ page import="javax.naming.*" %>
<%
//javax.naming.Context接口提供了查找JNDI Resource的接口
Context ctx = new InitialContext();
//java:comp/env/为前缀
String resource = (String) ctx.lookup("java:comp/env/tjndi");
out.print("test jndi:" + resource);
%>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PNip3Qnu-1687705823101)(./assets/image-20230625105704105.png)]
连接池
数据库连接技术回顾
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PISo4rUS-1687705823101)(./assets/image-20230625105826292.png)]
存在问题
- 重复创建、销毁数据库连接
- 并发访问数量较大时,执行速度受到极大影响
- 系统的安全性和稳定性较差
连接池技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Toqxwurq-1687705823102)(./assets/image-20230625105913124.png)]
使用连接池管理数据库连接
- 每次请求从连接池中获取数据库连接
- 处理结束后,将数据库连接归还到连接池
配置数据源
配置Tomcat安装目录/conf/context.xml文件
<Context><!--省略其它配置-->
<Resource name="jdbc/microblog" auth="Container" type="javax.sql.DataSource"
maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="root"
password="123456" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/microblog?useUnicode=true…"/>
</Context>
目录 | 说明 |
---|---|
name | 指定资源的JNDI名字 |
auth | 指定管理资源的Manager |
type | 指定资源所属的Java类型 |
maxTotal | 最大连接数,默认值为8,负数表示不受限制 |
maxIdle | 最大空闲连接数,默认值为8,设置为负数表示不受限制 |
minIdle | 最小连空闲接数,默认值为0 |
maxWaitMillis | 最大等待数 |
username | 指定连接数据库的用户名 |
password | 指定连接数据库的密码 |
driverClassName | 指定连接数据库的JDBC驱动程序 |
url | 指定连接数据库的URL |
不同的Web服务器设置数据源的方法也是不一样的
配置/WEB-INF/web.xml文件
<resource-ref>
<description>Microblog DataSource</description >
<res-ref-name>jdbc/microblog</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
目录 | 说明 |
---|---|
description | 引用资源说明 |
res-ref-name | 引用资源的JNDI名字,与元素中的name属性对应 |
res-type | 引用资源的Java类型,与元素中的type属性对应 |
res-auth | 指定管理引用资源的Manager,与元素中的auth属性对应 |
在Tomcat的lib目录中添加数据库驱动jar文件
编写代码,查找并获取数据源
- 通过lookup()方法查找数据源
public Connection getConnection() {
Context ctx;
try {
ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/microblog");
conn=ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
- 编写代码,测试从连接池中获取数据源
<%
BaseDao baseDao = new BaseDao();
Connection conn = baseDao.getConnection();
if(conn==null)
out.print("获取数据库连接失败");
else {
out.print("获取数据库连接成功");
baseDao.closeAll(conn, null, null);
}
%>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tkKnom1k-1687705823102)(./assets/image-20230625110355894.png)]
JNDI配置数据源常见错误-1
错误类型:无法加载驱动类
报错信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LxGoDmWA-1687705823102)(./assets/image-20230625110413322.png)]
错误原因:
- 缺少jar文件
- 驱动类名拼写错误
解决方案:
- 将JDBC驱动程序的jar文件添加到Tomcat的lib目录中
- 检查驱动类名拼写是否正确
JNDI配置数据源常见错误-2
错误类型:无法创建JDBC驱动
报错信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FhkMztBR-1687705823103)(./assets/image-20230625110630905.png)]
错误原因:
- 数据库驱动配置错误
解决方案:
- 检查context.xml文件中数据源的配置信息,确保配置信息完全正确
JNDI配置数据源常见错误-3
错误类型:属性名绑定错误
报错信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SebEm45n-1687705823103)(./assets/image-20230625110712722.png)]
错误原因:
- 获取配置信息值的key错误,须使用前缀(java:comp/env/)+数据源名称
解决方案:
- 检查代码,使用使用前缀(java:comp/env/)+数据源名称作为lookup()方法的参数
三层架构
两层架构
表示层
- 数据展示、收集
- 业务处
理数据访问层
- 业务处理
- 连接数据库
- 数据处理
存在问题
- 数据展示与业务处理混合、或者业务处理与数据处理混合
- 编码职责不清,修改时互相影响,难以扩展和重用
三层架构
表示层
- 数据展示
- 数据收集
- 用户交互
业务逻辑层
- 封装业务处理逻辑
- 事务管理
数据访问层
- 连接数据库
- 数据处理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q7qd6Tnd-1687705823103)(./assets/image-20230625110858523.png)]
各层之间的关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NuazJhyE-1687705823103)(./assets/image-20230625110937432.png)]
分层的目和原则
分层目的文章来源:https://uudwc.com/A/xWMkq
- 高内聚:每一层的组件具有内聚性
- 低耦合:有依赖关系的各层之间保持低耦合
分层原则文章来源地址https://uudwc.com/A/xWMkq
- 上一层依赖其下一层、依赖关系不跨层
- 表示层不能直接访问数据访问层
- 上层调用下层的结果,取决于下层的实现
- 下一层不能调用上一层
- 下一层不依赖上一层
- 上层的改变不会影响下一层
- 下层的改变会影响上一层得到的结果
- 在上一层中不能出现下一层的内容
- 分工明确,各司其职
三层架构的优势
- 职责划分清晰
- 无损替换
- 代码复用率高
- 系统内部的依赖程度低