7使用分层实现业务处理

  1. 问题:
    1. 什么是连接池?为什么要使用连接池?
    2. 什么是JNDI?JNDI可以做什么?
    3. 使用JNDI获取资源的关键代码是什么?
    4. 在Tomcat中配置数据源所涉及的文件和标签是什么?
    5. 在分层模式中,三层指的是哪三层?

 

  1. 任务
    1. 实现在Web应用中访问Tomcat中发布的信息
    2. 使用JNDI查找新闻发布系统数据源
    3. 使用三层架构实现删除新闻主题,删除新闻和单挑新闻显示的功能
    4. 掌握数据库连接池原理
    5. 熟练应用分层架构开发应用系统

 

  1. JNDI简介
    1. 什么时JNDI?
      • Java Nameing and Directory Interface,Java 命名和目录接口
      • 通过名称将资源与服务器进行关联

 

    1. 它的作用和优点
      • 在应用与Java对象或资源之间建立松耦合的逻辑关联,简化应用对于资源的配置和维护工作
      • 可以在更大范围,不同应用之间共享资源
  1. 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);

  1. 为什么使用连接池?

传统数据库连接方式的不足:

      • 需要经常与数据库建立连接,在访问结束后必须关闭连接释放资源
      • 当并发访问数量较大时候,执行速度收到极大影响
      • 系统的安全性和稳定性相对较差

 

  1. 连接池技术原理

  1. DataSource与连接池

javax.sql.Data.Source接口的实现类

  1.  负责管理与数据库的连接
  2.  以连接池的形式对数据库连接进行管理
  1. 获取DataSource实例
    1. Tomcat支持将DataSource实现发布为JNDI资源
    2. Web应用通过JNDI获得DataSource引用

 

  1. 访问数据源-1

使用连接池实现数据库连接

 

  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>

  1. 访问数据源-3
    1. 添加数据库驱动文件
      • 把数据库驱动jar文件,加入到Tomcat的lib中
    2. 配置应用程序的web.xml文件
      • 在web.sml中配置<resource-ref>

 

  1. 访问数据源-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;

     }  

}

  1. 小结

使用连接池实现数据库连接

 

  1. 为什么需要分层

JSP开发时分两层的弊端

 

  1. 三层模式

结构划分

  1. 层与层之间的关系

 

  1. 分层实现删除新闻主题-1

编写数据访问层组件

数据库连接的开闭由业务层统一管理

public class TopicsDaoImpl extends BaseDao implements TopicsDao {

  // Connection对象由业务层通过构造方法注入

    public TopicsDaoImpl(Connection conn) {

        super(conn);

    }

    …… // 省略部分方法

}

 

  1. 分层实现删除新闻主题-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);

}

 

 

  1. 分层实现删除新闻主题-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) {

                ……

            }

            ……

    } …… // 省略其他操作代码

%>

 

 

  1. 分层原则
    1. 上层依赖下层,依赖关系不夸层
      • 表示层不能直接访问数据访问层
      • 上层调用下层的结果,取决于下层的实现
    2. 下一层不能调用上一层
    3. 下一层不依赖上一层
      • 上层的改变不会影响下一层
      • 下层的改变会影响上一层得到的结果
    4. 在上一层中不饿能出现下一层的概念
      • 分工明确,各司其职
  2. 小结

 

  1. 总结

发布了65 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/kxindouhao5491/article/details/83443344