【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

接口作用

自定义PrintWriter,用于不同的默认编码之类的处理。

接口内容

PrintWriterProcessor
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>
  • No labels