日期:2014-05-16  浏览次数:20292 次

jsp页面超链接传中文终极解决办法-自定义标签

在做web前端页面的时候,经常碰到传中文问题。网上有许多方案,但仍不能根治,最终要用js或者java的encode相关方法。

常规方案有三部:

1.改tomcat的server.xml中URIEncodeing为utf-8

2.页面中编码设置为utf-8

3.整个项目编码使用utf-8

?

我这样处理后,在火狐下,不会出现乱码,但IE中奇数个中文时仍有乱码。不过可以通过在页面中用URLEncoder.encode()方法解决,但如果在jsp页面里用<%=java.net.URLEncoder.encode(request.getAttribute('xxx'))%>又显得繁琐且不美观。

?

索性自己写个自定义标签来处理

使用此方法就不会再出现IE奇数个汉字成乱码的问题了,不多说,上代码

?

?

EncodeTag.java

?

package mypackage.util;

import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;

public class EncodeTag extends TagSupport {
	private Object key;//自定义标签的key属性

	public void setKey(Object key) throws JspException {
		this.key=ExpressionEvaluatorManager.evaluate("key", key.toString(), Object.class, this, pageContext);

	}
	public int doEndTag() {
		try {// 使用JspWriter获得JSP的输出对象
			JspWriter jspWriterOutput = pageContext.getOut();
			jspWriterOutput.write(URLEncoder.encode(key.toString(),"utf-8"));
		} catch (IOException ioEx) {
			System.out.println("IOException in HelloTag " + ioEx);
		}
		return EVAL_PAGE;
	}
	

}

?

encode.tld(此文件需放在你的web项目的src目录下)

?

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">

	<description>JSTL 1.1 core library</description>
	<display-name>JSTL core</display-name>
	<tlib-version>1.1</tlib-version>

	<short-name>en</short-name>

	<uri>http://www.xxx.org/util/url/encode</uri>

	<tag>

		<name>urlEncode</name>

		<tag-class>mypackage.util.EncodeTag</tag-class>

		<body-content>empty</body-content>

		<attribute>

			<name>key</name>			
			<rtexprvalue>true</rtexprvalue>
			<type>java.lang.Object</type>
		</attribute>

	</tag>

</taglib>

?

在jsp中头部引入

?

<%@ taglib uri="http://www.xxx.org/util/url/encode" prefix="en"  %> 

?

在jsp中使用

<a href="xxx/xxx.do?key=<en:urlEncode key="${obj.key}"/>">xxxx</a></div>