- 浏览: 117045 次
- 性别:
- 来自: 哈尔滨
最新评论
-
1054442516:
大哥,小弟刚入门一个月。请tapestry如何集成Mybati ...
(C4)Tapestry IoC:Tapestry IoC Decorators -
walkerstar:
我都是这样做的 public void contribute ...
(2)Tapestry5学习小结:中文验证问题 -
hongyuzhe:
我是真的,那么的那么的希望能多贴出一些,代码说出来。既然能翻译 ...
(A18)Tapestry Core :Configuring Tapestry -
changshuangyi:
问个问题呀,我写的时候为什么private UserAuthe ...
(A6)Tapestry Core:Form Input and Validation -
zhenjw:
怪不得我想看5.0的源代码看不了,原来是没有真正的开放出来呢。 ...
(3)Tapestry5学习小结:显示问题
(1) Tapestry中文问题
在目前的Tapestry5.0.5-SNAPSHOT版本中,Tapestry还没有提供对中文的支持。查找了Tapestry的邮件列表,看到如下的解决办法。
首先,可以写一个UTF8properties的java文件。该文件可以到w3c的网站上找到,代码如下:
- public class Utf8Properties extends Properties {
- /**
- * use serialVersionUID from JDK 1.1.X for interoperability
- */
- private static final long serialVersionUID = 5907218757225133892L;
- /**
- * Encoding used to read properties from a file
- */
- public static final String ENCODING = "UTF-8";
- /**
- * Characters used to write comment lines in a property file
- */
- private static final String COMMENT = "#!";
- /**
- * Possible Separator between key and value of a property in a property
- * file
- */
- private static final String keyValueSeparators = "=: \t\r\n\f";
- /**
- * Creates an empty property list with no default values.
- *
- * @see java.util.Properties#Properties()
- */
- public Utf8Properties() {
- this(null);
- }
- /**
- * Creates an empty property list with the specified defaults.
- *
- * @param defaults the defaults.
- * @see java.util.Properties#Properties(java.util.Properties)
- */
- public Utf8Properties(Properties defaults) {
- this.defaults = defaults;
- }
- /**
- * Reads a property list (key and element pairs) from the input
- * stream. The stream is assumed to be using the UTF-8
- * character encoding or compatible.
- * Characters can be written with their unicode escape sequence.
- *
- * @param inStream the input stream.
- * @exception IOException if an error occurred when reading from the
- * input stream.
- * @throws IllegalArgumentException if the input stream contains a
- * malformed Unicode escape sequence.
- * @see java.util.Properties#load(java.io.InputStream)
- */
- public synchronized void load(InputStream inStream) throws IOException {
- BufferedReader in = new BufferedReader(new InputStreamReader(inStream, ENCODING));
- String line = in.readLine();
- while(line != null) {
- line = removeWhiteSpaces(line);
- if(!line.equals("") && COMMENT.indexOf(line.charAt(0)) == -1) {
- // Removes the beginning separators
- String property = line;
- // Reads the whole property if it is on multiple lines
- while(continueLine(line)) {
- property = property.substring(0, property.length() - 1);
- line = in.readLine();
- property += line;
- }
- //property = new String(property.getBytes(ENCODING), ENCODING);
- if(!property.equals("")) {
- int endOfKey = 0;
- // calculates the ending index of the key
- while(endOfKey < property.length() &&
- (keyValueSeparators.indexOf(property.charAt(endOfKey)) == -1)) {
- endOfKey++;
- }
- String key = property.substring(0, endOfKey);
- String value = property.substring(endOfKey + 1, property.length());
- key = loadConversion(key);
- value = loadConversion(removeWhiteSpaces(value));
- put(key, value);
- //// For debugging only
- //System.out.println("key: " + key);
- //System.out.println("value: " + value);
- //System.out.println("-----------");
- }
- }
- line = in.readLine();
- }
- }
- /**
- * A simple method to remove white spaces
- * at the beginning of a String
- * @param line the String to treat
- * @return the same String without white spaces at the beginning
- */
- public static String removeWhiteSpaces(String line) {
- int index = 0;
- while(index < line.length() && keyValueSeparators.indexOf(line.charAt(index)) != -1) {
- index++;
- }
- return line.substring(index, line.length());
- }
- /**
- * Replaces all characters preceded by a '\' with the corresponding special
- * character and converts unicode escape sequences to their value
- * @param line the String to treat
- * @return the converted line
- */
- private String loadConversion(String line) {
- StringBuffer val = new StringBuffer(line.length());
- int index = 0;
- // Replace all the "\." substrings with their corresponding escaped characters
- for(; index < line.length(); index++) {
- char currentChar = line.charAt(index);
- if(currentChar == '\\') {
- index++;
- currentChar = line.charAt(index);
- switch(currentChar) {
- case 't':
- currentChar = '\t';
- break;
- case 'r':
- currentChar = '\r';
- break;
- case 'n':
- currentChar = '\n';
- break;
- case 'f':
- currentChar = '\f';
- break;
- case 'u':
- index++;
- // Read the xxxx
- int value=0;
- for (int i=0; i<4; i++) {
- currentChar = line.charAt(index++);
- //System.out.println(currentChar);
- switch (currentChar) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- value = (value << 4) + currentChar - '0';
- break;
- case 'a': case 'b': case 'c':
- case 'd': case 'e': case 'f':
- value = (value << 4) + 10 + currentChar - 'a';
- break;
- case 'A': case 'B': case 'C':
- case 'D': case 'E': case 'F':
- value = (value << 4) + 10 + currentChar - 'A';
- break;
- default:
- throw new IllegalArgumentException(
- "Malformed \\uxxxx encoding.");
- }
- }
- // index must point on the last character of the escaped
- // sequence to avoid missing the next character
- index--;
- currentChar = (char) value;
- default:
- break;
- }
- }
- val.append(currentChar);
- }
- return val.toString();
- }
- /**
- * Replaces special characters with their '2-chars' representation.<br/>
- * For example, '\n' becomes '\\' followed by 'n'
- * @param line the String to treat
- * @return the resulting String
- */
- private String storeConversion(String line) {
- int length = line.length();
- StringBuffer outBuffer = new StringBuffer(length*2);
- for(int i = 0; i < length; i++) {
- char currentChar = line.charAt(i);
- switch(currentChar) {
- case '\\':
- outBuffer.append('\\');
- outBuffer.append('\\');
- break;
- case '\t':
- outBuffer.append('\\');
- outBuffer.append('t');
- break;
- case '\n':
- outBuffer.append('\\');
- outBuffer.append('n');
- break;
- case '\r':
- outBuffer.append('\\');
- outBuffer.append('r');
- break;
- case '\f':
- outBuffer.append('\\');
- outBuffer.append('f');
- break;
- default:
- outBuffer.append(currentChar);
- break;
- }
- }
- return outBuffer.toString();
- }
- /**
- * Indicates wether the property continues on the next line or not
- * @param line the beginning of the property that might be continued on the next line
- * @return true if the propertiy continues on the following line, false otherwise
- */
- private boolean continueLine(String line) {
- if(line != null && !line.equals("")) {
- return line.charAt(line.length() - 1) == '\\';
- }
- return false;
- }
- /**
- * The same method as java.util.Properties.store(...)
- *
- * @param out an output stream
- * @param header a description of the property list
- * @see java.util.Properties#store(java.io.OutputStream, java.lang.String)
- */
- public void store(OutputStream out, String header) throws IOException {
- BufferedWriter output;
- output = new BufferedWriter(new OutputStreamWriter(out, ENCODING));
- if (header != null) {
- output.write("#" + header);
- output.newLine();
- }
- output.write("#" + new Date());
- output.newLine();
- // we do not want that a Thread could modify this Utf8Properties
- // while storing it
- synchronized (this) {
- Enumeration e = keys();
- while(e.hasMoreElements()) {
- String key = storeConversion((String)e.nextElement());
- String val = storeConversion((String)get(key));
- output.write(key + "=" + val);
- output.newLine();
- }
- }
- output.flush();
- }
- }
然后将该文件编译后放到org\apache\tapestry\util包内。
接下来就可以修改其原文件了。要修改的原文件是org.apache.tapestry.internal.services包下的MessagesSourceImpl类。将该类的readProperties(Resource resource)方法中的java.util.Properties类改为我们编写的Utf8properties类。然后再修改org.apache.tapestry.internal.services包下的RequestImpl和ResponseImpl类文件。
将RequestImpl类文件中的方法改为如下内容:
- public String getParameter(String name)
- {
- String param = _request.getParameter(name);
- if(param != null)
- try
- {
- param = new String(param.getBytes("ISO-8859-1"),"utf-8");
- }
- catch (UnsupportedEncodingException ex)
- {
- //won't error
- }
- return param;
- }
- public String[] getParameters(String name)
- {
- String[] params = _request.getParameterValues(name);
- try
- {
- for(int i=params.length-1;i>=0;i--){
- params[i] = new String(params[i].getBytes("ISO-8859-1"),"utf-8");
- }
- }
- catch (UnsupportedEncodingException ex)
- {
- //won't error
- }
- return params;
- }
将ResponseImpl类文件中的方法改为如下内容:
- public PrintWriter getPrintWriter(String contentType) throws IOException
- {
- notBlank(contentType, "contentType");
- if(contentType.matches("text/html.*"))
- _response.setCharacterEncoding("utf-8");
- _response.setContentType(contentType);
- return _response.getWriter();
- }
- public OutputStream getOutputStream(String contentType) throws IOException
- {
- notBlank(contentType, "contentType");
- if(contentType.matches("text/html.*"))
- _response.setCharacterEncoding("utf-8");
- _response.setContentType(contentType);
- return _response.getOutputStream();
- }
最后重新编译打包就可以了。最后要注意的是此时我们所有应用用到的文件都要以utf-8格式进行编码.
该问题由LinuxBoy在邮件列表中提出,并得到了解决。
https://issues.apache.org/jira/browse/TAPESTRY-1294
评论
4 楼
foxgst
2007-08-30
5.0.5可以显示中文了。不过对于输入表单的中文没法正常提交,需要追加转换器。
TO KorbenZhang,把所有的页面都定义成了HTML文件,不是个优良解决方法。
TO KorbenZhang,把所有的页面都定义成了HTML文件,不是个优良解决方法。
3 楼
shiweili
2007-07-17
我在开发中遇到了中文参数没办法正常工作的情况。
Tapestry4.0.2、JBoss4.0.3
用的组件是:contrib:XTile
Java代码如下:
@SuppressWarnings("deprecation")
public void handleCallback(IRequestCycle cycle) {
Object[] params = cycle.getListenerParameters();//在上里页面传过来如果是中文参数就不会运行下面的代码。
......}
Html:
<span jwcid="@contrib:XTile" listener="ognl:listeners.handleCallback"
sendName="sendValue" receiveName="recvCompletions" />
有谁也遇到类似的问题吗?
Tapestry4.0.2、JBoss4.0.3
用的组件是:contrib:XTile
Java代码如下:
@SuppressWarnings("deprecation")
public void handleCallback(IRequestCycle cycle) {
Object[] params = cycle.getListenerParameters();//在上里页面传过来如果是中文参数就不会运行下面的代码。
......}
Html:
<span jwcid="@contrib:XTile" listener="ognl:listeners.handleCallback"
sendName="sendValue" receiveName="recvCompletions" />
有谁也遇到类似的问题吗?
2 楼
KorbenZhang
2007-07-16
不用这么复杂,在appModul中加入:
在改改web.xml的filter
我的没有问题。
http://mp2.crecg.com/tfan-dprhm/
public static PageResponseRenderer decoratePageResponseRenderer( @InjectService("PageMarkupRenderer") final PageMarkupRenderer markupRenderer, @InjectService("MarkupWriterFactory") final MarkupWriterFactory markupWriterFactory, final Object delegate) { return new PageResponseRenderer() { public void renderPageResponse(Page page, Response response) throws IOException { MarkupWriter writer = markupWriterFactory.newMarkupWriter(); markupRenderer.renderPageMarkup(page, writer); PrintWriter pw = response.getPrintWriter("text/html; charset=UTF-8"); writer.toMarkup(pw); pw.flush(); } }; }
在改改web.xml的filter
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
我的没有问题。
http://mp2.crecg.com/tfan-dprhm/
1 楼
Linuxboy
2007-07-09
貌似5.0.5已经解决……
发表评论
-
(3)Tapestry5学习小结:显示问题
2007-06-27 11:34 5394显示问题 我在做验证的 ... -
(2)Tapestry5学习小结:中文验证问题
2007-06-27 10:54 4435Tapestry5学习小结:中文验证问题 Tapestry5. ... -
(F1)Tapestry Upload:Tapestry Upload Component
2007-06-23 12:41 2922本文翻译出处 http://tapestry.apac ... -
(E1)Tapestry-Test
2007-05-28 16:06 3178本文翻译出处 http://tapestry.apache ... -
(D1)Tapestry-Spring Integration
2007-05-28 15:17 3834本文翻译出处 http://tapestry.apache ... -
(C15)Tapestry IoC:Service Builders Shadow Services
2007-05-28 13:45 2612本文翻译出处 http://tap ... -
(C14)Tapestry IoC:Service Builders Building Pipelines
2007-05-28 12:45 2482本文翻译出处 http://tapestry.apache. ... -
(C13)Tapestry IoC:Service Builders Strategy Pattern
2007-05-28 11:30 2244本文翻译出处 http://tap ... -
(C12)Tapestry IoC:Service Builders Chain of Command
2007-05-28 10:10 2266本文翻译出处 http://tap ... -
(C11)Tapestry IoC:Ordering by Constraints
2007-05-27 15:27 2027本文翻译出处 http://tap ... -
(C10)Tapestry IoC:Object Providers
2007-05-27 14:38 2215本文翻译出处 http://tapestry.apache ... -
(C9)Tapestry IoC:Starting the Registry
2007-05-27 11:44 1946本文翻译出处 http://tap ... -
(C8)Tapestry IoC:Symbols
2007-05-27 10:48 2007本文翻译出处 http://tapestry.apache ... -
(C7)Tapestry IoC:Case Insensitivity
2007-05-26 17:02 1641本文翻译出处 http://tapestry.apache ... -
(C6)Tapestry IoC:Type Coercion
2007-05-26 14:29 1751本文翻译出处 http://tap ... -
(C5)Tapestry IoC:Tapestry IoC Configurations
2007-05-26 09:19 1750本文翻译出处 http://tapestry.apache ... -
(C4)Tapestry IoC:Tapestry IoC Decorators
2007-05-25 10:19 1844本文翻译出处 http://tapestry.apache ... -
(C3)Tapestry IoC:Tapestry IoC Services
2007-05-24 13:04 1874本文翻译出处 http://tapestry.apache ... -
(C2)Tapestry IoC:Tapestry IoC Modules
2007-05-22 12:47 2056本文翻译出处 http://tapestry.apache ... -
(C1)Tapestry IoC:Introduction
2007-05-21 17:08 1974本文翻译出处 http://tapestry.apache ...
相关推荐
"tapestry学习入门资料" Tapestry 是一个开源的基于 servlet 的应用程序框架,它使用组件对象模型来创建动态的、交互的 web 应用。 Tapestry 使得 Java 代码与 HTML 完全分离,利用这个框架开发大型应用变得...
1. **Tapestry5最新中文教程.doc**: 这份文档可能是针对Tapestry 5的最新中文教程,旨在为初学者提供一个易懂的入门指南。通常,它会涵盖基本的框架安装、环境配置、组件使用、事件处理、页面和组件生命周期等主题...
Apache Tapestry 5 是一个基于Java的Web应用开发框架,其设计目的是为了简化Web应用程序的构建,提供组件化的页面构建、输入验证...通过学习和实践Tapestry 5,开发者能够更好地理解和掌握现代Web应用开发的最佳实践。
### Tapestry5最新中文入门实例教程 #### 一、引言 Tapestry是一个使用Java语言创建Web应用程序的面向组件的开发框架。本教程旨在通过实际案例帮助读者掌握Tapestry 5的基本概念和核心功能,并体验其带来的高效开发...
Apache Tapestry 5 是一个基于Java的开源Web应用程序框架,其设计目标是提供一个面向组件的开发环境,简化Web应用的构建。...通过学习和掌握Tapestry 5,开发者能够构建出更优雅、用户体验更好的Web应用程序。
Apache Tapestry 5 是一个基于Java的Web应用开发框架,其核心理念是组件化开发,通过构建组件来创建页面。Tapestry 5 提供了一系列的功能,包括输入验证、本地化/国际化、状态管理和URL映射,使得开发者能更高效地...
本书主要面向希望学习或提高 Tapestry 5 技能的 Java 开发者。无论您是初学者还是有一定经验的开发者,都可以从中获得有价值的见解和实用的技巧。 #### 三、核心内容概览 ##### 1. **基础概念** - **Tapestry 5 ...
### Tapestry5 实例开发详解 #### 一、前言 Tapestry 是一款用于构建企业级Java Web应用的强大框架,其第五代版本——Tapestry5,更是以其易用性和灵活性著称。本文旨在通过一个简单的实例来详细介绍如何利用...
### Tapestry 5:构建 Web 应用程序 #### 一、Tapestry 5 概述 Tapestry 5 是一个强大的 Java Web 开发框架,它为开发者提供了高效且简洁的方式去创建复杂的 Web 应用程序。本书《Tapestry 5:构建 Web 应用程序》...
1. **Tapestry Core**: 这是Tapestry框架的基础部分,包含了核心组件、服务容器(Tapestry IoC)和页面生命周期管理。通过源码分析,我们可以理解其如何实现页面组件的渲染、事件处理和依赖注入。 2. **Tapestry ...
"tapestry中文字典"可能包含对Tapestry框架中的专有名词、API和概念的中文解释,帮助读者更准确地理解和记忆。它可能是以索引形式存在,方便查找和查阅。 通过学习这些文档,开发者可以全面了解Tapestry 4的架构和...
Tapestry的错误报告和调试信息非常详细,有助于快速定位和解决问题。它还提供了一种友好的方式来显示用户友好的错误页面,而不是暴露技术堆栈跟踪。 学习Tapestry不仅意味着掌握其基本概念,还需要熟悉如何设计...
《Tapestry 5 電子書》是关于Java Web开发框架Tapestry 5的一本详尽指南,由Packt Publishing在2007年出版。这本书旨在帮助开发者深入理解和掌握Tapestry 5的各个方面,从而利用其强大功能构建高效、可维护的Web应用...
虽然Tapestry 4的中文文档较少,但提供的《Tapestry4 用户指南》和《Tapestry4 快速启动》是宝贵的参考资料。它们将帮助初学者理解Tapestry的基本概念、组件使用、事件处理等方面的知识。 总的来说,Tapestry 4是...
Tapestry5和jQuery集成.使用jQuery以极少的兼容问题完全替换Prototype 和 Scriptaculous库 标签:tapestry5
Tapestry是一个基于控件的框架以致于用它开发Web应用类似开发传统的GUI应用。你用Tapestry开发Web应用时你无需关注以操作为中心的(Operation-centric) Servlet API.引用Tapestry网站上的一句话:"Tapestry用对象...
### 关于Tapestry 5的关键知识点 #### 1. 什么是Tapestry? Tapestry是一个开源框架,用于创建动态、稳健且高度可扩展的Java Web应用程序。它补充并建立在标准Java Servlet API之上,因此可以在任何Servlet容器或...
是一本由多本Tapestry资料整合而成。包括一些Tapestry的实例。
1. **Tapestry 5基础** - **组件模型**:Tapestry 5的基础是组件,它们是可重用的、自包含的UI元素。组件可以是HTML元素、表单字段,甚至其他更复杂的组件。 - **页面和组件生命周期**:理解页面和组件的创建、...