三层结构
- 用户界面层 --显示输入数据
- 业务逻辑层 --计算处理数据
- 数据访问层 --持久化数据
- 解耦:接口分离原则
1. 业务逻辑:接口-实现类
2. 数据访问:接口-实现类
- servlet:用户界面层
- service:业务逻辑层
- dao: 数据访问层
- entity: 实体类
- core: 辅助类
模板方法设计模式
- BaseDao类 定义最基本公共操作
- XXXDao接口 继承BaseDao接口
- DaseDaoImpl 实现类 实现BaseDao接口
- XXXDaoImpl实体类 继承BaseDaoImpl
graph LR
B(XXXDao)-->A(BaseDao)
c(BaseDaoImpl)-->A
d(XXXDaoImpl)-->B
d-->c
单元测试
- 新建源代码文件夹:test (标记好属性)
- 在test中添加测试类:Test+目标类类名
- 断言结果
异常分类
- 相应的异常类去继承Exception
- 类别:
- 可以再一次进行操作的异常 --RetryException
- 只能显示错误信息的异常 --BusinessException
- 必须处理的异常 --MustDealException
处理事务以及事务封装
事务 持久化数据时更安全干净
JDBC完成事务处理
1> Connection
2> 开启事务:
con.setAutoCommit(boolean)
默认为true:自动提交事务
false:人工处理事务
3> 多次创建执行Statement对象
4> 没有异常,提交事务
con.commit()
5> 有异常,回滚事务
con.rollback();
6> 关闭资源
保证同一个进程中 只有一个Connection连接对象
使用ThreadLocal类容器
//封装开启事务,提交事务和回滚事务的方法
public static void beginTrans() throws Exception{
getConnection().setAutoCommit(false);
}
public static void commitTrans() throws Exception{
getConnection().commit();
}
public static void rollbackTrans() throws Exception{
getConnection().rollback();
}
try {
con = JDBCUtils.getConnection();
System.out.println(con);
//开启事务处理
con.setAutoCommit(false);
String s1= "insert into records(account,optype,amount) values('"+no+"',1,"+amount+");";
pst = con.prepareStatement(s1);
pst.executeUpdate();
//int x = 10/0;
String s2 = "update accounts set balance=balance+"+amount+" where account='"+no+"'";
p2= con.prepareStatement(s2);
p2.executeUpdate();
//没有异常发送 提交事务
con.commit();
} catch (Exception e) {
//发生了异常 回滚事务
con.rollback();
}
过滤器
一个servlet对应一个地址
- 过滤器适用场景
- 多个servlet都需要的功能,提到过滤器 设置编码 处理异常公共 10天内免登陆等
- servlet和一个地址对应,有的功能不适于和一个地址对应
- 过滤器作用:客户端发来的地址请求到达服务器 地址首先被过滤器(链)拦截处理 再转到相应的servlet
- 编写过滤器:
- 编写一个类,实现javax.servlet.Filter过滤器接口。
- 生命周期方法:
init:初始化
doFilter:过滤每个请求,具体过滤操作
destroy:销毁 - 为要使用过滤器的servlet在web.xml文件中配置 或者使用注解在servlet中配置
版权声明:本文为zy_com原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。