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

在编程配置的Jetty嵌入式服务器中使用HttpRequestHandlerServlet

齐浩淼
2023-03-14
import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.Test;

import static org.mockito.Mockito.*;

import org.springframework.context.support.StaticApplicationContext;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.GenericWebApplicationContext;
import org.springframework.web.context.support.HttpRequestHandlerServlet;

public class TestServer extends Server {

    public TestServer() throws Exception {      
        super(8888);

        final ServletContextHandler contextHandler = new ServletContextHandler(this, "/", ServletContextHandler.NO_SESSIONS|ServletContextHandler.NO_SECURITY);
        final ServletContext context = contextHandler.getServletContext();

        StaticApplicationContext applicationContext = new StaticApplicationContext();
        applicationContext.registerSingleton("testServlet", TestBean.class);
        applicationContext.refresh();

        GenericWebApplicationContext webApplicationContext = new GenericWebApplicationContext();
        webApplicationContext.setParent(applicationContext);
        webApplicationContext.setServletContext(context);
        webApplicationContext.refresh();

        context.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webApplicationContext);

        ServletConfig servletConfig = new ServletConfig() {

            @Override
            public String getServletName() {                
                return "testServlet";
            }

            @Override
            public ServletContext getServletContext() {
                return context;
            }

            @Override
            public String getInitParameter(String name) {
                return null;
            }

            @Override
            public Enumeration<String> getInitParameterNames() {
                return null;
            }
        };

        HttpRequestHandlerServlet httpRequestHandlerServlet = new HttpRequestHandlerServlet();
        httpRequestHandlerServlet.init(servletConfig);

        ServletHolder servletHolder = new ServletHolder(httpRequestHandlerServlet);

        contextHandler.addServlet(servletHolder, "/testBean");

        start();
    }

    @Test
    public void test() throws Exception {
        TestServer testServer = new TestServer();

        Request baseRequest = new Request();
        HttpServletRequest request = mock(HttpServletRequestWrapper.class);
        HttpServletResponse response = mock(HttpServletResponseWrapper.class);

        testServer.handle("/testBean", baseRequest, request, response);     
    }
}

class TestBean implements HttpRequestHandler {

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getOutputStream().write("Steve".getBytes());
    }   
}

史蒂夫·阿尔迪斯

共有1个答案

轩辕成天
2023-03-14

我知道“目标bean名称必须与web.xml中定义的HttpRequestHandlerServlet servlet-name匹配”(请参见HttpRequestHandlerServlet上的JavaDoc),但我只完成了使用编程方法时所需的一半工作。

添加以下代码使我摆脱了这个问题:

servletHolder.setName("testServlet");

史蒂夫·阿尔迪斯

 类似资料:
  • 我制作了一个非常基本的web应用程序,它只有一个html页面。我把它当作战争输出。 现在我创建了一个嵌入式jetty服务器。 } 我为这个嵌入式服务器创建了一个jar。但是当我试图通过嵌入式服务器运行我的web应用程序时,我得到以下错误。 C:\users\user>Java-jar C:\users\user\desktop\jetty\webserver.jar null 我使用过jetty

  • 配置服务器最好作为独立应用程序运行,但如果需要,可以将其嵌入到另一个应用程序中。只需使用@EnableConfigServer注释。在这种情况下可以使用的可选属性是spring.cloud.config.server.bootstrap,它是一个标志,表示服务器应该从其自己的远程存储库配置自身。该标志默认关闭,因为它可能会延迟启动,但是当嵌入在另一个应用程序中时,以与其他应用程序相同的方式初始化是

  • 我将从Groovy脚本中启动Jetty Web服务器。Jetty的默认日志记录是stderlog。现在我想配置这个日志记录,但文档中只提到了在使用start时如何进行配置。jar方法启动Jetty。 我如何配置,更具体地说,配置旋转日志文件,与StdErrLog嵌入式码头?

  • 问题内容: 我正在编写一些示例代码,其中启动了嵌入式Jetty服务器。服务器必须仅加载一个servlet,将所有请求发送到servlet并在localhost:80上侦听 到目前为止,我的代码: 我可以用更少的代码/行做同样的事情吗?(使用Jetty 6.1.0)。 问题答案: 删除了不必要的空格,并内联移动了ServletHolder创建。删除了5行。

  • 问题内容: 我讨厌问这样一个模糊的问题,但是我很难找到一个简单的例子。这是我到目前为止的内容: 我可以找到的嵌入式Jetty示例始终显示如下内容,以启动运行的Server实例,但我不知道如何实例化WebSocketServlet。 如何创建可以处理WebSocket连接请求的嵌入式服务器? 问题答案: 更新:2013年12月2日 有关带有WebSocket的嵌入式码头的最新示例,请参见: http

  • 问题内容: 嗨:我想将i-jetty集成到Android应用程序中,而不要反过来。之前有人包括i-jetty并使其能够在Android 2.1或2.2下运行吗? 问题答案: 对于那些仍然希望这样做的人,我成功地将I-Jetty集成到了我的应用程序中。 所以基本上我要做的是下载i- jetty源代码并将其作为Eclipse中的Maven项目导入。然后,我在父pom.xml中添加了一个模块,该模块指向