二、struts中文的解决转自 www.javaresearch.org 作者 fishandfly1.使ApplicationResources.properties支持中文 建立一个ApplicationResources_ISO.properties文件,把应用程序用的message都写进去,然后在dos下执行这个命令, native2ascii -encoding gb2312 ApplicationResources_ISO.properties ApplicationResources.properties 这样就会将ISO编码的ApplicationResources转换成GB2312编码的格式了,同时保存到ApplicationResources.properties. native2ascii这个工具是jdk自带的一个东东,所以如果path都设定正确就可以直接运行了,你可以在$java_home$/bin下找到他。 转换后的中文类似于这个样子 iso 格式下 :tj.type=商品车类型 gb2312格式下 :tj.type=\u5546\u54c1\u8f66\u7c7b\u578b 然后在struts-config.xml中设置应用这个资源文件 <message-resources parameter="com.huahang.tj.ApplicationResources" key="org.apache.struts.action.MESSAGE" /> 开发jsp时在jsp的开头写上<%@ page contentType="text/html; charset=gb2312" %>,将字符集设置成gb2312就可以了。2.使数据库操作支持中文。 数据库操作支持中文一直让我比较头痛,但是感谢善解人衣向我推荐了www.chinaxp.org,这个网站是用struts框架开发的,而且 开放源码,下载了源码后发现它的中文处理得很好,阅读部分源码,没有发现什么特殊的字符集转换,很纳闷,偶然看到楼上网友 留言知道原来servlet可以统一设置字符转换。chinaxp.org就是这么做的。 在web.xml中加上 <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>com.huahang.tj.struts.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GB2312</param-value> </init-param> <init-param> <param-name>ignore</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <servlet-name>action</servlet-name> </filter-mapping> 这里会涉及一个bean,源码如下: /* * XP Forum * * Copyright 2002-2003 RedSoft Group. All rights reserved. * */ package com.huahang.tj.struts.filters;import javax.servlet.*; import java.io.IOException;/** * <p>Filter that sets the character encoding to be used in parsing the * incoming request, either unconditionally or only if the client did not * specify a character encoding. Configuration of this filter is based on * the following initialization parameters:</p> * <ul> * <li><strong>encoding</strong> - The character encoding to be configured * for this request, either conditionally or unconditionally based on * the <code>ignore</code> initialization parameter. This parameter * is required, so there is no default.</li> * <li><strong>ignore</strong> - If set to "true", any character encoding * specified by the client is ignored, and the value returned by the * <code>selectEncoding()</code> method is set. If set to "false, * <code>selectEncoding()</code> is called <strong>only</strong> if the * client has not already specified an encoding. By default, this * parameter is set to "true".</li> * </ul> * * <p>Although this filter can be used unchanged, it is also easy to * subclass it and make the <code>selectEncoding()</code> method more * intelligent about what encoding to choose, based on characteristics of * the incoming request (such as the values of the <code>Accept-Language</code> * and <code>User-Agent</code> headers, or a value stashed in the current * user's session.</p> * * @author <a href="mailto:[email protected]">John Wong</a> * * @version $Id: SetCharacterEncodingFilter.java,v 1.1 2002/04/10 13:59:27 johnwong Exp $ */ public class SetCharacterEncodingFilter implements Filter {// ----------------------------------------------------- Instance Variables/** * The default character encoding to set for requests that pass through * this filter. */ protected String encoding = null;/** * The filter configuration object we are associated with. If this value * is null, this filter instance is not currently configured. */ protected FilterConfig filterConfig = null;/** * Should a character encoding specified by the client be ignored? */ protected boolean ignore = true;// --------------------------------------------------------- Public Methods/** * Take this filter out of service. */ public void destroy() {this.encoding = null; this.filterConfig = null;}/** * Select and set (if specified) the character encoding to be used to * interpret request parameters for this request. * * @param request The servlet request we are processing * @param result The servlet response we are creating * @param chain The filter chain we are processing * * @exception IOException if an input/output error occurs * @exception ServletException if a servlet error occurs */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// Conditionally select and set the character encoding to be used if (ignore || (request.getCharacterEncoding() == null)) { String encoding = selectEncoding(request); if (encoding != null) request.setCharacterEncoding(encoding); }// Pass control on to the next filter chain.doFilter(request, response);}/** * Place this filter into service. * * @param filterConfig The filter configuration object */ public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding"); String value = filterConfig.getInitParameter("ignore"); if (value == null) this.ignore = true; else if (value.equalsIgnoreCase("true")) this.ignore = true; else if (value.equalsIgnoreCase("yes")) this.ignore = true; else this.ignore = false;}// ------------------------------------------------------ Protected Methods/** * Select an appropriate character encoding to be used, based on the * characteristics of the current request and/or filter initialization * parameters. If no character encoding should be set, return * <code>null</code>. * <p> * The default implementation unconditionally returns the value configured * by the <strong>encoding</strong> initialization parameter for this * filter. * * @param request The servlet request we are processing */ protected String selectEncoding(ServletRequest request) {return (this.encoding);}}//EOC 加上这个后,在action中就可以直接从form中接收gb2312编码的数据了,返回时自然也是gb2312了。 但是这个好像需要servlet 2.2以上的容器综合上面的方法,我解决了struts中的中文问题,现在还没发现新的问题。
Struts完全中文显示解决方案,Struts 数据库应用向导,请下载新版的JSPStudio(2003-8-26版本),JSPStudio下载地址ftp://162.105.80.43/incoming/
新版的JSPStudio(2003-8-26版本),主要新特点:
1、增加了Struts完全中文解决方案;
2、增加了Struts 数据库应用向导功能;
3、修改了原版中的错误。
1、增加了Struts完全中文显示解决方案: (1)JSP页面中文显示问题:
新建JSP文件时,自己加入如下代码:
<%@ page contentType="text/html;charset=GB2312" %>
这样JSP页面上的中文就可以正常显示了。 (2)中文资源显示问题:
在JSPStudio中,默认的中文资源文件名是“ApplicationResources_ch.properties”,用户先将中文资源定入文件“ApplicationResources.properties”
然后选择工具条的“资源文件编码转换”键或选择“运行”菜单上的“资源文件编码转换”项,即可实现编码转换功能。 (3)表单和数据库中文显示问题:
在JSPStudio中建立Struts项目时,自动加入了编码转换设置过滤器。 可见在JSPStudio中,不需编程人员编写任何代码,仅仅点击一个资源文件编码转换键即可完全解决Struts中文显示问题。
2、增加了Struts 数据库应用向导功能:
在新版的JSPStudio中,通过“Struts数据库应用文件向导”可完全自动实现数据库应用。
在向导中,只需输入文件名,通过手动加入数据库字段名或通过选择数据源自动添加数据库字段名,即可自动产生实体Bean,操作ADO(包括插入、删除、更新、查找功能)、输入JSP、JSP对应的ACtionForm、JSP对应的Action(例如打查找结果放入Bean中)、JSP输出(根据数据库自动产生输出表格)、自动配置XML文件等;
在新版的JSPStudio中,用不到一分钟的时间,即可完成一个完整数据库表的查找和显示,不需编程人员编写任何代码。
另外,由于产生了操作ADO(包括插入、删除、更新、查找功能),只需编写很少的代码,即可实现完整的数据插入、删除、更新功能。3、修改了原版中的错误.
------------------------------------------------------------------------------------------
一、我在网上下载了一个 struts 结构的源程序,数据库是 MySQL,数据库里的字段只能输入一个汉字,超过的不显示。而且不能进行中文操作,页面显示乱码,我猜可能是建立连接时需要进行字符集的转换,这是一个外国人写的程序,我没找到到数据库连接的语句,不知如何是好,如果您肯帮助我,麻烦您把邮箱留一下,我 classes 发到您的邮箱里,请您帮我看一下应该怎样改?我万分感谢! 加一个转换中文的:package com.aurel.track.user;public class ToChinese { /** * 处理中文 * @param ss 待处理的字符串 * @return 处理之后的字符串 */ public String toChinese(String ss) { //处理中文问题 if (ss != null) { try { String temp_p = ss; byte[] temp_t = temp_p.getBytes("ISO8859-1"); ss = new String(temp_t); } catch (Exception e) { System.err.println("toChinese exception:" + e.getMessage()); System.err.println("The String is:" + ss); } } return ss; }}在得到参数的时候,比如RegistrationForm在RegistrationForm方法里面加上ToChinese mychinese = new ToChinese();,就像下面的一样:public final class RegistrationForm extends ActionForm { ToChinese mychinese = new ToChinese();得到参数时: public void setLoginName ( String loginName ) { this.loginName = mychinese.toChinese( loginName ); }}就可以了,跟平常java的中文处理没什么两样
jdbc:mysql://127.0.0.1:3306/st?user=root&password=111111&useUnicode=true&characterEncoding=GBK
作者 fishandfly1.使ApplicationResources.properties支持中文
建立一个ApplicationResources_ISO.properties文件,把应用程序用的message都写进去,然后在dos下执行这个命令,
native2ascii -encoding gb2312 ApplicationResources_ISO.properties ApplicationResources.properties
这样就会将ISO编码的ApplicationResources转换成GB2312编码的格式了,同时保存到ApplicationResources.properties.
native2ascii这个工具是jdk自带的一个东东,所以如果path都设定正确就可以直接运行了,你可以在$java_home$/bin下找到他。
转换后的中文类似于这个样子
iso 格式下 :tj.type=商品车类型
gb2312格式下 :tj.type=\u5546\u54c1\u8f66\u7c7b\u578b
然后在struts-config.xml中设置应用这个资源文件
<message-resources parameter="com.huahang.tj.ApplicationResources" key="org.apache.struts.action.MESSAGE" />
开发jsp时在jsp的开头写上<%@ page contentType="text/html; charset=gb2312" %>,将字符集设置成gb2312就可以了。2.使数据库操作支持中文。
数据库操作支持中文一直让我比较头痛,但是感谢善解人衣向我推荐了www.chinaxp.org,这个网站是用struts框架开发的,而且
开放源码,下载了源码后发现它的中文处理得很好,阅读部分源码,没有发现什么特殊的字符集转换,很纳闷,偶然看到楼上网友
留言知道原来servlet可以统一设置字符转换。chinaxp.org就是这么做的。
在web.xml中加上
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.huahang.tj.struts.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB2312</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>
这里会涉及一个bean,源码如下:
/*
* XP Forum
*
* Copyright 2002-2003 RedSoft Group. All rights reserved.
*
*/
package com.huahang.tj.struts.filters;import javax.servlet.*;
import java.io.IOException;/**
* <p>Filter that sets the character encoding to be used in parsing the
* incoming request, either unconditionally or only if the client did not
* specify a character encoding. Configuration of this filter is based on
* the following initialization parameters:</p>
* <ul>
* <li><strong>encoding</strong> - The character encoding to be configured
* for this request, either conditionally or unconditionally based on
* the <code>ignore</code> initialization parameter. This parameter
* is required, so there is no default.</li>
* <li><strong>ignore</strong> - If set to "true", any character encoding
* specified by the client is ignored, and the value returned by the
* <code>selectEncoding()</code> method is set. If set to "false,
* <code>selectEncoding()</code> is called <strong>only</strong> if the
* client has not already specified an encoding. By default, this
* parameter is set to "true".</li>
* </ul>
*
* <p>Although this filter can be used unchanged, it is also easy to
* subclass it and make the <code>selectEncoding()</code> method more
* intelligent about what encoding to choose, based on characteristics of
* the incoming request (such as the values of the <code>Accept-Language</code>
* and <code>User-Agent</code> headers, or a value stashed in the current
* user's session.</p>
*
* @author <a href="mailto:[email protected]">John Wong</a>
*
* @version $Id: SetCharacterEncodingFilter.java,v 1.1 2002/04/10 13:59:27 johnwong Exp $
*/
public class SetCharacterEncodingFilter implements Filter {// ----------------------------------------------------- Instance Variables/**
* The default character encoding to set for requests that pass through
* this filter.
*/
protected String encoding = null;/**
* The filter configuration object we are associated with. If this value
* is null, this filter instance is not currently configured.
*/
protected FilterConfig filterConfig = null;/**
* Should a character encoding specified by the client be ignored?
*/
protected boolean ignore = true;// --------------------------------------------------------- Public Methods/**
* Take this filter out of service.
*/
public void destroy() {this.encoding = null;
this.filterConfig = null;}/**
* Select and set (if specified) the character encoding to be used to
* interpret request parameters for this request.
*
* @param request The servlet request we are processing
* @param result The servlet response we are creating
* @param chain The filter chain we are processing
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet error occurs
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}// Pass control on to the next filter
chain.doFilter(request, response);}/**
* Place this filter into service.
*
* @param filterConfig The filter configuration object
*/
public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;}// ------------------------------------------------------ Protected Methods/**
* Select an appropriate character encoding to be used, based on the
* characteristics of the current request and/or filter initialization
* parameters. If no character encoding should be set, return
* <code>null</code>.
* <p>
* The default implementation unconditionally returns the value configured
* by the <strong>encoding</strong> initialization parameter for this
* filter.
*
* @param request The servlet request we are processing
*/
protected String selectEncoding(ServletRequest request) {return (this.encoding);}}//EOC
加上这个后,在action中就可以直接从form中接收gb2312编码的数据了,返回时自然也是gb2312了。
但是这个好像需要servlet 2.2以上的容器综合上面的方法,我解决了struts中的中文问题,现在还没发现新的问题。
我感觉特别奇怪。