JNDI

  • Java命名与目录接口

配置

tomcat/conf/context.xml配置:

    <Environment  name="jndiName"  value="jndiValue" type="java.lang.String" />

JSP中使用

  <%
    Context ctx =  new InitialContext() ;
    String testJndi =  (String)ctx.lookup("java:comp/env/jndiName");
    out.print(testJndi);
  %>

连接池

  • 数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
  • 创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。
  • 常见连接池:Tomcat-dbcp、dbcp、c3p0、druid
  • 可以用数据源(javax.sql.DataSource)管理连接池

Tomcat-dbcp

配置数据源(context.xml)

类似jndi,在context.xml中配置数据库

    <Resource name="student" auth="Container" type="javax.sql.DataSource" 
        maxActive="400" 
        maxIdle="20"  maxWait="5000"  username="scott" password="tiger" 
driverClassName="oracle.jdbc.driver.OracleDriver"  url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" />

指定数据源(web.xml)

在项目的 web.xml中配置

    <resource-ref>
        <res-ref-name>student</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

用数据源

通过数据库获取 Connection

  • 更改连接对象Connection的获取方式
传统JDBC方式
connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
数据源方式
Context ctx = new InitialContext() ;//context.xml
DataSource ds = (DataSource)ctx.lookup("java:comp/env/student") ;
connection = ds.getConnection();

DBCP连接池

  • 用连接池的核心:将连接的指向改了,现在指向的是数据源而不是数据库。

BasicDataSource方式(硬编码)

DasicDataSource对象设置各种数据

    //获取dbcp方式的ds对象
    public static DataSource getDataSourceWIthDBCP(){
        BasicDataSource dbcp = new BasicDataSource();
        dbcp.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        dbcp.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCL");
        dbcp.setUsername("scott");
        dbcp.setPassword("tiger");
        dbcp.setInitialSize(20);
        dbcp.setMaxActive(10);
        return dbcp;
    }

BasicDataSourceFactory方式

配置方式(.properties文件, 编写方式key=value)dbcpconfig.properties

    public static DataSource getDataSourceWIthDBCPByProperties() throws Exception{
        DataSource dbcp = null ;
        Properties props = new Properties();
        InputStream input = new DBCPDemo().getClass().getClassLoader().getResourceAsStream("dbcpconfig.properties");
        props.load(input);
        dbcp = BasicDataSourceFactory.createDataSource(props);
        return dbcp;
    }

C3P0

两种方式:硬编码,配置文件 合二为一 ,通过ComboPooledDataSource的构造方法参数区分:如果无参,硬编码;有参,配置文件。

  1. 无参,硬编码

        ComboPooledDataSource c3p0 = new ComboPooledDataSource();
        c3p0.set...();
  2. 有参,配置文件(c3p0-config.xml)

    public static DataSource getDataSourceWithC3P0() {
        ComboPooledDataSource c3p0 = new ComboPooledDataSource();
        try {
            c3p0.setDriverClass("oracle.jdbc.driver.OracleDriver");
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        c3p0.setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCL");
        c3p0.setUser("scott");
        c3p0.setPassword("tiger");
        return c3p0;
    }

    public static DataSource getDataSourceWithC3P0ByXml() {
        ComboPooledDataSource c3p0 = new ComboPooledDataSource("name");
        return c3p0;
    }

Apache DBUtils

DbUtils是一个小型的类库,它设计用于使JDBC编程更加方便、简单。JDBC编程中,资源的关闭是显式的,极易导致编程错误,DbUtils把这些清理工作抽象出来,使得程序员编程时仅需要关心真正需要关心的,即:query和update数据。

没详细学,以后填坑

自定义标签

编写标签处理类

  • 传统方式(JSP1.1):实现 javax.servlet.jsp.tagext.Tag接口 doStartTag()
  • 简单方式(JSP2.0):实现 javax.servlet.jsp.tagext.SimpleTag接口 doTag()
  • 如果jsp在编译阶段 发现了自定义标签 <xx:yy>,就会交给 doStartTag()doTag()

编写标签描述符tld

<?xml version="1.0" encoding="UTF-8"?>

<!-- 标签库的头文件-->
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">

    <description>标签库描述</description>
    <tlib-version>1.0</tlib-version>

    <short-name>xxx</short-name>
    <uri>标签库的uri</uri>

    <!-- -自定义标签的相关信息 -->
    <tag>
        <description>标签描述</description>
        <name>标签名</name>
        <tag-class>标签的处理</tag-class>
        <body-content>标签提的类型</body-content>
    </tag>
 
</taglib>
  • 写标签处理类

导入并使用

  • 位置:myTag.tld导入WEB-INF或子目录下WEB-INF/abc/ (特例排除,不能是WEB-INF/lib、WEB-INF/classes)
  • 使用:引入具体要使用的.tld文件 <%@ taglib uri="..." prefix="d" %>

    • uri:每个tld文件的唯一描述符
    • prefix:使用tld标签时的前缀
  • 当JSP容器(Tomcat、jetty)在将.jsp翻译成.servlet(.java)的时候 ,如果遇到JSP中有标签,就会依次执行setPageContext() setParent() doStartTag() doEndTag() realease(),用于解析标签的执行逻辑。

传统方式和简单方式。
简单方式:

public class LoginTag extends SimpleTagSupport {

    @Override
    public void doTag() throws JspException, IOException {
        //判断是否已经登录成功
        PageContext pageContext = (PageContext)getJspContext() ;
        HttpSession session = pageContext.getSession();
        String name = (String)session.getAttribute("name") ;
        if(name !=null){
            //执行一次标签体
            getJspBody().invoke(null) ;
        }
    }
}
  • 简单标签方式,获取JSP内置对象:getJspContext -> JspContext -> 转成子类PageContext -> PageContext就是所有JSP内置对象的入口,即可以获取一切JSP内置对象。

参考链接:




扫一扫在手机打开当前页