Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在一个简单的servlet过滤器中不调用getWriter()?_Java_Servlet Filters - Fatal编程技术网

Java 为什么在一个简单的servlet过滤器中不调用getWriter()?

Java 为什么在一个简单的servlet过滤器中不调用getWriter()?,java,servlet-filters,Java,Servlet Filters,我已从以下位置下载UpperCaseFilter和CharResponseWrapper类: UpperCaseFilter.java package filters; import java.io.CharArrayWriter; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax

我已从以下位置下载UpperCaseFilter和CharResponseWrapper类:

UpperCaseFilter.java

package filters;

import java.io.CharArrayWriter;
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.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class UpperCaseFilter implements Filter {
  protected FilterConfig config;

  public void init(FilterConfig config) throws ServletException {
    this.config = config;
  }

  public void destroy() {
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws ServletException, IOException {
    ServletResponse newResponse = response;
    System.out.println("UpperCasefilter begin");
    if (request instanceof HttpServletRequest) {
      newResponse = new CharResponseWrapper((HttpServletResponse) response);
    }

    chain.doFilter(request, newResponse);

    System.out.println("UpperCaseFilter end");
    if (newResponse instanceof CharResponseWrapper) {
      String text = newResponse.toString();
      if (text != null) {
        text = text.toUpperCase();
        response.getWriter().write(text);
      }
    }
  }
}
CharResponseWrapper.java

package filters;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

class CharResponseWrapper extends HttpServletResponseWrapper {
  protected CharArrayWriter charWriter;

  protected PrintWriter writer;

  protected boolean getOutputStreamCalled;

  protected boolean getWriterCalled;

  public CharResponseWrapper(HttpServletResponse response) {
    super(response);

    charWriter = new CharArrayWriter();
  }

  public ServletOutputStream getOutputStream() throws IOException {
    if (getWriterCalled) {
      throw new IllegalStateException("getWriter already called");
    }

    getOutputStreamCalled = true;
    return super.getOutputStream();
  }

  public PrintWriter getWriter() throws IOException {
    if (writer != null) {
      return writer;
    }
    if (getOutputStreamCalled) {
      throw new IllegalStateException("getOutputStream already called");
    }
    getWriterCalled = true;
    writer = new PrintWriter(charWriter);
    return writer;
  }

  public String toString() {
    String s = null;

    if (writer != null) {
      s = charWriter.toString();
    }
    return s;
  }
}
并将web.xml文件修改为:

 <filter>
    <filter-name>Filter1</filter-name>
    <filter-class>filters.UpperCaseFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

过滤器1
过滤器
过滤器1
/*
我还从主Apache基金会网站下载了“Apache -ToCAT-60.37”。 当我运行web应用程序时,我可以看到我的System.out.println()语句执行,因此我知道它正在运行UpperCaseFilter类

但是,当我导航到
http://127.0.0.1:8080
所有字符都不是大写!一切看起来都很正常(一个标准的Tomcat主页)

为了调试它,我决定执行“/catalina.sh jpda start”。我注意到CharWrapperResponse.getWriter()函数从未被调用,因此从未初始化“writer”对象。因此,当UpperCaseFilter调用CharResponseWrapper.toString()时,“text”变量最终为null,因为writer为null(即,由于writer=null,无法向text写入任何内容)


我无法理解为什么从未调用UpperCaseFilter.getWriter()

是否存在您确定已调用的其他筛选器?不,这是一个非常简单的示例。我从Apache的网站上下载了tomcat,然后立即测试了上面的两个java类?如果在已部署的WAR中配置,则只会在web应用(*)下调用筛选器UpperCaseFilter.class和CharResponseWrapper.class文件已复制到$TOMCAT_HOME/webapps/ROOT/web-INF/classesI知道UpperCaseFilter正在执行,因为我看到了打印语句。