`
dengyin2000
  • 浏览: 1209009 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

T5 技巧 1:解决Form的提交乱码问题。

阅读更多
现在正在使用T5开发一个小项目。 因为现在T5还正处于发展中。 而且没有像T4一样有许多的文档。 和例子(Workbench, Vlib)。 所以我会把在这个开发中遇到的一些问题记录下来。


tapestry5.0.5现在默认支持UTF-8编码。 但是发现在form提交数据后。 数据变成了乱码。

解决方案是增加一个Filter。


    public RequestFilter buildUtf8Filter(
        @InjectService("RequestGlobals") final RequestGlobals requestGlobals)
    {
        return new RequestFilter()
        {
            public boolean service(Request request, Response response, RequestHandler handler)
                throws IOException
            {
                requestGlobals.getHTTPServletRequest().setCharacterEncoding("UTF-8");
                return handler.service(request, response);
            }
        };
    }


然后contribute给RequestHandler。

    public void contributeRequestHandler(OrderedConfiguration<RequestFilter> configuration,
            @InjectService("TimingFilter") final RequestFilter timingFilter,
            @InjectService("Utf8Filter") final RequestFilter utf8Filter)
    {
        configuration.add("Utf8Filter", utf8Filter); // handle UTF-8
        configuration.add("Timing", timingFilter);
    }


以上代码都是放在AppModule.java中。。

参考:http://wiki.apache.org/tapestry/Tapestry5Utf8Encoding
分享到:
评论
29 楼 dengyin2000 2007-12-28  
谁会用get去穿中文内容。 一般get都是用来传ID的。

28 楼 liyong_2003_cn 2007-12-28  
iorigod123 写道
小弟也碰到过这种问题,有upload组件就会提交成乱码,小弟的解决方法有点笨,就是搞个转换,居然可以成功转换,代码如下:
public static String getUTF8(String temp){
try{
return new String(temp.getBytes("iso-8859-1"),"utf-8");
}catch(Exception e){
return "";
}
}
象这种转换是最保险的,用filter的情况,对post提交是有效的,但是对get提交是无效的,这个跟post和get提交的机制有关系。以前项目遇到过这个问题,现在基本上都采用转换了,不用filter了,效率没仔细比较过,估计差不太多。

如果是get方式提交,应该设置server.xml中RUIEncoding="UTF-8"
27 楼 iorigod123 2007-12-28  
小弟也碰到过这种问题,有upload组件就会提交成乱码,小弟的解决方法有点笨,就是搞个转换,居然可以成功转换,代码如下:
public static String getUTF8(String temp){
try{
return new String(temp.getBytes("iso-8859-1"),"utf-8");
}catch(Exception e){
return "";
}
}
26 楼 kris_xu 2007-09-05  
如果是get方式提交,应该设置server.xml中RUIEncoding="UTF-8"
25 楼 kris_xu 2007-09-05  
和form的提交方式有关吗?get?post?
24 楼 xo_tobacoo 2007-09-05  
要解决乱码,首先要了解你的环境中那些位置涉及字符编码:
jsp页面要设置
开发工具要设置
连接数据库要设置
java包

最好的办法是使用楼主使用的方案,过滤器
在tomcat的示例里有个过滤器,拷贝过去,改下就可以了
23 楼 match927 2007-09-05  
这个文件AppModule.java在那里?谢谢
22 楼 javersion 2007-08-28  
你的表单提交方式是用的post还是get,如果是get,就会发生乱码!
21 楼 koda 2007-08-28  
先在maillist上散一下:)
20 楼 Linuxboy 2007-08-28  
将这个问题提交到jira吧
19 楼 koda 2007-08-28  
我终于找到了问题发生的原因了!!!但是没有解决方案

真正的问题是:如果form里包含有上传文件的field,则其他textfield提交的中文乱码;或者,如果显式地在<form>标签中加入属性 enctype="multipart/form-data"则提交的textfield中文值乱码。

18 楼 dengyin2000 2007-08-24  
我贴下我的吧。。  跟你的也差不多。。<br/>
<br/>
<br/>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-j' start='1'>
    <li class='alt'><span><span class='keyword'>package</span><span> com.javaeye.dengyin2000.gtts.services;  </span></span></li>
    <li class=''><span>  </span></li>
    <li class='alt'><span><span class='keyword'>import</span><span> java.io.IOException;  </span></span></li>
    <li class=''><span><span class='keyword'>import</span><span> java.math.BigDecimal;  </span></span></li>
    <li class='alt'><span>  </span></li>
    <li class=''><span><span class='keyword'>import</span><span> org.apache.commons.logging.Log;  </span></span></li>
    <li class='alt'><span><span class='keyword'>import</span><span> org.apache.tapestry.Translator;  </span></span></li>
    <li class=''><span><span class='keyword'>import</span><span> org.apache.tapestry.ioc.MappedConfiguration;  </span></span></li>
    <li class='alt'><span><span class='keyword'>import</span><span> org.apache.tapestry.ioc.OrderedConfiguration;  </span></span></li>
    <li class=''><span><span class='keyword'>import</span><span> org.apache.tapestry.ioc.ServiceBinder;  </span></span></li>
    <li class='alt'><span><span class='keyword'>import</span><span> org.apache.tapestry.ioc.annotations.InjectService;  </span></span></li>
    <li class=''><span><span class='keyword'>import</span><span> org.apache.tapestry.services.Request;  </span></span></li>
    <li class='alt'><span><span class='keyword'>import</span><span> org.apache.tapestry.services.RequestFilter;  </span></span></li>
    <li class=''><span><span class='keyword'>import</span><span> org.apache.tapestry.services.RequestGlobals;  </span></span></li>
    <li class='alt'><span><span class='keyword'>import</span><span> org.apache.tapestry.services.RequestHandler;  </span></span></li>
    <li class=''><span><span class='keyword'>import</span><span> org.apache.tapestry.services.Response;  </span></span></li>
    <li class='alt'><span>  </span></li>
    <li class=''><span><span class='keyword'>import</span><span> com.javaeye.dengyin2000.gtts.tapestry.BigDecimalTranslator;  </span></span></li>
    <li class='alt'><span>  </span></li>
    <li class=''><span><span class='comment'>/**</span> </span></li>
    <li class='alt'><span><span class='comment'> * This module is automatically included as part of the Tapestry IoC Registry, it's a good place to</span> </span></li>
    <li class=''><span><span class='comment'> * configure and extend Tapestry, or to place your own service definitions.</span> </span></li>
    <li class='alt'><span><span class='comment'> */</span><span>  </span></span></li>
    <li class=''><span><span class='keyword'>public</span><span> </span><span class='keyword'>class</span><span> AppModule  </span></span></li>
    <li class='alt'><span>{  </span></li>
    <li class=''><span>    <span class='keyword'>public</span><span> </span><span class='keyword'>static</span><span> </span><span class='keyword'>void</span><span> bind(ServiceBinder binder)  </span></span></li>
    <li class='alt'><span>    {  </span></li>
    <li class=''><span>        <span class='comment'>// binder.bind(MyServiceInterface.class, MyServiceImpl.class);</span><span>  </span></span></li>
    <li class='alt'><span>          </span></li>
    <li class=''><span>        <span class='comment'>// Make bind() calls on the binder object to define most IoC services.</span><span>  </span></span></li>
    <li class='alt'><span>        <span class='comment'>// Use service builder methods (example below) when the implementation</span><span>  </span></span></li>
    <li class=''><span>        <span class='comment'>// is provided inline, or requires more initialization than simply</span><span>  </span></span></li>
    <li class='alt'><span>        <span class='comment'>// invoking the constructor.  </span><span>  </span></span></li>
    <li class=''><span>    }  </span></li>
    <li class='alt'><span>      </span></li>
    <li class=''><span>      </span></li>
    <li class='alt'><span>    <span class='keyword'>public</span><span> </span><span class='keyword'>static</span><span> </span><span class='keyword'>void</span><span> contributeApplicationDefaults(  </span></span></li>
    <li class=''><span>            MappedConfiguration&lt;String, String&gt; configuration)  </span></li>
    <li class='alt'><span>    {  </span></li>
    <li class=''><span>        <span class='comment'>// Contributions to ApplicationDefaults will override any contributions to</span><span>  </span></span></li>
    <li class='alt'><span>        <span class='comment'>// FactoryDefaults (with the same key). Here we're restricting the supported</span><span>  </span></span></li>
    <li class=''><span>        <span class='comment'>// locales to just "en" (English). As you add localised message catalogs and other assets,</span><span>  </span></span></li>
    <li class='alt'><span>        <span class='comment'>// you can extend this list of locales (it's a comma seperated series of locale names;</span><span>  </span></span></li>
    <li class=''><span>        <span class='comment'>// the first locale name is the default when there's no reasonable match).</span><span>  </span></span></li>
    <li class='alt'><span>          </span></li>
    <li class=''><span>        configuration.add(<span class='string'>"tapestry.supported-locales"</span><span>, </span><span class='string'>"en"</span><span>);  </span></span></li>
    <li class='alt'><span>    }  </span></li>
    <li class=''><span>      </span></li>
    <li class='alt'><span>  </span></li>
    <li class=''><span>    <span class='comment'>/**</span> </span></li>
    <li class='alt'><span><span class='comment'>     * This is a service definition, the service will be named "TimingFilter". The interface,</span> </span></li>
    <li class=''><span><span class='comment'>     * RequestFilter, is used within the RequestHandler service pipeline, which is built from the</span> </span></li>
    <li class='alt'><span><span class='comment'>     * RequestHandler service configuration. Tapestry IoC is responsible for passing in an</span> </span></li>
    <li class=''><span><span class='comment'>     * appropriate Log instance. Requests for static resources are handled at a higher level, so</span> </span></li>
    <li class='alt'><span><span class='comment'>     * this filter will only be invoked for Tapestry related requests.</span> </span></li>
    <li class=''><span><span class='comment'>     * </span> </span></li>
    <li class='alt'><span><span class='comment'>     * &lt;p&gt;</span> </span></li>
    <li class=''><span><span class='comment'>     * Service builder methods are useful when the implementation is inline as an inner class</span> </span></li>
    <li class='alt'><span><span class='comment'>     * (as here) or require some other kind of special initialization. In most cases,</span> </span></li>
    <li class=''><span><span class='comment'>     * use the static bind() method instead. </span> </span></li>
    <li class='alt'><span><span class='comment'>     * </span> </span></li>
    <li class=''><span><span class='comment'>     * &lt;p&gt;</span> </span></li>
    <li class='alt'><span><span class='comment'>     * If this method was named "build", then the service id would be taken from the </span> </span></li>
    <li class=''><span><span class='comment'>     * service interface and would be "RequestFilter".  Since Tapestry already defines</span> </span></li>
    <li class='alt'><span><span class='comment'>     * a service named "RequestFilter" we use an explicit service id that we can reference</span> </span></li>
    <li class=''><span><span class='comment'>     * inside the contribution method.</span> </span></li>
    <li class='alt'><span><span class='comment'>     */</span><span>      </span></span></li>
    <li class=''><span>    <span class='keyword'>public</span><span> RequestFilter buildTimingFilter(</span><span class='keyword'>final</span><span> Log log)  </span></span></li>
    <li class='alt'><span>    {  </span></li>
    <li class=''><span>        <span class='keyword'>return</span><span> </span><span class='keyword'>new</span><span> RequestFilter()  </span></span></li>
    <li class='alt'><span>        {  </span></li>
    <li class=''><span>            <span class='keyword'>public</span><span> </span><span class='keyword'>boolean</span><span> service(Request request, Response response, RequestHandler handler)  </span></span></li>
    <li class='alt'><span>                    <span class='keyword'>throws</span><span> IOException  </span></span></li>
    <li class=''><span>            {  </span></li>
    <li class='alt'><span>                <span class='keyword'>long</span><span> startTime = System.currentTimeMillis();  </span></span></li>
    <li class=''><span>  </span></li>
    <li class='alt'><span>                <span class='keyword'>try</span><span>  </span></span></li>
    <li class=''><span>                {  </span></li>
    <li class='alt'><span>                    <span class='comment'>// The reponsibility of a filter is to invoke the corresponding method</span><span>  </span></span></li>
    <li class=''><span>                    <span class='comment'>// in the handler. When you chain multiple filters together, each filter</span><span>  </span></span></li>
    <li class='alt'><span>                    <span class='comment'>// received a handler that is a bridge to the next filter.</span><span>  </span></span></li>
    <li class=''><span>                      </span></li>
    <li class='alt'><span>                    <span class='keyword'>return</span><span> handler.service(request, response);  </span></span></li>
    <li class=''><span>                }  </span></li>
    <li class='alt'><span>                <span class='keyword'>finally</span><span>  </span></span></li>
    <li class=''><span>                {  </span></li>
    <li class='alt'><span>                    <span class='keyword'>long</span><span> elapsed = System.currentTimeMillis() - startTime;  </span></span></li>
    <li class=''><span>  </span></li>
    <li class='alt'><span>                    log.info(String.format(<span class='string'>"Request time: %d ms"</span><span>, elapsed));  </span></span></li>
    <li class=''><span>                }  </span></li>
    <li class='alt'><span>            }  </span></li>
    <li class=''><span>        };  </span></li>
    <li class='alt'><span>    }  </span></li>
    <li class=''><span>  </span></li>
    <li class='alt'><span>    <span class='keyword'>public</span><span> RequestFilter buildUtf8Filter(  </span></span></li>
    <li class=''><span>            <span class='annotation'>@InjectService</span><span>(</span><span class='string'>"RequestGlobals"</span><span>) </span><span class='keyword'>final</span><span> RequestGlobals requestGlobals)  </span></span></li>
    <li class='alt'><span>        {  </span></li>
    <li class=''><span>            <span class='keyword'>return</span><span> </span><span class='keyword'>new</span><span> RequestFilter()  </span></span></li>
    <li class='alt'><span>            {  </span></li>
    <li class=''><span>                <span class='keyword'>public</span><span> </span><span class='keyword'>boolean</span><span> service(Request request, Response response, RequestHandler handler)  </span></span></li>
    <li class='alt'><span>                    <span class='keyword'>throws</span><span> IOException  </span></span></li>
    <li class=''><span>                {  </span></li>
    <li class='alt'><span>                    requestGlobals.getHTTPServletRequest().setCharacterEncoding(<span class='string'>"UTF-8"</span><span>);  </span></span></li>
    <li class=''><span>                    <span class='keyword'>return</span><span> handler.service(request, response);  </span></span></li>
    <li class='alt'><span>                }  </span></li>
    <li class=''><span>            };  </span></li>
    <li class='alt'><span>        }      </span></li>
    <li class=''><span>      </span></li>
    <li class='alt'><span>    <span class='comment'>/**</span> </span></li>
    <li class=''><span><span class='comment'>     * This is a contribution to the RequestHandler service configuration. This is how we extend</span> </span></li>
    <li class='alt'><span><span class='comment'>     * Tapestry using the timing filter. A common use for this kind of filter is transaction</span> </span></li>
    <li class=''><span><span class='comment'>     * management or security.</span> </span></li>
    <li class='alt'><span><span class='comment'>     */</span><span>  </span></span></li>
    <li class=''><span>    <span class='keyword'>public</span><span> </span><span class='keyword'>void</span><span> contributeRequestHandler(OrderedConfiguration&lt;RequestFilter&gt; configuration,  </span></span></li>
    <li class='alt'><span>            <span class='annotation'>@InjectService</span><span>(</span><span class='string'>"TimingFilter"</span><span>)  </span></span></li>
    <li class=''><span>            RequestFilter filter, <span class='annotation'>@InjectService</span><span>(</span><span class='string'>"Utf8Filter"</span><span>) RequestFilter utf8Filter)  </span></span></li>
    <li class='alt'><span>    {  </span></li>
    <li class=''><span>        <span class='comment'>// Each contribution to an ordered configuration has a name, When necessary, you may</span><span>  </span></span></li>
    <li class='alt'><span>        <span class='comment'>// set constraints to precisely control the invocation order of the contributed filter</span><span>  </span></span></li>
    <li class=''><span>        <span class='comment'>// within the pipeline.</span><span>  </span></span></li>
    <li class='alt'><span>        configuration.add(<span class='string'>"Utf8Filter"</span><span>, utf8Filter);  </span></span></li>
    <li class=''><span>        configuration.add(<span class='string'>"Timing"</span><span>, filter);  </span></span></li>
    <li class='alt'><span>          </span></li>
    <li class=''><span>    }  </span></li>
    <li class='alt'><span>      </span></li>
    <li class=''><span>    <span class='keyword'>public</span><span> </span><span class='keyword'>static</span><span> </span><span class='keyword'>void</span><span> contributeTranslatorDefaultSource(  </span></span></li>
    <li class='alt'><span>            MappedConfiguration&lt;Class, Translator&gt; configuration)  </span></li>
    <li class=''><span>    {  </span></li>
    <li class='alt'><span>        configuration.add(BigDecimal.<span class='keyword'>class</span><span>, </span><span class='keyword'>new</span><span> BigDecimalTranslator());  </span></span></li>
    <li class=''><span>    }  </span></li>
    <li class='alt'><span>      </span></li>
    <li class=''><span>    <span class='keyword'>public</span><span> </span><span class='keyword'>static</span><span> </span><span class='keyword'>void</span><span> contributeTranslatorSource(  </span></span></li>
    <li class='alt'><span>            MappedConfiguration&lt;String, Translator&gt; configuration)  </span></li>
    <li class=''><span>    {  </span></li>
    <li class='alt'><span>        configuration.add(<span class='string'>"bigdecimal"</span><span>,  </span><span class='keyword'>new</span><span> BigDecimalTranslator());  </span></span></li>
    <li class=''><span>    }  </span></li>
    <li class='alt'><span>}  </span></li>
</ol>
</div>
17 楼 koda 2007-08-23  
代码也贴出来
package org.opend.bogo.services;

public class AppModule {
	public void contributeRequestHandler(
			OrderedConfiguration<RequestFilter> configuration,
			@InjectService("TimingFilter")
			final RequestFilter timingFilter, @InjectService("Utf8Filter")
			final RequestFilter utf8Filter) {
		configuration.add("Utf8Filter", utf8Filter); // handle UTF-8
	}

    public RequestFilter buildUtf8Filter(
            @InjectService("RequestGlobals") final RequestGlobals requestGlobals)
        {
            return new RequestFilter()
            {
                public boolean service(Request request, Response response, RequestHandler handler)
                    throws IOException
                {
                    requestGlobals.getHTTPServletRequest().setCharacterEncoding("utf-8");
                    return handler.service(request, response);
                }
            };
        }
}
16 楼 koda 2007-08-23  
我在onSuccess里面插入数据库之前打印就是乱码
另外我创建数据库的时候用下面的语句
CREATE DATABASE bogo CHARACTER SET UTF8 COLLATE utf8_general_ci;

15 楼 dengyin2000 2007-08-23  
koda 写道
引用
要记得清除开发环境和浏览器的缓存。

都清除了,也换成了jetty5.1.14. 问题依旧,绝望了:(


很有可能你的mysql数据库不是用的utf-8.

你可以调试下   在你onSuccess里面看看 提交后的java class的数据是不是乱码。
14 楼 Linuxboy 2007-08-23  
那就奇怪了。我的开发环境是:XPsp2+mysql5(utf8)+eclipse3.3+jetty6.1.3+tapestry5.0.5
在form中输入中文提交后,中文显示正常。
13 楼 koda 2007-08-23  
引用
要记得清除开发环境和浏览器的缓存。

都清除了,也换成了jetty5.1.14. 问题依旧,绝望了:(
12 楼 Linuxboy 2007-08-22  
要记得清除开发环境和浏览器的缓存。
11 楼 dengyin2000 2007-08-22  
koda 写道
引用
确定你的html 和 java 文件的编码用的是utf-8? eclipse的话 在文件上右键 ---》 然后properties。

.java, .html采用UTF-8
数据库utf-8
环境: WindowsXP + mysql5.0.18 + jetty5.1.12

乱码依旧:(



jetty5.1.14. mysql5. 在ubuntu 和windows xp下就没问题。。  呵呵  RP有问题。
10 楼 koda 2007-08-22  
引用
确定你的html 和 java 文件的编码用的是utf-8? eclipse的话 在文件上右键 ---》 然后properties。

.java, .html采用UTF-8
数据库utf-8
环境: WindowsXP + mysql5.0.18 + jetty5.1.12

乱码依旧:(

相关推荐

Global site tag (gtag.js) - Google Analytics