weblogic 8
jdk 1.4
我用filter实现一个页面缓存;发布后控制台却报出如下错误:<2010-1-28 下午02时49分07秒 GMT> <Error> <HTTP> <BEA-101020> <[ServletContext(id=8123587,name=DefaultWebApp,context-path=)] Servlet failed with Exception
java.lang.IllegalStateException: Attempt to change ContentType after calling getWriter() (cannot change charset from 'UTF8' to 'ISO-8859-1')
at weblogic.servlet.internal.ServletResponseImpl.setEncoding(ServletResponseImpl.java:881)
at weblogic.servlet.internal.ServletResponseImpl.setHeaderInternal(ServletResponseImpl.java:713)
at weblogic.servlet.internal.ServletResponseImpl.setHeader(ServletResponseImpl.java:672)
at weblogic.servlet.internal.ServletResponseImpl.setContentType(ServletResponseImpl.java:273)
at javax.servlet.ServletResponseWrapper.setContentType(ServletResponseWrapper.java:164)
at javax.servlet.ServletResponseWrapper.setContentType(ServletResponseWrapper.java:164)
at com.junjing.filter.NotUpsettingHttpServletResponse.setContentType(NotUpsettingHttpServletResponse.java:24)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:385)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:526)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:28)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
at com.junjing.filter.ContentTypePatchFilter.doFilter(ContentTypePatchFilter.java:25)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
at com.junjing.filter.FileCaptureFilter.doFilter(FileCaptureFilter.java:36)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6987)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3892)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2766)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)这是为什么呢?请求大侠帮忙!

解决方案 »

  1.   

    原代码如下:package com.junjing.filter;import java.io.IOException;
    import java.io.PrintWriter;import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletResponse;
    public class FileCaptureFilter implements Filter { private String protDirPath;

    private FileCaptureResponseWrapper responseWrapper;

    public void destroy() {
    // TODO Auto-generated method stub

    }
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
    System.out.println(789);
    HttpServletResponse resp = (HttpServletResponse)response;
    resp.setContentType("text/html; charset=utf-8");
    String fileName = this.protDirPath + "/forum/lastest.html";
    HttpServletResponse res = (HttpServletResponse)response;
    PrintWriter out = res.getWriter();
    String kobe = request.getParameter("kobe");
    if (null == kobe) {
    responseWrapper = new FileCaptureResponseWrapper((HttpServletResponse)response);
    chain.doFilter(request, responseWrapper);
    }

    responseWrapper.writeFile(fileName);

    responseWrapper.writeResponse( out );
    } public void init(FilterConfig filterConfig) throws ServletException {
    // TODO Auto-generated method stub
    protDirPath = filterConfig.getServletContext().getRealPath("/"); }

    }package com.junjing.filter;import java.io.CharArrayWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;public class FileCaptureResponseWrapper extends HttpServletResponseWrapper { private CharArrayWriter output;

    public String toString() {
    return output.toString();
    }
    public FileCaptureResponseWrapper(HttpServletResponse response) {
    super(response);
    output = new CharArrayWriter();
    }
    public PrintWriter getWriter() throws IOException{

    return new PrintWriter(output);

    } public void writeFile(String fileName) throws IOException {
    FileWriter fw = new FileWriter(fileName);
    fw.write(output.toCharArray());
        fw.close(); }

    public void writeResponse(PrintWriter out) {
    out.print(output.toCharArray());
    }
    }
      

  2.   

    web.xml<filter>
    <filter-name>CaptureFilter</filter-name>
    <filter-class>com.junjing.filter.FileCaptureFilter</filter-class>
    </filter> <filter-mapping>
    <filter-name>CaptureFilter</filter-name>
    <url-pattern>/index.jsp</url-pattern>
    </filter-mapping>
      

  3.   

    我想实现对index.jsp页面缓存,可是却出现了如上结果,郁闷啊!请求好心大侠帮忙,小弟不甚感激!
    跪求,好心大侠!