接口作用
自定义PrintWriter,用于不同的默认编码之类的处理。
接口内容
package com.fr.stable.fun;
import com.fr.stable.fun.mark.Immutable;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 字符打印流生成器
*/
public interface PrintWriterProcessor extends Immutable {
String MARK_STRING = "PrintWriterProcessor";
int CURRENT_LEVEL = 1;
/**
* 字符打印流
* @param res HTTP响应
* @param charsetName 编码
* @return 字符打印流
*/
PrintWriter createPrintWriter(HttpServletResponse res, String charsetName) throws IOException;
}
默认实现
public class DefaultPrintWriterProcessor extends AbstractPrintWriterProcessor {
private static DefaultPrintWriterProcessor instance = new DefaultPrintWriterProcessor();
public static DefaultPrintWriterProcessor getInstance() {
return instance;
}
public PrintWriter createPrintWriter(HttpServletResponse res, String charsetName) throws IOException {
PrintWriter writer;
try {
/**
* 郁闷!Weblogic8.1中没有实现setCharacterEncoding和getContentType方法
*/
try {
res.setCharacterEncoding(charsetName);// 有些Servlet的实现中没有实现这个方法
} catch (Throwable throwable) {
// do nothing
}
// 需要加上ContentType,不然乱码啊
String contentType = null;
try {
contentType = res.getContentType();
} catch (Throwable throwable) {
// do nothing
}
// 没有设置contentType或者contentType是空,则用默认的
if (StringUtils.isBlank(contentType)) {
/*
* alex:原来默认为text/html,但是这个方法很多情况下都是返回js, css等格式的
* 有些傻B会判断格式是不是text/html,如果是的话,会在返回的流里面加</html>这种结束标签
*
* 发现在ajax拿到responseText的时候,如果是text/plain,那么会在文字左右加<pre></pre>
* 所以,还是改回原来的text/html,而且试了一下,只有text/html才没有问题,其它类型都有问题
*/
res.setContentType("text/html;charset=" + charsetName);
} // james:没有设置charset则加上charset
else if (!contentType.contains("charset=")) {
res.setContentType(contentType + ";charset=" + charsetName);
}
// james:真正编码后的Writer
writer = new PrintWriter(new OutputStreamWriter(res.getOutputStream(), charsetName));
} catch (UnsupportedEncodingException unsupportedEncodingException) {
FRLogger.getLogger().error(unsupportedEncodingException.getMessage());
writer = new PrintWriter(res.getOutputStream());
}
return writer;
}
}
注册方式
<extra-core>
<PrintWriterProcessor class="com.fr.solution.xxx.YourXXXClassName"/>
</extra-core>