当前位置: 首页 > 知识库问答 >
问题:

如何在Servlet中实现模板方法

段干靖
2023-03-14

我想创建两个带有模板方法(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]套接字:[org.apache.tomcat.util.net.NioEndpoint$KeyAttachment@6bc6f271:组织。阿帕奇。公猫util。网NioChannel@2072289:java。nio。频道。SocketChannel[connected local=/0:0:0:0:0:0:1:8080 remote=/0:0:0:0:0:0:0:0:1:57585]],状态为:[OPEN\u READ],状态为:[CLOSED]

2016-01-31 19:13:52超文本传输协议-Nio-8080-exec-2

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

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个答案

经和洽
2023-03-14

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

最后一个问题是:

可以这样做吗(只读取邮件的一部分)?还是它违反了TCP标准?

 类似资料:
  • 考虑一下问题: 我们有一个带有抽象方法的类。现在,我们希望强制此方法的每个覆盖都将执行一些参数检查或其他一些苦差事。我们希望此参数检查在所有覆盖中都相同。一种解决方案是将此行为包装在一个调用抽象方法的非抽象方法中: 我想让私有,这样的任何子类都不能在不检查其参数的情况下偶然调用它。不幸的是,这是不可能的: 错误:(9,5)Kotlin:修饰符“private”与“abstract”不兼容 Kotl

  • 模板方法模式提供了抽象基类具有不可重写的方法:该方法实现了通用算法,不应在子类中重写。在Java中,模板方法在抽象基类中声明为final,在C中,sealed关键字具有类似的含义,但不能声明未重写的方法。 我如何解决这个问题?为什么不能阻止一个方法可以被子类重写(在C中)?

  • 我有一个带有模板参数T的类模板和一个类型为T的成员。我想用传递给ctor的参数初始化该成员,如果传递的参数是右值引用并且T支持移动语义,我还想移动该参数: 如果我试图将右值引用传递给ctor,则g 4.8会给出以下错误: 错误全文: 有人能帮帮我吗?谢谢!

  • 问题内容: 一个布局模板和三个子模板。 layout.html tags.html content.html comment.html 代码 我很困惑如何渲染每个子模板并将结果组合到布局输出中。 谢谢。 问题答案: 与往常一样,该文档是一个很好的起点。 我在操场上写了一个工作实例 解释一下: 您不需要struct文字中的字符串:,而不是 您只能将单个对象传递给模板才能执行,这将按照指令中的要求将对

  • 我正在用Freemarker模板编写应用程序。我通过Java类获得了如何配置和运行. ftl模板机制的知识,并使控制台或文件输出在上面打印模板结果。 但是如何在servlet上实现呢?它是如何工作的?我想跑。类似Tomcat的ftl文件。jsp文件。但它只给我一个错误(“说明请求的资源不可用”)。 有人能给我解释一下怎么跑吗。servlet上的ftl文件? 这是我的web.xml: 这是我的Jav

  • 在G++中如何做到这一点? 声明类模板ss。[确定] 取消静态函数模板f[ok] 如何专门化f?[错误] 这段代码对于VC++是可以的。 在线:https://godbolt.org/z/qgq6bp