Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 如何在书写后清除PrintWriter的内容_Java_Servlets_Printwriter - Fatal编程技术网

Java 如何在书写后清除PrintWriter的内容

Java 如何在书写后清除PrintWriter的内容,java,servlets,printwriter,Java,Servlets,Printwriter,晚上好,我想知道如何清除写入PrintWriter的数据,即打印后是否可以从PrintWriter中删除数据 在这个servlet中,我将一些文本打印到响应中,并在#表示的行中删除所有以前打印的数据并打印新内容: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter o

晚上好,我想知道如何清除写入PrintWriter的数据,即打印后是否可以从PrintWriter中删除数据

在这个servlet中,我将一些文本打印到响应中,并在#表示的行中删除所有以前打印的数据并打印新内容:

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    String uName = request.getParameter("uName");
    String uPassword = request.getParameter("uPassword");

    if (uName .equals("Islam")) {
        out.println("Valid-Name");
        if (uPassword !=null) {
            if (uPassword .equals("Islam")) {
                // # clear the writer from any printed data here
                out.println("Valid-password");
            } else {
                out.println("");
                out.println("InValid-password");
            }
        }
    } else {
        out.println("InValid-Name");

    }

}

注意:我尝试了.flush(),但旧的打印文本仍然保留着,您不能使用从响应中获得的原始
PrintWriter
来执行此操作,因为这是由对应于客户端连接的实际
OutputStream
支持的。你在那里写的东西通过线路直接进入浏览器(经过一些缓冲),所以你不能“收回”

您可以做的是在一些
StringBuilder
中编写您的消息,一旦您知道可以开始了,就将其写入
PrintWriter

如果您想在多个地方(透明地)应用这个逻辑,您可以考虑编写一个过滤器,它在一个<代码> HTTPServestRealServer包装器< /C>中覆盖原始响应,它返回一个“冒牌”<代码> OuttoStuts或<代码> PrimTrriste/Cuff>,并在实际通过该线发送之前执行此检查。

public class CensorshipFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        CensorshipResponseWrapper wrapper = new CensorshipResponseWrapper(httpServletResponse);
        chain.doFilter(request, wrapper);
        String output = wrapper.sw.toString();
        if ( output.contains("Some forbidden pattern") ) { // your check goes here
            // throw exception or whatever
        } else { // write the whole thing
            httpServletResponse.getWriter().write(output);
        }
    }

    @Override
    public void destroy() {
    }

    static class CensorshipResponseWrapper extends HttpServletResponseWrapper {
        private final StringWriter sw = new StringWriter();

        public CensorshipResponseWrapper(HttpServletResponse response) {
            super(response);
        }

        @Override
        public ServletOutputStream getOutputStream() throws IOException {
            // you may also fake the output stream, if some of your servlets use this method
            return super.getOutputStream();
        }

        @Override
        public PrintWriter getWriter() throws IOException {
            return new PrintWriter(sw);
        }
    }
}

使用
StringWriter
创建内存中的
PrintWriter
。您可以从
StringWriter
获取底层缓冲区,并在需要时清除它

StringWriter sr = new StringWriter();
PrintWriter w = new PrintWriter(sr);

w.print("Some stuff");
// Flush writer to ensure that it's not buffering anything
w.flush();
// clear stringwriter
sr.getBuffer().setLength(0);

w.print("New stuff");

// write to Servlet out
w.flush();
response.getWriter().print(sr.toString());

HttpServlteResponse.resetBuffer()
将清除缓冲内容。但是是的,如果响应已经刷新到客户端,它将抛出
IllegalStateException
。因为在向客户端发送部分响应后清除是非法的

重置缓冲区。。。。。。。。 void resetBuffer()
清除响应中基础缓冲区的内容,而不清除标头或状态代码。如果已提交响应,则此方法将抛出IllegalStateException

参考文献:


最终对我有效的是改变我输出数据的逻辑

这是我输出的数据结构,它存储了使用html表单中的文本作为输入的搜索结果

private final TreeMap<String, ArrayList<SearchResult>> searchResults;
考虑到我的servlet设置,清除数据结构非常有效

这是我的主要serverlet循环逻辑:

public void startServer()
{
    // seed the database for testing
    crawler.startCrawl("http://cs.usfca.edu/~cs212/birds/birds.html");
    index.toJSON("index.json");

    // type of handler that supports sessions
    ServletContextHandler servletContext = null;

    // turn on sessions and set context
    servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
    servletContext.setContextPath("/");
    servletContext.addServlet(ViewServlet.class, "/");

    // default handler for favicon.ico requests
    DefaultHandler defaultHandler = new DefaultHandler();
    defaultHandler.setServeIcon(true);

    ContextHandler defaultContext = new ContextHandler("/favicon.ico");
    defaultContext.setHandler(defaultHandler);

    // setup handler order
    HandlerList handlers = new HandlerList();
    handlers.setHandlers(new Handler[]{defaultContext, servletContext});

    openWebBrowser();

    // setup jetty server
    Server server = new Server(portNumber);
    server.setHandler(handlers);
    try
    {
        server.start();
        server.join();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}

flush应该做到这一点,然后是close.Servlet的规范提供了一种实现这一点的方法。请参阅下面的答案,第二种通用方法(响应包装器)或如何使用StringBuilder?在第二种通用方法(响应包装器)上,Servlet的规范提供了一种方法。请看下面的答案。这种方法并不总是有效的。没有标准的方法来保证Servlet PrintWriter底层缓冲区的大小;事实上,它没有义务提供一个。此方法始终有效。只要知道Servlet规范所说的内容,它就始终有效。Servlet规范说,当您在PrintWriter中溢出缓冲区时,可以提交响应。你不知道缓冲区的大小是多少,事实上,它不能是0字节。这如何帮助您实现“始终有效”?您始终可以设置所需的缓冲区大小。即使您使用自己的PrintWriter,也只能在一定程度上缓冲。您不能将其设置为响应缓冲区大小。
public void startServer()
{
    // seed the database for testing
    crawler.startCrawl("http://cs.usfca.edu/~cs212/birds/birds.html");
    index.toJSON("index.json");

    // type of handler that supports sessions
    ServletContextHandler servletContext = null;

    // turn on sessions and set context
    servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
    servletContext.setContextPath("/");
    servletContext.addServlet(ViewServlet.class, "/");

    // default handler for favicon.ico requests
    DefaultHandler defaultHandler = new DefaultHandler();
    defaultHandler.setServeIcon(true);

    ContextHandler defaultContext = new ContextHandler("/favicon.ico");
    defaultContext.setHandler(defaultHandler);

    // setup handler order
    HandlerList handlers = new HandlerList();
    handlers.setHandlers(new Handler[]{defaultContext, servletContext});

    openWebBrowser();

    // setup jetty server
    Server server = new Server(portNumber);
    server.setHandler(handlers);
    try
    {
        server.start();
        server.join();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}