使用嵌入式Jetty和jersey建立Web应用程序,并进行请求分派

拉维吉兰·班格拉(Ravikiran Bangera)

我正在设置一个带有嵌入式码头和运动衫的Web应用程序。由于我对概念还很陌生,因此很难加载示例网页index.html。当我将其定位为localhost:8989 / myServlet时,我会看到代码流过servlet。但是请求调度程序始终返回null。

请让我知道这一点:

主班:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder;


public class MainApp {
    public static void main(String[] args) throws Exception {
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");

        Server jettyServer = new Server(8989);
        jettyServer.setHandler(context);

        ServletHandler handler =new ServletHandler();
        handler.addServletWithMapping(MyServletHandler.class,"/myServlet");


        jettyServer.setHandler(handler);

        ServletHolder jerseyServlet = context.addServlet(
                org.glassfish.jersey.servlet.ServletContainer.class, "/*");
        jerseyServlet.setInitOrder(0);

        jerseyServlet.setInitParameter(
                "jersey.config.server.provider.classnames",
                Entry.class.getCanonicalName());

        try {
            jettyServer.start();
            jettyServer.join();
        } finally {
            jettyServer.destroy();
        }
    }
}

Myservlet类:

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServletHandler extends HttpServlet {


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Control is in servlet");
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("index.html"); // this returns null. hence i am unable to request dispatch to view the html webpage.


    }

}

我使用Maven构建应用程序,并将index.html放在src / main / resources目录中

乔基姆·埃德菲尔特(Joakim Erdfelt)

这可行,但是您必须正确设置,ServletContext以便request.getRequestDispatcher()可以执行某些操作。

对于初学者,您ServletContextHandler必须具有资源库设置。

您必须设置一个,DefaultServlet以便可以正确返回请求分派器。

您还必须正确使用嵌入式码头,不要那样ServletHandler直接使用ServletHolder如果需要,请使用,否则请直接使用ServletContextHandler

这是此行为的示例。

使用baseResource指向包含目录的目录的系统属性运行index.html

package jetty.dispatching;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URI;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.util.resource.Resource;

import static java.nio.charset.StandardCharsets.UTF_8;

public class DispatchingToDefaultServletDemo
{
    public static void main(String[] args) throws Exception
    {
        DispatchingToDefaultServletDemo demo = new DispatchingToDefaultServletDemo();

        try
        {
            demo.startServer();
            demo.makeRequests();
        }
        finally
        {
            demo.stopServer();
        }
    }

    private Server server;

    public void startServer() throws Exception
    {
        server = new Server(8989);

        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        // Must have Resource Base for proper ServletContext (even if it points to an empty URI directory in a JAR file)
        context.setBaseResource(getBaseResource());
        // Don't use ServletHandler directly!
        context.addServlet(MyServletHandler.class, "/myServlet");
        // Add DefaultServlet last on ServletContextHandler to be able to serve content from resource base.
        // It must be named "default" (per servlet spec)
        ServletHolder defaultHolder = new ServletHolder("default", DefaultServlet.class);
        defaultHolder.setInitParameter("dirAllowed", "true");
        context.addServlet(defaultHolder, "/"); // this is the default url-pattern

        HandlerList handlers = new HandlerList();
        handlers.addHandler(context);
        handlers.addHandler(new DefaultHandler()); // always last in handler tree

        server.setHandler(handlers);

        server.start();
    }

    public Resource getBaseResource() throws IOException
    {
        String baseResourceLocation = System.getProperty("baseResource");
        if (baseResourceLocation == null)
        {
            baseResourceLocation = System.getProperty("user.dir");
        }
        Resource resource = Resource.newResource(baseResourceLocation);
        System.out.println("Base Resource is " + resource);
        return resource;
    }

    private void stopServer() throws Exception
    {
        server.stop(); // use .stop() NOT .destroy()
    }

    private void makeRequests()
    {
        performGET("/myServlet");
        performGET("/");
    }

    private void performGET(String requestPath)
    {
        try
        {
            URI uri = server.getURI().resolve(requestPath);
            System.out.println("Requesting GET on " + uri);
            HttpURLConnection http = (HttpURLConnection) uri.toURL().openConnection();
            System.out.println("  Response Status code = " + http.getResponseCode());
            try (InputStream in = http.getInputStream())
            {
                System.out.println("  Response Body: " + IO.toString(in, UTF_8));
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    public static class MyServletHandler extends HttpServlet
    {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("/index.html");
            System.out.println("request Dispatcher = " + requestDispatcher);
            requestDispatcher.forward(request, response);
        }
    }
}

输出 ...

$ java -DbaseResource=/home/joakim/code/jetty/bases/listing-base/rez/welcomish/ -classpath <..snip..> jetty.dispatching.DispatchingToDefaultServletDemo

2019-04-18 15:15:15.595:INFO::main: Logging initialized @180ms to org.eclipse.jetty.util.log.StdErrLog
Base Resource is file:///home/joakim/code/jetty/bases/listing-base/rez/welcomish/
2019-04-18 15:15:15.678:INFO:oejs.Server:main: jetty-9.4.15.v20190215; built: 2019-02-15T16:53:49.381Z; git: eb70b240169fcf1abbd86af36482d1c49826fa0b; jvm 1.8.0_192-b12
2019-04-18 15:15:15.725:INFO:oejs.session:main: DefaultSessionIdManager workerName=node0
2019-04-18 15:15:15.726:INFO:oejs.session:main: No SessionScavenger set, using defaults
2019-04-18 15:15:15.727:INFO:oejs.session:main: node0 Scavenging every 660000ms
2019-04-18 15:15:15.736:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@482f8f11{/,file:///home/joakim/code/jetty/bases/listing-base/rez/welcomish/,AVAILABLE}
2019-04-18 15:15:15.747:INFO:oejs.AbstractConnector:main: Started ServerConnector@3ffc5af1{HTTP/1.1,[http/1.1]}{0.0.0.0:8989}
2019-04-18 15:15:15.747:INFO:oejs.Server:main: Started @333ms
Requesting GET on http://127.0.1.1:8989/myServlet
request Dispatcher = Dispatcher@0x5d8c6ff2{null,/index.html}
  Response Status code = 200
  Response Body: <h1>My welcomish HTML</h1>

Requesting GET on http://127.0.1.1:8989/
  Response Status code = 200
  Response Body: <h1>My welcomish HTML</h1>

2019-04-18 15:15:15.827:INFO:oejs.AbstractConnector:main: Stopped ServerConnector@3ffc5af1{HTTP/1.1,[http/1.1]}{0.0.0.0:8989}
2019-04-18 15:15:15.827:INFO:oejs.session:main: node0 Stopped scavenging
2019-04-18 15:15:15.829:INFO:oejsh.ContextHandler:main: Stopped o.e.j.s.ServletContextHandler@482f8f11{/,file:///home/joakim/code/jetty/bases/listing-base/rez/welcomish/,UNAVAILABLE}

Process finished with exit code 0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Spring Boot应用程序在嵌入式Jetty中配置异步超时

在Docker上使用嵌入式Jetty服务器运行Java应用程序

使用嵌入式Jetty和Tapestry进行日志记录

Java Web应用程序中的嵌入式Derby

如何使用HTML中的嵌入式Java应用程序进行本地文件系统访问

如何在springboot应用程序中使用嵌入式mongoDB进行junit测试?

使用嵌入式 Tomcat 的 Web 应用程序仅适用于 IDE

使用`System.exit()`停止具有嵌入式Jetty服务器的Java应用程序是否安全?

带有Jersey和嵌入式Jetty的CrossOriginFilter

如何在iOS的嵌入式专用框架和应用程序中使用静态库

使用嵌入式 Jetty 计算每秒请求数

如何使用主应用程序和引导加载程序中的一项功能?(嵌入式)

错误:嵌入式二进制文件未使用与父应用程序相同的证书进行签名

Shopify嵌入式应用程序对我的Postgresql数据库的身份验证请求

具有嵌入式 Web 视图的 Teams 消息传递扩展 - Web 应用程序的结构

如何对包含嵌入式助手的应用程序包进行公证?

如何为机器人应用程序/嵌入式系统进行python过渡

在嵌入式Tomcat上从Spring-Boot Web应用程序运行Python脚本

拒绝在我的 Web 应用程序中构建嵌入式网站

基于嵌入式 linux 的 Web 应用程序设计

嵌入式Java Web服务器隐藏应用程序界面

在配置了log4j的嵌入式Jetty应用程序中看不到logback日志

嵌入式Keycloak和Spring Boot应用程序的默认配置

TomEE嵌入式和自定义JAX-RS应用程序部署

电子,react-native和NodeJS应用程序的嵌入式数据库?

在文档和嵌入式闪亮应用程序中渲染图像

嵌入式Flutter应用程序和本机Android中的Firebase身份验证

C#控制台应用程序XML注释和嵌入式注释

从应用程序扩展链接到嵌入式框架