JDBC操作原理:
(1)加载数据库驱动程序,数据库驱动程序通过classpath配置。
(2)通过DriverManager类取得数据库连接对象
(3)通过Connection实例化PreparedStatement对象,编写SQL命令操作数据库
(4)数据库属于资源操作,操作完成后要关闭数据库以释放资源。
数据库连接时需要建立多次连接。在使用JDBC连接数据库时,程序会进行多个Socket连接操作,这种传统的数据库操作性是很低的。
数据源操作的核心原理就是,在一个对象池中保存多个数据库的连接(也称为数据库连接池,Connection Pool),这样以后再进行数据库操作时,直接从连接池中取出一个数据库连接,当数据库操作完成后,再将此连接放回到数据库连接池中,等待其他用户继续使用。在此过程中需要考虑几个问题:最小连接数、最大连接数、最大等待时间。
在Web容器中,数据库的连接池都是通过数据源(javax.sql.DataSource)访问的,即可以通过javax.sql.DataSource类取得一个Connection对象,但是要想得到一个DataSource对象需要使用JNDI进行查找。(JNDI:java naming and directory interface,Java命名即目录接口,是Java EE提供的一个服务,其服务的主要功能就是通过一个名称的“key”查找到对应的一个对象“value”。)
一定要配置数据库驱动程序,即将数据库驱动程序复制到%TOMCAT_HOME%\common\lib文件夹中。其中有两种连接数据库的方法:
(1)Container:容器将代表应用程序登录到资源管理器,一般使用此方法
(2)Application:应用程序必须程序化地登录到资源管理器。
数据源的操作使用JNDI方式进行查找,所以如果使用数据源取得数据库连接,则必须按照如下步骤进行:
(1)初始化名称查找上下文:Context ctx = new InitialContext();
(2)通过名称查找DataSource对象:DataSource ds = (DataSource)ctx.lookup(JNDI名称);
(3)通过DataSource取得一个数据库连接:Connection conn = ds.getConnection();
完成一个标签的开发需要具有以下几个部分:
(1)标签处理类
(2)标签描述文件
(3)JSP页面
(4)(可选)在web.xml文件中配置映射名称
在一个标签的操作中*.tld是一个最重要的文件,所有标签的具体信息都要通过此文件定义,而此文件在导入时也是分为两种情况的。当一个JSP页面第一次运行时,首先会根据JSP文件编写的<%taglib%>中的uri属性找到对应的*.tld文件,并将其加载到JVM中;而如果是第二次运次此标签,由于JVM已经存在与此*.tld文件,所以不会再重复加载。
关于TLD中的<rtexprvalue>元素。<rtexprvalue>元素的主要功能是定义format属性是否支持表达式输出,如果设置成了true,则可以通过如下的代码设置format属性的内容:
<% pageContext.setAttribute("fm","yyyy-MM-dd HH:mm:ss.SSS"); %>
<mytag:date format="${fm}"/>
或者使用“<%=%>”的形式输出format属性的内容:
<% String str = "yyyy-MM-dd HH:mm:ss.SSS"; %>
<mytag:date format="<%=str%>"/>
而如果将此属性设置成了false,则是无法在此处使用表达式输出的,否则程序将出现异常。
标签的实现都需要继承TagSupport这个类。该类是整个标签编程的一个核心类。TagSupport类同时实现了IterationTag和Serializable两个接口。IterationTag本身又是Tag接口的子接口。在整个TagSupport类中,doStartTag()、doEndTag()、doAfterTag()和release()4个方法是最重要的方法。
BodyTagSupport是TagSupport类的子类,通过继承BodyTagSupport类实现的标签可以直接处理标签体内容的数据。BodyTagSupport类实现了BodyTag接口。
<body-content>元素可以设置的内容有3中,主要的功能是指定标签体的类型,可能的取值有以下4种:empty、JSP、scriptless、tagdependent。
DynamicAttributes接口的主要功能是用于完成动态属性的设置,即用户在使用一个标签时可以根据自己的需要,任意设置多个属性。但是要想实现动态属性,仅靠一个DynamicAttributes接口是不够的,还需要配置标签描述文件,在其中增加设置动态属性的操作。
在JSP2.0之后为了方便标签处理类的开发,提供了SimpleTagSupport类,用户开发时可以避免处理各个方法的返回值问题,而直接在doTag()方法中编写标签处理即可。