设为首页 收藏本站
查看: 350|回复: 0

[经验分享] 深入Tomcat:JNDI在TOMCAT中的应用

[复制链接]

尚未签到

发表于 2017-1-17 06:40:17 | 显示全部楼层 |阅读模式
  

JNDI在TOMCAT中的应用 
在J2EE应用中,JNDI可以简化开发者的工作。而TOMCAT则使用户可以很方便的使用JNDI来开发自己的应用。 
一.JNDI的配置 
用户只需要配置TOMCAT的$CATALINA_HOME/CONF/SERVER.XML和/WEB-INF/WEB.XML这两个文件就可以轻松的使用JNDI来进行bean的调用和数据库资源的使用了。 
首先,需要在/WEB-INF/WEB.XML中通过以下几个元素来声明自己的引用: 
1.<env-entry>:该值用来指定应用运行的环境入口; 
2.<resource-ref>:该值用来指定所引用的资源,这些资源必须是在TOMCAT中指定的,比如:JDBC datasource,JmailSession等等; 
3.<resource-env-ref>基本同resource-ref,但不需要增加一个权限的控制参数。 
然后,用户的应用配置完成以后,将被发布到TOMCAT,此时,所有指定的资源都被放JNDI名字空间的java:comp/env位置,用户可以在自己的应用程序中通过以下的代码取得: 



// Obtain our environment naming context
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
// Look up our data source
DataSource ds = (DataSource)
envCtx.lookup("jdbc/EmployeeDB");
// Allocate and use a connection from the pool
Connection conn = ds.getConnection();
... use this connection to access the database ...
conn.close();
 
最后,用户需要在server.xml中配置JNDI的资源信息,该配置通过对以下几个参数的赋值来实现: 
1.<environment>:声明通过JNDI上下文引用的资源的名,必须要在web.xml中声明的一致; 
2.<Resource>:配置应用程序能够正常引用到的资源的名称和数据类型; 
3.<ResourceParams>:配置了所使用的资源工厂运行的类的名称或者用来配置那个资源工厂的JAVABEAN的属性; 
4.<ResourceLink>:增加一个在全局JNDI上下文中定义的资源的连接。 
上面几个属性的任何一个必须在<Context>或<DefaultContext>标签中定义。 
另外,需要配置在web.xml中的所有<env-entry>元素的名字和值最好出现在初始化上下文中,这样当环境允许时(override 属性为”true”时就会覆盖server.xml中相应的值。

二.TOMCAT中的标准资源工厂 
TOMCAT中提供了一系列标准的资源工厂来想应用系统提供服务,同时提供给你配置上的弹性。 
1. Javabean资源 
以下程序生成一个JAVABEAN 

 

package com.mycompany;
public class MyBean {
private String foo = "Default Foo";
private int bar = 0;
public String getFoo() {
return (this.foo);
}
public void setFoo(String foo) {
this.foo = foo;
}
public int getBar() {
return (this.bar);
}  
public void setBar(int bar) {
this.bar = bar;
}
}
   以下是在web.xml中的配置: 

<resource-env-ref>
<description>
Object factory for MyBean instances.
</description>
<resource-env-ref-name>
bean/MyBeanFactory
</resource-env-ref-name>
<resource-env-ref-type>
com.mycompany.MyBean
</resource-env-ref-type>
</resource-env-ref>
   以下是在应用系统中调用这个资源的代码: 
  


Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");
writer.println("foo = " + bean.getFoo() + ", bar = " + bean.getBar());
   以下是配置TOMCAT的资源工厂: 
  


<Context ...>
...
<Resource name="bean/MyBeanFactory" auth="Container" type="com.mycompany.MyBean"/>
<ResourceParams name="bean/MyBeanFactory">
<parameter>
<name>factory</name>
<value>org.apache.naming.factory.BeanFactory</value>
</parameter>
<parameter>
<name>bar</name>
<value>23</value>
</parameter>
</ResourceParams>
...
</Context>
 
2. JavaMail Sessions 
在WEB应用中,发送电子邮件和消息是系统功能的不好或却的一部分,而JavaMail就让这一部分的开发变的直截了当,但却需要很多细节上的配置,来告知系统一些必要的参数(比如:SMTP等)。 
TOMCAT包括了一个可以生成javax.mail.Session实例的标准资源工厂,并且被生成的实例已经和一个配置在server.xml中的SMTP相连接。这样,应用就可以完全和邮件服务器脱离关系,只是简单的接收,发送和配置消息。 
首先在需要在web.xml声明你需要预配置的JNDI的名称,如下: 
<resource-ref> 
<description> 
Resource reference to a factory for javax.mail.Session 
instances that may be used for sending electronic mail 
messages, preconfigured to connect to the appropriate 
SMTP server. 
</description> 
<res-ref-name> 
mail/Session 
</res-ref-name> 
<res-type> 
javax.mail.Session 
</res-type> 
<res-auth> 
Container 
</res-auth> 
</resource-ref> 
以下是在程序中调用该资源的代码: 
Context initCtx = new InitialContext(); 
Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
Session session = (Session) envCtx.lookup("mail/Session");

Message message = new MimeMessage(session); 
message.setFrom(new InternetAddress(request.getParameter("from")); 
InternetAddress to[] = new InternetAddress[1]; 
to[0] = new InternetAddress(request.getParameter("to")); 
message.setRecipients(Message.RecipientType.TO, to); 
message.setSubject(request.getParameter("subject")); 
message.setContent(request.getParameter("content"), "text/plain"); 
Transport.send(message);

以下就是在server.xml中配置TOMCAT的资源工厂: 
<Context ...> 
... 
<Resource name="mail/Session" auth="Container" type="javax.mail.Session"/> 
<ResourceParams name="mail/Session"> 
<parameter> 
<name>mail.smtp.host</name> 
<value>localhost</value> 
</parameter> 
</ResourceParams> 
... 
</Context>

3. JDBC 
许多应用都会通过JDBC使用数据库来实现一些功能。J2EE规范要求J2EE应用去实现一个DataSource接口来实现这个目的。TOMCAT4也同样遵循这个标准,这样你在上面开发的数据库应用就可以不用修改的在其他j2ee平台上使用。 
首先看看在web.xml中的配置: 
<resource-ref> 
<description> 
Resource reference to a factory for java.sql.Connection 
instances that may be used for talking to a particular 
database that is configured in the server.xml file. 
</description> 
<res-ref-name> 
jdbc/EmployeDB 
</res-ref-name> 
<res-type> 
javax.sql.DataSource 
</res-type> 
<res-auth> 
Container 
</res-auth> 
</resource-ref>

下面是对JNDI的应用的代码: 
Context initCtx = new InitialContext(); 
Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
DataSource ds = (DataSource) 
envCtx.lookup("jdbc/EmployeeDB"); 
Connection conn = ds.getConnection(); 
... use this connection to access the database ... 
conn.close();

在server.xml中的配置: 
<Context ...> 
... 
<Resource name="jdbc/EmployeeDB" auth="Container" 
type="javax.sql.DataSource"/> 
<ResourceParams name="jdbc/EmployeeDB"> 
<parameter> 
<name>username</name> 
<value>dbusername</value> 
</parameter> 
<parameter> 
<name>password</name> 
<value>dbpassword</value> 
</parameter> 
<parameter> 
<name>driverClassName</name> 
<value>org.hsql.jdbcDriver</value> 
</parameter> 
<parameter> 
<name>url</name> 
<value>jdbc:HypersonicSQL:database</value> 
</parameter> 
<parameter> 
<name>maxActive</name> 
<value>8</value> 
</parameter> 
<parameter> 
<name>maxIdle</name> 
<value>4</value> 
</parameter> 
</ResourceParams> 
... 
</Context>

参数说明: 
driveClassName:JDBC驱动类的完整的名称; 
maxActive:同时能够从连接池中被分配的可用实例的最大数; 
maxIdle:可以同时闲置在连接池中的连接的最大数; 
maxWait:最大超时时间,以毫秒计; 
password:用户密码; 
url:到JDBC的URL连接; 
user:用户名称; 
validationQuery:用来查询池中空闲的连接。 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-329367-1-1.html 上篇帖子: tomcat 的应用 下篇帖子: Maven + Tomcat热部署
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表