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.xm
l中配置
<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的构造方法参数区分:如果无参,硬编码;有参,配置文件。
无参,硬编码
ComboPooledDataSource c3p0 = new ComboPooledDataSource(); c3p0.set...();
- 有参,配置文件(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内置对象。
参考链接:
版权属于:moluuser
本文链接:https://archive.moluuser.com/archives/45/
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。