2005年09月14日

对Struts实行国际化
(1)设置字符编码
为了保证在同一JSP页面能支持多种语言,可以将所有JSP页面的字符编码统一设置为"UTF-8"

<%@ page contentType="text/html;charset=UTF-8" language="java"%>


(2)对文本,按钮,图片国际化
(3)创建英文,中文资源文件
(4)对中文资源文件进行编码转换
用JDK中的native2ascii工具对中文资源进行转换

native2ascii -encoding gb2312 applicaion_CN.properties application_CN.properties


(5)采用Servlet过滤器设置请求数据的字符编码
添加如下类SetCharacterEncodingFilter:

package com.yourcompany.struts;


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; public class SetCharacterEncodingFilter implements Filter {  public void init(FilterConfig arg0) throws ServletException {
 }  public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  request.setCharacterEncoding("UTF-8");
  chain.doFilter(request,response);  }  public void destroy() {
 } }


并在web.xml中添加如下设置:
  

 <filter>
    <filter-name>Character Encoding</filter-name>
    <filter-class>com.yourcompany.struts.SetCharacterEncodingFilter</filter-class>
   </filter>
   <filter-mapping>
    <filter-name>Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
   </filter-mapping>


2005年09月09日

在JSP和Servlet中有时候需要读取web.xml的初始化参数,比如可以用于设置JNDI的数据源的名字。下面简单介绍下在JSP和Servlet中怎么读取web.xml的初始化参数。

一、在Servlet中读取:

在Servlet中一般可以用ServletConfig对象的getInitParameter方法去读取指定的参数的值。举个例子:

新建一个Servlet:ReadInitParameter.java

并在web.xml中增加如下配置:

  <servlet>
    <servlet-name>ReadInitParameter</servlet-name>
    <servlet-class>com.test.ReadInitParameter</servlet-class>
    <init-param>
      <param-name>email</param-name>
      <param-value>qiyadeng@haha.com</param-value>
    </init-param>
    <init-param>
      <param-name>name</param-name>
      <param-value>qiyadeng</param-value>
    </init-param>
  </servlet>


   <servletclass>com.test.ReadInitParameter</servlet-class>是servlet的完整路径,包括包名。

配置好了web.xml,现在可以在程序中读取初始化的参数了。在init(ServletConfig config)方法中传递了一个ServletConfig参数,可以这样获取初始化参数:

  public void init(ServletConfig config) throws ServletException
  {
    super.init(config);
    String email = config.getInitParameter("email");
    String name = config.getInitParameter("name");
  }


在其他的方法中象doGet(),doPost(),service()方法中可以用getServeltConfig()方法得到一个ServetConfig对象,在利用该对象的getInitParameter()方法取到对应的初始化参数。

  String email   = getServletConfig().getInitParameter("email");
 
String name= getServletConfig().getInitParameter("name");

二、在JSP中读取:

在JSP中读取的方式和Servlet中的doGet(),doPost(),Service()的方法一样,都是由ServletConfig对象来读取的。

  <%
    String zhutou = getServletConfig().getInitParameter("zhutou");
    String zhutouname = getServletConfig().getInitParameter("zhutouname");


  %>

但是,在web.xml的配置需要注意一下,新增如下:

  <servlet>
    <servlet-name>ReadInitParam</servlet-name>
    <jsp-file>ReadInitParam.jsp</jsp-file>
    <init-param>
      <param-name>zhutou</param-name>
      <param-value>zhutou@hotmail.com</param-value>
    </init-param>
    <init-param>
      <param-name>zhutouname</param-name>
      <param-value>zhutou</param-value>
    </init-param>
  </servlet>

在servlet-mapping中也要配置好:

  <servlet-mapping>
    <servlet-name>ReadInitParam</servlet-name>
    <url-pattern>ReadInitParam.jsp</url-pattern>
  </servlet-mapping>

上面的ReadInitParam.jsp出现的标签需要jsp文件的全部路径。

2005年09月02日

1.从文本文件导入数据到数据库中:

一般用用于不同数据库的数据转换,有两种方式,如下

load data infile “c:\\samp_table.txt” into table samp_table fields terminated by “\,”;  

或是用>mysqlimport,该工具功能比较复杂,更多可以查看文档。

mysqlimport –u root –fields-terminated-by=”\,” samp_db samp_table.txt

2.数据导出:

mysqldump –u root samp_db samp_table >samp.sql

或是

select * from samp_table into outfile “file_name”;
2005年08月28日
对于jsp的web程序来说,配置连接池是必不可少的。JBoss配置MySql的连接池,可以查看官方文档,地址为:http://docs.jboss.org/jbossas/getting_started/v4/html/db.html
我这里的配置分为以下几步:
第一步:从jboss-4.0.2\docs\examples\jca目录下的mysql-ds.xml复制文件到D:\jboss-4.0.2\server\default\deploy目录下并编辑如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: mysql-ds.xml,v 1.3.2.1 2004/12/01 11:46:00 schrouf Exp $ -->
<!--  Datasource config for MySQL using 3.0.9 available from:
http://www.mysql.com/downloads/api-jdbc-stable.html
-->
<datasources>
  <local-tx-datasource>
    <jndi-name>MySqlDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/test</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>root</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <!-- sql to call when connection is created
    <new-connection-sql>some arbitrary sql</new-connection-sql>
      -->
    <!-- sql to call on an existing pooled connection when it is obtained from pool
    <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
      -->
    <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>
第二步:编辑jboss-4.0.2\server\default\conf下的三个文件:standardjbosscmp-jdbc.xml,standardjaws.xml,login-config.xml
standardjbosscmp-jdbc.xml修改部分:
      <datasource>java:/MySqltDS</datasource>
      <datasource-mapping>mySQL</datasource-mapping>
standardjaws.xml修改部分:
   <datasource>java:/MySqltDS</datasource>
   <type-mapping>mySQL</type-mapping>
login-config.xml修改部分:(可以添加这一段,复制一段进行修改)
    <application-policy name = "MySqlDbRealm">
       <authentication>
          <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule"
             flag = "required">
             <module-option name = "principal">test</module-option>
             <module-option name = "userName">root</module-option>
             <module-option name = "password">root</module-option>
             <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=MySqlDS</module-option>
          </login-module>
       </authentication>
    </application-policy>
第三步:重启jboss没有出现异常,就会有如下显示,证明配置正确:
第四步:如果你还步放心,现在写个servlet试试吧:
  response.setContentType("text/html;charset=gb2312");
  PrintWriter out = response.getWriter();
  try {
   // Put your code here
   Context cx  = new InitialContext();
   Object obj = cx.lookup("java:/MySqlDS");
   DataSource ds = (DataSource)obj;
   Connection connect = ds.getConnection();
   Statement stmt = connect.createStatement();
   ResultSet rs = stmt.executeQuery("select * from customers");
   while(rs.next()){
    out.println(rs.getString("name"));
   }
  } catch (NamingException e) {
   e.printStackTrace();
  } catch(SQLException e1){
   e1.printStackTrace();
  }
  out.flush();
  out.close();
2005年08月26日

很多人可能都有同感,在linux下读chm格式的书籍有时候,真是麻烦.不过最近发现一个不错的软件archmage,使用起来算是比较方便.
下载的地址是:
http://rpm.pbone.net/index.php3/stat/4/idpl/1084098/com/archmage-0.0.6-1.i686.rpm.html
可以下载个rpm的安装程序.
使用起来非常简单,只要archage 源chm文件 目录
这个目录就是用了装html文件的,我估计这是个反编译的程序,反正看起来很方便.

native2ascii 国际化工具:
native2ascii虽然是个很小的工具,但是用处不小.在我们这些非英语国家特别有用,如一些Strut和JSF的配置文件,如果要使用中文就必须要用到该工具.
如下面这样,使用起来很方便.

[root@localhost root]# native2ascii
你好世界!
\u4f60\u597d\u4e16\u754c!


但是我好像发现点问题,我用eclipse(MyEclipse)编辑完的文件,用中文写的,就没有办法来转换,不知道什么原因.
当然native2ascii还不至这些用处,就是在反编译别人的程序中,也可以把那些Unicode转化成中文.

2005年07月15日

2005年07月12日

一、JSP页面显示乱码二、表单提交中文时出现乱码三、数据库连
大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。

一、JSP页面显示乱码
下面的显示页面(display.jsp)就出现乱码:

<html> 
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head> <body>
<%
out.print("JSP的中文处理");
%>
</body>
</html>

对不同的WEB服务器和不同的JDK版本,处理结果就不一样。原因:服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法:在JSP页面中指定编码方式(gb2312),即在页面的第一行加上:<%@ page contentType="text/html; charset=gb2312"%>,就可以消除乱码了。完整页面如下:

<%@ page contentType="text/html; charset=gb2312"%> 
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head> <body>
<%
out.print("JSP的中文处理");
%>
</body>
</html>

二、表单提交中文时出现乱码
下面是一个提交页面(submit.jsp),代码如下:

<html> 
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head> <body>
<form name="form1" method="post" action="process.jsp">
<div align="center">
<input type="text" name="name">
<input type="submit" name="Submit" value="Submit">
</div>
</form>
</body>
</html>

下面是处理页面(process.jsp)代码:

<%@ page contentType="text/html; charset=gb2312"%> 
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head> <body>
<%=request.getParameter("name")%>
</body>
</html>

如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF-8编码方式来发送请求,而UTF-8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。解决办法:通过request.setCharacterEncoding("gb2312")对请求进行统一编码,就实现了中文的正常显示。修改后的process.jsp代码如下:

<%@ page contentType="text/html; charset=gb2312"%> 
<%
request.seCharacterEncoding("gb2312");
%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head> <body>
<%=request.getParameter("name")%>
</body>
</html>

三、数据库连接出现乱码
只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上useUnicode=true&characterEncoding=GBK就OK了。

四、数据库的显示乱码
在mysql4.1.0中,varchar类型,text类型就会出现中文乱码,对于varchar类型把它设为binary属性就可以解决中文问题,对于text类型就要用一个编码转换类来处理,实现如下:

public class Convert { 
/** 把ISO-8859-1码转换成GB2312
*/
public static String ISOtoGB(String iso){
String gb;
try{
if(iso.equals("") || iso == null){
return "";
}
else{
iso = iso.trim();
gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
return gb;
}
}
catch(Exception e){
System.err.print("编码转换错误:"+e.getMessage());
return "";
}
}
}

把它编译成class,就可以调用Convert类的静态方法ISOtoGB()来转换编码。

今天碰到个简单问题,但是找了半天资料才算解决,自动关闭浏览器一直有对话框弹出。看了网上也有不少人有这个困惑,所以整理一下:

<script language="javascript">
function countdown()
{
 window.opener=null;//没有对话框,这句不可缺少
 window.close();
 }
setTimeout("countdown()",3000);
</script>

程序很简单,就是3秒钟自动关闭浏览器,不用解释^_^!

2005年07月08日

JAVA运行环境:j2sdk-1_4_2_05

数据库服务器:MySQL-4.0.20d

Web服务器:Tomcat5.0.27

JDBC驱动程序:mysql-connector-java-3.0.14-production-bin.jar

1、搭建JAVA的运行环境

(1)到Sun公司下载j2sdk-1_4_2_05-linux-i586-rpm.bin

(2)将文件改为可执行文件:

[root@eframe62 tuzq]# chmod +x j2sdk-1_4_2_05-linux-i586-rpm.bin

(3)执行自解压文件:

[root@eframe62 tuzq]# ./j2sdk-1_4_2_05-linux-i586-rpm.bin

(4)解压缩生成rpm文件j2sdk-1_4_2_05-linux-i586-rpm,安装rpm:

[root@eframe62 tuzq]# rpm –ivh j2sdk-1_4_2_05-linux-i586-rpm

(5)文件被安装在/usr/java/j2sdk1.4.2_05目录下,为了方便在/usr目录下做一个简单的连接:

[root@eframe62 usr]# ln –s /usr/java/j2sdk1.4.2_05 jdk

(6)加入环境变量:

[root@eframe62 usr]# export JAVA_HOME=/usr/jdk

[root@eframe62 usr]# export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:.

[root@eframe62 usr]# export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

(7)测试JAVA运行环境:写一个java程序来验证
[root@eframe62 usr]# vi HelloWorld.java
输入如下内容:

public class HelloWorld{

public static void main(String args[]){

System.out.println("Hello,Wrold");

}

}

写盘并退出编辑器:

:wq

[root@eframe62 usr]# javac HelloWorld.java

(没有错误)

[root@eframe62 usr]# java HelloWorld

Hello,World
这样,JAVA运行环境搭建好了。

 

2、安装MySQL数据库

MySQL数据库服务器可以到www.mysql.com网站下载。一种是二进制版本(已编译)mysql-standard-4.0.20-pc-linux-i686.tar.gz,安装如下:

(1)增加名为mysql的用户和组:

[root@eFrame62 root]# groupadd mysql

[root@eFrame62 root]# useradd -g mysql mysql

(2)将文件解压缩到/usr/local目录下:

[root@eFrame62 root]# cd /usr/local

[root@eFrame62 local]# gunzip < /home/tuzq/mysql-standard-4.0.20-pc-linux-i686.tar.gz | tar xvf –

(3)创建一个方便使用的连接:

[root@eFrame62 local]# ln -s /usr/local/mysql-standard-4.0.20-pc-linux-i686 mysql

(4)执行mysql_install_db脚本,初始化数据库(创建系统数据库和表):

[root@eFrame62 local]# cd mysql

[root@eFrame62 mysql]# scripts/mysql_install_db –user=mysql

如果出现类似下面错误,加上–force参数:

Neither host ’eframe62′ and ’localhost’ could not be looked up with ./bin/resolveip

(5)修改所有者:

[root@eFrame62 mysql]# chown -R root  .

[root@eFrame62 mysql]# chown -R mysql data

[root@eFrame62 mysql]# chgrp -R mysql .

(6)启动数据库服务器:

[root@eFrame62 mysql]# bin/mysqld_safe –user=mysql &

 

另一种是RPM版本,包括:MySQL-server-4.0.20-0.i386.rpm(服务器)和MySQL-client-4.0.20-0.i386.rpm(客户程序)。执行下面的命令安装,会自动执行上面的操作,启动好服务器:

rpm -ivh MySQL-server-4.0.20-0.i386.rpm

rpm -ivh MySQL-client-4.0.20-0.i386.rpm

注意:RPM版本的MySQL的安装目录有所不同,主要有下面一些目录:

l          /usr/bin:客户程序和脚本

l          /usr/sbin:mysqld服务程序

l          /var/lib/mysql:日志文件和数据库

如果不能正常启动服务,可能需要修改/var/lib/mysql的所有者为mysql:

chown -R mysql:mysql /var/lib/mysql

 

MySQL初始的root口令为空,需要修改。为了能够使用客户工具(如Windows下的图形工具)远程连接,需要增加权限:

[root@eFrame62 mysql]# mysql -u root –p

mysql> use mysql

mysql> grant all privileges on *.* to root@"%" identified by ’012345′ with grant option;

上面的命令创建一个可以从任意机器以root登录的超级账号,口令是012345。这样,就可以使用方便的图形工具进行登录和操作,包括修改root的口令。

 

3、安装Tomcat

Tomcat可以到www.jakarta.org下载,是二进制包(已编译):jakarta-tomcat-5.0.27.tar.gz。

(1)将文件解压到/usr/local目录下

[root@eFrame62 local]# gunzip < /home/tuzq/jakarta-tomcat-5.0.27.tar.gz | tar xvf –

(2)创建方便使用的连接

[root@eFrame62 local]# ln -s /usr/local/jakarta-tomcat-5.0.27.tar.gz tomcat

(3)设置JDK路径

[root@eFrame62 local]# cd tomcat

[root@eFrame62 tomcat]# vi bin/catalina.sh

在catalina.sh的开头添加:

export JAVA_HOME=/usr/jdk

export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:.

export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

(4)启动Tomcat

[root@eFrame62 tomcat]# bin/startup.sh

在浏览器中输入http://机器域名或IP地址:8080/,会显示Tomcat欢迎界面。

(5)停止Tomcat

[root@eFrame62 tomcat]# bin/shutdown.sh

(6)要在系统启动时自动启动Tomcat,在/etc/rc.d/rc.local中加入:

/usr/local/tomcat/bin/startup.sh

(7)管理Tomcat

修改/usr/local/tomcat/conf/tomcat-users.xml,增加管理员账号(需要重新启动Tomcat):

[root@eFrame62 tomcat]# vi conf/tomcat-users.xml

在<tomcat-users>中加入一行:

<user username="admin" password="" roles="admin,manager"/>

在浏览器中输入http://机器域名或IP地址:8080/admin,以管理员登录进入管理界面。

(8)创建Context内容

创建标准的Web应用程序(如quickstart):包括WEB-INF目录,其下有classes和lib目录。

一种方法是将整个目录拷贝到/usr/local/tomcat/webapps/目录下,重启Tomcat,会自动加载。

另一种方法是整个目录拷贝到某个目录(如/home/tuzq/quickstart),在管理界面中,左边选择Tomcat Server/Service (Catalina)/Host(localhost),在右边的Host Actions下拉框中选择Create New Context,指定Document Base为/home/tuzq/quickstart,指定Path为/quickstart;为了使用JNDI,将Use Naming设为True。

这样,就可以通过http://机器域名或IP地址:8080/quickstart访问Web应用内容了。

(9)设置JDBC

为了访问指定的数据库,要把对应的JDBC驱动程序(这里是mysql-connector-java-3.0.14-production-bin.jar)拷贝到/usr/local/tomcat/common/lib目录下,Tomcat在启动时会自动加载