Tomcat6+Struts2
近期在用Struts2+ExtJS2.1学做东东。
针对Tomcat6和Struts2,简要记之。仅作备忘。
1. 在Tomcat5.0.28上部署测试Struts2。
启动Tomcat时报错:
-------------------
javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found
在网上搜索后,才知是类冲突造成的。
解决方法:可以把Tomcat安装路径下/common/endorsed/中的xml-apis.jar包移除,然后再启动Tomcat5.0.28即可。
2. Struts2在Tomcat5.5及以上版本上运行是没有问题的。
于是改用Tomcat6,以前没有用过的。经过这两个月的使用,发现Tomcat6还是很不错的。
到http://www.apache.org/下载了一个:apache-tomcat-6.0.16.exe。
在使用时,发现一些地方与Tomcat5是不一样的。
遇到的问题:
1.Tomcat6启动的时候,控制台出现如下类似信息:
-----------------------------
信息: The Apache Tomcat Native library which allows optimal performance in production
environments was not found on the java.library.path: ... ...
-----------------------------
这是 AprLifecycleListener 监听器事件信息, 位置在 Tomcat_home/conf/server.xml 中:
...<Listener className="org.apache.catalina.core.AprLifecycleListener
实际这是建议使用Apache的APR。
下载地址:
http://tomcat.heanet.ie/native/1.1.10/binaries/win32/tcnative-1.dll
按照说明要求,将这个文件放到Tomcat下的bin目录下
然后重新启动Tomcat6即可。
详情参考:http://tomcat.apache.org/tomcat-6.0-doc/apr.html
2.数据库连接池的配置:
因Tomcat6没有像Tomcat4/5一样自带admin模块,所以无法启用Tomcat Web Server Administration Tool来配置数据库连接池等信息。
手工配置如下:
1) 数据库驱动jar文件copy到lib文件夹中;
2) 参考Tomcat5.0方式,在TOMCAT_HOME/conf/文件夹下,建立/Catalina/localhost路径文件夹;
3) 在/localhost/文件夹下,建立对应Web应用名字的xml文件,如test.xml;
4) 仿照配置Tomcat5.0连接池的方式,编辑test.xml文件,如下:
-----------------------------
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="test" path="/test" privileged="true" reloadable="true">
<Resource name="jdbc/test"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"
username="system"
password="manager"
maxActive="50"
maxIdle="10"
maxWait="5000" />
</Context>
-----------------------------
这个配置属性大致跟Tomcat5的一样,但较Tomcat5更简洁。
3. 测试部署Struts2:
1).需要修改web.xml文件,指定Struts2的Filter。
2).struts.xml和struts.properties是部署在WebRoot/WEB-INF/classes/文件级中的。
这两个文件对应可以放在Eclipse中Web项目的src目录中。
在struts.xml中配置所有的action。
action的转发路径,记得要以"/"开头,如:
<result name="success">/mainframe.jsp</result>
Struts2的表单提交可以如下写法
<s:form action="loginAction" theme="simple" id="loginForm" method="post">
其中theme="simple"属性指定了Struts2元素的排列呈现方式。
如果转发路径配置不正确或表单提交的action指定不正确,则Tomcat6会警告:
-----------------------------
No configuration found for the specified action: 'loginAction.action' in namespace: ''.
Form action defaulting to 'action' attribute's literal value.
-----------------------------
3). struts.properties是借用struts-core-2.0.x.jar中的文件,原名是default.properties。
将其改名为struts.properties,放到Web项目的src目录下。
做如下的修改:
struts.locale=zh_CN
struts.i18n.encoding=GB2312
修改后struts能认识中文。
struts.action.extension=action
指定struts的action的后缀默认值是.action。
4).AJAX调用Action时,可以在其指定的返回页面中,使用标签引用Action中的属性做为返回值给AJAX。如:
-----------------------------
<%@ page language="java" contentType = "text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:property value="JSONDataString" escape="false"/>
-----------------------------
其中,属性escape="false" 很重要。
采用Struts2标签展现结果时候,设置escape="false",使Struts2不要对字符串进行转义。
PS:今奥运火炬传递于石。
[完]
by JRQ
2008/07/29 于京
又PS:
在网上看到另外一种配置Tomcat6连接池的方法:
-----------------
1.修改tomcat6/conf/context.xml,在context标签内加入
<Resource name="jdbc/test1"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"
username="test1"
password="test1"
maxActive="100"
maxIdle="30"
maxWait="10000" />
<Resource name="jdbc/test2"
auth="Container2"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"
username="test2"
password="test2"
maxActive="100"
maxIdle="30"
maxWait="10000" />
2.修改webapp/test/WEB-INF/web.xml,在web-app标签内加入
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/test1</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/test2</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container2</res-auth>
</resource-ref>
3.程序调用连接池语句
/**pooltag值为test1或test2*/
public Connection poolConnect(String pooltag){
Connection conn=null;
try {
Context env = new InitialContext();
Context envctx = (Context) env.lookup("java:comp/env");
DataSource pool = (DataSource) envctx.lookup("jdbc/"+pooltag);
if (pool == null)
throw new Exception("jdbc/"+pooltag+" is an unknown DataSource");
conn = pool.getConnection();
}
catch (Exception e) {
System.err.println("poolConnect:"+pooltag+". " + e.getMessage());
}
return conn;
}
-------补记于南昌。2009.03.11
又PS:
Tomcat6内存不足问题及解决方法
1、Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行。
常见的问题是报Tomcat内存溢出错误,Out of Memory(系统内存不足)的异常,从而导致客户端显示500错误,一般调整Tomcat的使用内存即可解决此问题。
Windows环境下修改“%TOMCAT_HOME%/bin/catalina.bat”文件,在文件开头增加如下设置:set JAVA_OPTS=-Xms256m -Xmx512m
Linux环境下修改“%TOMCAT_HOME%/bin/catalina.sh”文件,在文件开头增加如下设置:JAVA_OPTS='-Xms256m -Xmx512m'
其中,-Xms设置初始化内存大小,-Xmx设置可以使用的最大内存。
2、Tomcat6版本已经没有catalina.bat文件了。
此时需运行%TOMCAT_HOME%/bin/tomcat6w.exe文件,设置其中的Initial memory pool和Maximum memory pool的值,分别为256和512。