zoukankan      html  css  js  c++  java
  • JDBC及Filter

    JNDI容器:Java Naming Directory Interface,java命名目录接口
    EJB:javaEE服务器端组件模型,Enterprise JavaBean,设计目标与核心应用是建立分布式应用程序。简单点说,就是将已经开发好的程序(java类)打包放在服务器上执行
    具有跨平台的优势,是javaEE的一部分,用于开发基于组件的企业多重应用程序标准
    链接数据库时候,程序员不需要关系“具体的数据库后台是什么,JDBC驱动是什么,JDBC URL是什么,链接数据库的用户名和口令是什么”,
    以上这些可以交给j2EE容器来配置和管理,程序员需要做的就是对这些配置和管理进行引用即可。
    采用JNDI配置数据库,在j2EE中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称,之后,在程序中,通过数据源名称引用数据源访问后台数据库
    JNDI引用数据源的方式,当数据库信息发生变化时(数据库类型、数据驱动、用户名、密码等),直接修改数据源的配置文件mysql-db.xml就可以了,只要保证数据源的名称不变化,那么程序源代码就无需更改了
    JNDI避免了程序和数据库之间的紧耦合,更加易于配置管理和部署
    数据库连接池的使用:DBCP
    1.导入jar包,commons-dbcp.jar,commons-pool.jar
    2.添加配置文件,dbcpconfig.properties
    3.编写工具类
    public class DBCPUtil{
    private static DataSource dataSource;
    static{
    try{
    // 读取配置文件,初始化数据
    InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
    Properties props = new Properties();
    props.load(in);
    dataSource=BasicDataSourceFactory.createDataSource(props);

    }catch(Exception e){
    throw new ExceptionInInitializerError(e);
    }
    }
    private static DataSource getDataSource(){
    return dataSource;
    }
    private static Connection getConnection(){
    try{
    return dataSource.getConnection();
    }catch(SQLException e){
    throw new RuntimeException("获取数据库连接失败")
    }
    }
    }
    dbcpconfig.properties配置文件的内容
    driverClassName:com.mysql.jdbc.Driver
    url:jdbc:mysql://localhost:3306/test
    username:root
    password:sorry
    // 初始化链接配置
    initialSize=10
    // 最多的活跃个数
    maxActive=50
    // 最大空闲连接数
    maxIdle=10
    // 最小空闲连接数
    minIdle=2
    // 最长等待时间(毫秒)
    maxWait=6000
    // 设置连接属性
    connectionProperties=useUnicode=true;characterEncoding=utf8
    // 指定由连接池所创建的链接的自动提交状态
    defaultAutoCommit=true
    // driver default 指定由连接池所创建的链接的只读状态,默认为readOnly
    defaultReadOnly=true
    // driver default 指定由连接池所创建的链接的事务的状态
    defaultTransactionIsolation=READ_COMMITTED

    在并发编程时候,成员变量如果不做任何处理其实是线程不安全的,各个线程都在操作同一个变量显然是不行的。
    那么,我们需要这样一种机制,变量是同一个,大家都可以拿到这个变量的初始值,也就是可以拿到这个变量的副本
    这种情况下,ThreadLocal就非常适合使用,这就可以用在数据库操作中,DAO数据库连接,它是单例模式,那么他的属性
    connection就不是线程安全的,而且每一线程都要使用它,各自使用各自的,在这样情况下ThreadLocal就派上用场了
    // ThreadLocal 线程安全局部变量
    public class ThreadLocal{
    private Map<Runnable,Object> map = new Map<Runnable,Object>;
    public void set(Object obj){
    map.put(Thread.currentThread(), obj);
    }
    public void remove(){
    map.remove(Thread.currentThread());
    }
    public Object get(){
    return map.get(Thread.currentThread());
    }
    }
    // 对于数据库DBCPUtil
    QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource());
    qr.update("insert into users values(?,?,?)",12,"a","b");
    qr.update("update users set name=? where id=?","zhang",2);
    qr.update("delete from users where id=?", "10");

    //过滤器,IE-》过滤器-》jsp-》转发-》最终回到客户
    执行过程:用户IE->Tomcat->web.xml(过滤器配置)->Filter处理->Servlet/JSP->Tomcat->用户
    String ans = request.getParameter("name"):
    response.getWriter().write("nihao");
    response.getWriter().write(name);
    过滤器是对请求和相应的拦截,获取你想获取的东西
    针对拦截范围内的资源的访问,每次访问都会由容器调用doFilter方法
    过滤器的实现步骤:
    1.编写一个类,实现java.servlet.Filter方法
    public class Demo1 implements Filter{
    public void init(FilterConfig filterConfig){

    }
    public void doFiler(ServletRequest req, ServletResponse res, FilterChain chain){
    System.out.println("commit");
    chain.doFilter(req, res);//放行,让下一个上
    }
    public void destroy(){

    }
    }
    2.编写web.xml配置文件
    <filter>
    <filter-name>Demo1</filter-name>
    <filter-class>com.deng.example.Demo1</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>Demo1</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    对于多个过滤器会有过滤顺序,那么在配置文件web.xml中,标签出现的顺序就是过滤顺序
    在web项目中,当用户输入的URL中有不存在的servlet,html,jsp等资源时候,那么web.xml中的<welcome-file-list>标签元素就指定默认的访问页面
  • 相关阅读:
    高并发处理(一)页面静态化
    高并发处理(二)图片服务器分离
    五百强企业某部门视频面试题汇总
    access和sqlyog的使用
    条件查询
    primary select |||| case primary select
    win10 + ubuntu16 双系统安装
    ubuntu16 下安装python3.6 和Anaconda3
    import nltk nltk.download('reuters') [nltk_data] Error loading reuters: <urlopen error [Errno 11004] [nltk_data] getaddrinfo failed>
    共现矩阵
  • 原文地址:https://www.cnblogs.com/demo-deng/p/8136976.html
Copyright © 2011-2022 走看看