Tomcat 配置JNDI服务

Generic JavaBean Resources

【通过/WEB-INF/context.xml配置】

第一步,新建一个Bean

 

package model;

public class Foo {
	private String ip;
	private int port;
	private String signSequence;
	
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	public int getPort() {
		return port;
	}
	public void setPort(int port) {
		this.port = port;
	}
	public String getSignSequence() {
		return signSequence;
	}
	public void setSignSequence(String signSequence) {
		this.signSequence = signSequence;
	}
	@Override
	public String toString() {
		return "Foo [ip=" + ip + ", port=" + port + ", signSequence="
				+ signSequence + "]";
	}
	
	
}

 

第二步,在src/main/webapp/下创建META-INF目录,接着新建context.xml文件

 

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

<Context docBase="demo" path="/demo" reloadable="true">
	<Resource name="bean/Foo" auth="Container"
				type="model.Foo"
				factory="org.apache.naming.factory.BeanFactory"
				ip="10.0.0.1"
				port="9900"
				signSequence="111111"/>
</Context>

 

第三步,创建一个Servlet,在init()中进行JNDI资源的获取(容器启动时便开始获取资源)

 

package servlet;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import model.Foo;

public class InitServlet extends HttpServlet {

	@Override
	public void init() throws ServletException {
		try {
			Context initCtx = new InitialContext();
			Context envCtx = (Context)initCtx.lookup("java:comp/env");
			Foo foo = (Foo)envCtx.lookup("bean/Foo");
			System.out.println(foo);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
}

 

第四步,在web.xml中配置InitServlet

 

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
	<servlet>
		<servlet-name>InitServlet</servlet-name>
		<servlet-class>servlet.InitServlet</servlet-class>
		<load-on-startup>0</load-on-startup>
	</servlet>  
	<servlet-mapping>
		<servlet-name>InitServlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
</web-app>

 

第五步,Eclipse中通过Maven打包(clean package -DskipTests),并将war包添加到Tomcat Server中,启动服务

 

context.xml中配置将自动被拷贝到server.xml中的Engine/Host标签下

 

<Context docBase="demo" path="/demo" reloadable="true">
	<Resource auth="Container" factory="org.apache.naming.factory.BeanFactory" ip="10.0.0.1" name="bean/Foo" port="9900" signSequence="111111" type="model.Foo"/>
</Context>

 

【另一种配置,直接在server.xml中配置Context元素,在Eclipse中就不需要通过/WEB-INF/context.xml方式配置了,配置内容与上面的相同】

 

<Context docBase="demo" path="/demo" reloadable="true">
	<Resource auth="Container" factory="org.apache.naming.factory.BeanFactory" ip="10.0.0.1" name="bean/Foo" port="9900" signSequence="111111" type="model.Foo"/>
</Context>

 

 

Context Parameters

Environment Entries

Resource Definitions

以上3种资源配置都可以通过不同方式实现

1. 通过/WEB-INF/context.xml进行配置(此文件中的配置最终会被复制到对应的<Host/>中)

2. 直接在conf/server.xml对应的Host下使用Context标签进行配置

3. 直接在conf/context.xml(该配置文件中的内容会附加到所有应用中,范围太大)

 

仍基于第一种方式配置Parameter、Environment、Resource、ResourceLink

/WEB-INF/context.xml

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

<Context docBase="demo" path="/demo" reloadable="true">

	<!-- 只能配置字符串,通过ServletContext.getInitParameter()进行获取 -->
	<Parameter name="serverEnv" value="Test" description="Specify which environment is running"/>
	
	<!-- 可以配置各种java数据类型,通过JNDI获取 -->
	<Environment name="ThreadPoolSize" value="100"
         type="java.lang.Integer" override="false"/>
	
	<!-- 通过JNDI返回一个对象 -->
	<Resource name="bean/Foo" auth="Container"
				type="model.Foo"
				factory="org.apache.naming.factory.BeanFactory"
				ip="10.0.0.1"
				port="9900"
				signSequence="111111"/>
	<!-- 引用server.xml中GlobalNamingResources配置的Resource -->	
    <ResourceLink global="sharedDataSource" name="appDataSource" type="javax.sql.DataSource" /> 
</Context>

 

server.xml

数据源一般采用全局配置,所以在GlobalNamingResources中配置,

   当然也可以在/WEB-INF/context.xml中配置,导致仅当前项目可用,没有复用性

<GlobalNamingResources>	
		...

		<!-- 全局数据源配置 -->
		<Resource auth="Container" closeMethod="close"
			driverClassName="com.mysql.jdbc.Driver" maxActive="20" maxIdle="10"
			maxWait="10000" name="sharedDataSource" password="root"
			type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/electronic"
			username="root" />
</GlobalNamingResources>

 

获取JNDI资源

package servlet;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.sql.DataSource;

import model.Foo;

public class InitServlet extends HttpServlet {

	@Override
	public void init() throws ServletException {
		try {
			//通过JNDI获取Bean对象
			Context initCtx = new InitialContext();
			Context envCtx = (Context)initCtx.lookup("java:comp/env");
			Foo foo = (Foo)envCtx.lookup("bean/Foo");
			System.out.println(foo);
			
			//直接通过getServletContext().getInitParameter()获取Context中配置的Parameter
			String serverEnv = this.getServletContext().getInitParameter("serverEnv");
			System.out.println(serverEnv);
			
			//通过JNDI获取Environment
			int poolSize = (Integer)envCtx.lookup("ThreadPoolSize");
			System.out.println(poolSize);
			
			//通过JNDI获取数据源(Tomcat默认使用DBCP连接池管理Connection)
			DataSource ds = (DataSource)envCtx.lookup("appDataSource");
			Connection conn = ds.getConnection();
			Statement stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery("select count(*) from client");
			if(rs.next()) 
				System.out.println(rs.getInt(1));
			rs.close();
			stmt.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			
		}
		
	}
	
}

 注意:

 /WEB-INF/context.xml本身是不存在的,需要在/src/webapps目录下手动创建

 

如果通过/WEB-INF/context.xml创建,则该文件中的内容会自动拷贝到Tomcat的conf/server.xml中(对应的Host下)。

 

如果直接在conf/server.xml中的Host中配置JNDI,则不需要手动创建/WEB-INF/context.xml进行JNDI的配置

 

如果通过conf/context.xml进行配置,则不需要手动创建/WEB-INF/context.xml进行JNDI的配置(注意,该方式为全局配置,对所有应用都生效)

 

Eclipse中引入Tomcat后,workspace中会有一个Server文件夹

当Eclipse中设置Server Location为Tomcat Installation的情况下:

其中的server.xml与context.xml文件就是Tomcat的conf目录下的文件,对这2个文件的编辑等效于直接编辑conf目录下对应的文件

 

 

 

猜你喜欢

转载自just2learn.iteye.com/blog/2068000