Copyright 2016 by 蔡舒啸 保持署名-非商业性使用-相同方式共享 Creative Commons BY-NC-ND 3.0
中间件 - 通过中间件, 各种编程语言之间, 甚至各种异构的系统之间都可以相互通信, 比如, php项目访问Java中间件的网址, 如http://127.0.0.1:8080/WebApp并获得返回值. 这种跨编程语言的调用太方便了!
小项目,或者是个人开发tomcat,apache hpptd, jboss,glasshfish,jetty;
大型的项目(基于EJB)就用JBOSS,webloigc/webshere
文件结构如下:
${tomcat目录}
|--bin/
|--conf/
| |--context.xml
| |--server.xml
| |--tomcat-users.xml
| +--web.xml
|
|--lib/
|--logs/
+--webapps/
其中,bin/是启动tomcat的脚本startup.bat
webapps/是项目war包的位置
conf/是tomcat全局配置文件的位置
请看http://www.cnblogs.com/xing901022/p/4463896.html
部署时,涉及到一个变量appBase。这个变量标识了一个目录,该目录存放着部署的web应用。
一般默认情况下,appBase为CATALINA_HOME/webapps,配置信息位于server.xml中。
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
appBase指定了部署的目录;
autoDeploy设置是否自动部署(下小节动态部署中会介绍);
unpackWARs设置了部署的形式,如果为true,则会以展开的形式部署;如果为false,则会以war包的形式部署。
文档中说明了不同种类的应用的部属顺序。
1 有context配置的应用优先启动;
2 以目录形式部署的应用随后启动;
3 以war文件部署的应用最后启动。
同时修改tomcat启动配置tomcat/bin/catalina.bat和/bin/setclasspath.bat,分别增加
set JAVA_HOME=xxxxx
可以指定启动的JDK版本
本文的重点就是conf/目录下各个xml文件的配置
Host name="localhost" appBase="webapps"
unpackWARs="false"
autoDeploy="true"
xmlValidation="false"
xmlNamespaceAware="false"
JNDI - Java Name and Directory Interface(Java名字和目录接口),说人话就是,有一个姑娘叫小芳,“小芳”是姑娘在JNDI中定义的名字,我们通过“小芳”就找到了姑娘,然后我们可以和姑娘聊天,约会。
我们以添加一个JNDI中叫做“foo”的数据库JDBC链接为例:
配置JNDI需要修改conf/context.xml和conf/server.xml
<Context>
<WatchedResource>WEB-INF/web.xmlWatchedResource>
<ResourceLink global="foo" name="foo" type="javax.sql.DataSource"/>
Context>
<Server port="8005" shutdown="SHUTDOWN">
<GlobalNamingResources>
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
<Resource auth="Container" name="foo" driverClassName="org.postgresql.Driver" maxActive="100" maxIdle="30" maxWait="10000" password="xxxx" type="javax.sql.DataSource" url="jdbc:postgresql://xxx.xxx.xxx.xxx:xxxx/xxxx" username="xxxx"/>
GlobalNamingResources>
Server>
如何使用呢?
以Spring框架为例子,在WEB-INF/[项目名]-servlet.xml中添加:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd">
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"
lazy-init="true">
<property name="jndiName" value="name="foo" />
<property name="resourceRef" value="true" />
bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource" />
property>
bean>
beans>
在代码里使用
@Service
public class Api1_ProjectDetail extends AbstractSPService{
@Autowired
private JdbcTemplate jdbcTemplate; // 通过JdbcTemplate获得tomcat配置好的JNDI:"foo"数据库资源
public String anyMethod(String... paras) {
Connection conn = null;
try{
conn =jdbcTemplate.getDataSource().getConnection();
}catch(Exception e){
//
} finally {
if(conn!=null){
conn.close();
}
}
}
}
转自http://www.cnblogs.com/mabaishui/archive/2011/07/14/2106469.html
近日客户要求对tomcat配置文件context的数据库用户名和密码加密。
解密程序已写好,只需在取得用户名密码的时候调用解密程序即可。
context配置如下:
<Context path="/web" docBase="E:\izumi_workspace\izumi\WebContent" reloadable="false">
<Resource
name="jdbc/izumidb1"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
password="67461e40361806c4"
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
maxIdle="10"
maxWait="5000"
username="67461e40361806c4"
removeAbandoned="true"
removeAbandonedTimeout="60"
validationQuery="select count(*) from izumi_user"
logAbandoned="true"
url="jdbc:microsoft:sqlserver://XX.XXX.XX.XXX:1433;DataBaseName=test2"
maxActive="30"/>
Context>
为何要修改tomcat代码?
程序中使用这种方式取得Resource中定义的数据库
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup("jdbc/izumidb1");
因为javax.sql.DataSource是一个接口,是tomcat实现了这个接口,所以解密过程需要修改tomcat的代码。
修改哪里?
修改org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory的createDataSource()方法即可。
在apache.org找到 BasicDataSourceFactory的源码(最好是你当前使用的tomcat的版本的源码)
自建 org.apache.tomcat.dbcp.dbcp包,把BasicDataSourceFactory源码扔到包里,如果源码有import到其他类,把其他类也扔到包里,做解密修改。
修改完后放哪里?
在tomcat/common/lib中有关于dbcp的包,不同版本的tomcat可能包名不同。找到org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory所在的包,将编译好的我们的BasicDataSourceFactory类的.class文件放到包里,覆盖原来的BasicDataSourceFactory.class。
For example, to add the manager-gui role to a user named tomcat with a password of s3cret, add the following to the config file listed above.
<role rolename="manager-gui"/>
<user username="tomcat" password="s3cret" roles="manager-gui"/>
配置好了重启tomcat,就可以通过 http://localhost:8080/manager/html页面配置tomcat了,包括上传war包
每个WebApp项目都有一个自己的web.xml,位于[项目名]/WEB-INF/web.xml
tomcat/conf/web.xml顾名思义和项目里的web.xml功能类似,只不过它定义的变量对所有项目都有效
<context-param>
<param-name>fooparam-name>
<param-value>foo.propertiesparam-value>
context-param>