|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
发信人: cloudor (String[] args), 信区: Java
标 题: JSP里用tag输出javabean里的中文字符 (附源码)
发信站: BBS 水木清华站 (Sat Sep 28 14:56:37 2002), 站内信件
题外话:如果你已经能象google那样用utf-8而不是什么狭隘
的gb2312/gbk/gb18030等charset在同一个页面毫无冲突显
示简体繁体阿拉伯语藏文等多种语言,那你可以跳过本文了!
本文是针对那些正常中文String显示在charset=gb2312/gbk/gb18030
的jsp而作的。
何为正常中文String?如果String中的所有中文字都是一个char来
表示,那就谓之“正常”,而我们要正确输出这些正常中文String,
就必须将之“不正常化”,这就都怪JspWriter只能正确输出ISO8859-1
字符集中的char(如果这个我说错了,请纠正),所以对于一个正常
中文String s,我们要把它new String(s.getBytes("gb18030"),"iso8859-1")
以后才可以正确输出。不用担心你的中文char被腰斩,JspWriter写
这些char时其实告诉浏览器它在输出byte,浏览器将会重新组合这些
所谓的“byte”,将那些被腰斩的中文char救活。
我不想频繁来回使用这些讨厌的new String()和getBytes(),于是
继承了struts的<bean:write>,写了一给自己用的tag。(strusts
的jar文件和源码可以从jakarta.apache.org获得)
- 使用方法
- 1. 配置taglib的一般步骤省略,不懂就找本书来看吧。
- 2. jsp里先声明taglib
- <%@ taglib uri="/WEB-INF/app.tld" prefix="app" %>
- 3. 使用:
- <%-- 输出String类型的bean --%>
- <app:write name="mybean"/>
- <%-- 输出bean 的String类型的property --%>
- <app:write name="mybean" property="field" />
- <%-- 同上,过滤html敏感字符 --%>
- <app:write name="mybean" property="field" filter="true" />
- <%-- 使用指定的encode和decode,默认encode为gb18030,
- 默认decode为iso8859-1,详情看源码 --%>
- <app:write name="mybean" property="field" encode="gb18030"
- decode="iso8859-1" />
- 源码 (.tld文件和.java文件)
- =====
- app.tld
- =====
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <!DOCTYPE taglib
- PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
- "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
- <taglib>
- <tlib-version>1.0</tlib-version>
- <jsp-version>1.1</jsp-version>
- <short-name>Application Tag Library</short-name>
- <tag>
- <name>write</name>
- <tag-class>cloudor.jspext.tag.WriteTag</tag-class>
- <body-content>emplty</body-content>
- <attribute>
- <name>filter</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- <attribute>
- <name>ignore</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- <attribute>
- <name>name</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- <attribute>
- <name>property</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- <attribute>
- <name>scope</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- <attribute>
- <name>decode</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- </tag>
- </taglib>
- =====
- app.tld结束
- =====
- =====
- cloudor.jspext.tag.WriteTag
- =====
- //: WriteTag.java
- package cloudor.jspext.tag;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.PageContext;
- import javax.servlet.jsp.tagext.TagSupport;
- import org.apache.struts.util.RequestUtils;
- import org.apache.struts.util.ResponseUtils;
- /**
- * Inheritance of <code>org.apache.struts.taglib.bean.WriteTag</code>
- * to handle extra encoding and decoding functions.
- *
- * @author Cloudor Pu(cloudor@etang.com)
- */
- public class WriteTag extends org.apache.struts.taglib.bean.WriteTag
- {
- /* ========================================
- Properties
- ======================================== */
- /**
- * Charset that we use to encode. Default is <code>gb18030</code>.
- *
- */
- protected String encode = "gb18030";
- public String getEncode() { return (this.encode); }
- public void setEncode(String encode) { this.encode = encode; }
- /**
- * Charset that we use to decode. Default is <code>iso8859-1</code>.
- */
- protected String decode = "iso8859-1";
- public String getDecode() { return (this.decode); }
- public void setDecode(String decode) { this.decode = decode; }
- /* ========================================
- Public Methods
- ======================================== */
- /**
- * Process the start tag.
- *
- * @exception JspException if a JSP exception has occurred
- */
- public int doStartTag() throws JspException
- // Look up the requested bean (if necessary)
- Object bean = null;
- if (ignore)
- {
- if (RequestUtils.lookup(pageContext, name, scope) == null)
- return (SKIP_BODY); // Nothing to output
- }
- // Look up the requested property value
- Object value =
- RequestUtils.lookup(pageContext, name, property, scope);
- if (value == null)
- return (SKIP_BODY); // Nothing to output
- // Print this property value to our output writer, suitably filtered
- String s = value.toString();
- String output = "";
- try
- {
- output = new String( s.getBytes(encode) , decode );
- }catch(Exception e)
- {
- output = s;
- }
- if (filter)
- ResponseUtils.write(pageContext, ResponseUtils.filter(output));
- else
- ResponseUtils.write(pageContext, output);
- // Continue processing this page
- return (SKIP_BODY);
- }
- /**
- * Release all allocated resources.
- */
- public void release()
- {
- super.release();
- encode="gb18030";
- decode="iso8859-1";
- }
- }
- ///:~
- =====
- WriteTag.java文件结束
- =====
复制代码
--
上上下下浇着那条毛巾,然后,我打了个冷战. |
|