如何在Servlet中实现模板方法

时间:2016-01-31 18:39:03

标签: java tomcat servlets design-patterns nio

我想用模板方法(GOF)的一些变体创建两个HttpServlet。所以我创建了从HttpServlet扩展的抽象类:

abstract public class AbstractServlet extends HttpServlet {

    abstract void doSomeAction();

    @Override
    protected void service(HttpServletRequest rq, HttpServletResponse rs){

        try {
            //here some logging, getting headers etc.
            System.out.println("Nothing really matters");

            //invoke concrete class
            doSomeAction();

            //write response
            rs.getOutputStream().write(new String("Simple response from class " + this.getClass().getCanonicalName()).getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

两个具体的课程:

public class A extends AbstractServlet {

    @Override
    void doSomeAction() {
        System.out.println("I'm doing something in A");
    }
}


public class B extends AbstractServlet {
    @Override
    void doSomeAction() {
        System.out.println("I'm doing something in B");
    }
}

在调用(成功)其中一个服务之后,我无法得到任何响应。经过一些调试后,看起来好像Tomcat在NIO通道和锁存器方面存在一些问题:

  

2016-01-31 19:13:52 Http11NioProtocol [DEBUG] Socket:   [org.apache.tomcat.util.net.NioEndpoint$KeyAttachment@6bc6f271:org.apache.tomcat.util.net.NioChannel@2072289:java.nio.channels.SocketChannel中[连接   local = / 0:0:0:0:0:0:0:1:8080 remote = / 0:0:0:0:0:0:0:1:57585]],状态   in:[OPEN_READ],陈述:[已关闭]

     

2016-01-31 19:13:52 LimitLatch [DEBUG]计数   down [http-nio-8080-exec-2] latch = 1

但说实话,我不知道发生了什么。有趣的是,当servlet通过例如IOUtils.toByteArray(InputStream is)消耗所有servletrequest输入流时,一切正常!

abstract public class AbstractServlet extends HttpServlet {

    abstract void doSomeAction();

    @Override
    protected void service(HttpServletRequest rq, HttpServletResponse rs){

        try {
            //here some logging, getting headers etc.


        //Consume all inputStream
        org.apache.commons.io.IOUtils.toByteArray(rq.getInputStream());

        //invoke concrete class
        doSomeAction();

        //write response
        rs.getOutputStream().write(new String("Simple response from class " + this.getClass().getCanonicalName()).getBytes());

    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

问题出在哪里?

最好的问候。

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题。我发送了大约有100 MB内容的http帖子,但我只阅读了第一个1024 B的消息,因为业务需求(以及规范,我能够在消息的开头找到有趣的信息)。我可以看到,Tomcat不允许我在1024B之后中断输入流并立即发送响应。

所以,我的最后一个问题是:

是否可以做类似的事情(只读信息的一部分)?还是反对TCP标准?