最近将从前用struts框架开发的程序进行了一次环境升级。结果出了不少麻烦,经过一番调整总算是搞定了!留此记录以备查询。
从前的开发环境,tomcat5.0.27,mysql4.0.18,jdk1.4,Struts,1.0
现在的开发环境tomcat5.5,mysql5.0,jdk1.5,struts1.28
一、tomcat环境的改变导致了2个问题。1页面乱码,2连接池重新配置。
1解决办法:(假设字符编码是GB2312)
所有的jsp页面增加<%@ page contentType="text/html;charset=GB2312" %>
修改数据库连接参数characterEncoding为GB2312
修改数据库的默认字符集为GB2312
对资源文件进行GB2312编码处理,方法如下:
native2ascii -encoding gb2312资源文件全名 GB2312编码资源文件名
增加一个过滤器保证变量在传递过程中字符编码是GB2312,方法如下:
package Org.Config;
/**
* Created by IntelliJ IDEA.
* User: 张小鹏
* Date: 2006-3-7
* Time: 10:59:05
* To change this template use File | Settings | File Templates.
*/
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
/**
* @author Meng Yang
* @version 1.1
*/
public class EncodingFilter implements Filter {
private String targetEncodin = "GB2312";
protected FilterConfig filterConfig;
/**
*
*/
public EncodingFilter() {
super();
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
this.filterConfig = config;
if (config.getInitParameter("encoding") != null
&& !config.getInitParameter("encoding").equals("")) {
this.targetEncodin = config.getInitParameter("encoding");
}
}
/* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
servletRequest.setCharacterEncoding(this.targetEncodin);
servletResponse.setContentType("text/html; charset=" + this.targetEncodin);
HttpServletResponse httpServletResponse = (HttpServletResponse)servletResponse;
httpServletResponse.setHeader("Pragma", "No-cache");
httpServletResponse.setHeader("Cache-Control", "no-cache");
httpServletResponse.setHeader("Expires", "0");
chain.doFilter(servletRequest, servletResponse);
}
/* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
this.filterConfig = null;
}
}
------------------------------------------------------------------------------------------------------------------------------------
修改web.xml文件增加以下内容
<filter>
<filter-name>charEncoding</filter-name>
<filter-class>Org.Config.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
------------------------------------------------------------------------------------------------------------------------------------
2,TOMCAT5.5连接池的配置
和5.0相比5.5的配置写法发生了一些变化,但是基本参数的没什么个改变。按照格式修改一下就可。
打开conf目录下的server.xml文件在
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
后面添加想开发的项目。
<Context path="/jzhuatian" docBase="jzhuatian" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/jzhuatian"
type="javax.sql.DataSource"
driverClassName="org.gjt.mm.mysql.Driver"
username="jzhuatianDB"
password="jzhuatianDBPw20060126"
url="jdbc:mysql://172.16.0.16:3306/jzhuatian?useUnicode=true&characterEncoding=GB2312&autoReconnect=true"
maxActive="200"
maxIdle="100"
maxWait="5000" />
</Context>
二、mysql5.0和4.0相比在字符集的设置上体现了非常大的灵活性。从库到某一个字段的字符集都可以进行单独设置。建表的时候注意指定字符集为GB2312
三、JDK1.5比1.4当然要有很多改变。目前在程序修改中我遇到的唯一不兼容问题就是集合转变为object数组后不能直接进行(String[])Object[]转换。无奈之下只能做了一个for循环对Object[]中的每一个变量按个放血(做String转换)才OK通过。也可采用如下方法:
String[] one = new String[ArrayList.size()];
ArrayList.toArray(one);
ArrayList.toArray(new String[]);参数String[]的意思是说:如果传递近来的参数容量足够大,那么就把转换之后的值放到传递的参数中,如果不够大,就重现创建一个Object数组,把要转换得东西放到数组中,然后返回
四、struts1.2比1.0的变化也有很多。首先template标签被彻底废除,取而代之的是tiles标签。标签<bean:wrtie
则不能打印int型变量,否则会提示 Cannot find message resources under key org.apache.struts.action.MESSAGE
解决办法在Struts配置文件的最后加上 <message-resources parameter="资源文件位置"/>
除了以上2个标签的变化外,一些类和方法也被整合替换。例如:ActionMessage取代了ActionError
ActionMessages.GLOBAL_MESSAGE取代了ActionErrors.GLOBAL_ERROR。。。
越来越感觉到近年来程序自身的变化反而不及开发思想的创新给业界带来的冲击大。正如WEB2.0规范的出现不是一次技术的革新,而是一次思想的革新。