Java 如何将servlet请求分派到资源方法

Java 如何将servlet请求分派到资源方法,java,rest,servlets,jersey,requestdispatcher,Java,Rest,Servlets,Jersey,Requestdispatcher,我想知道是否可以从servlet向Jersey JAX-RS实现资源类发送请求。我正在尝试这样做,但它似乎不起作用,根据我的日志记录,泽西岛资源永远无法访问 下面是代码示例。我想做的事是不是因为某种原因不可能 请注意,当我通过地址栏在web浏览器中直接访问Jersey资源时,该资源工作正常 另外请注意,“RequestDispatcher.forward”按预期工作。只是“包含”没有 servlet 泽西岛资源 web.xml的相关部分 你有可能转达这个请求 HttpServletRequest

我想知道是否可以从servlet向Jersey JAX-RS实现资源类发送请求。我正在尝试这样做,但它似乎不起作用,根据我的日志记录,泽西岛资源永远无法访问

下面是代码示例。我想做的事是不是因为某种原因不可能

请注意,当我通过地址栏在web浏览器中直接访问Jersey资源时,该资源工作正常

另外请注意,“RequestDispatcher.forward”按预期工作。只是“包含”没有

servlet

泽西岛资源

web.xml的相关部分


你有可能转达这个请求

HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
RequestDispatcher requestDispatcher = null;
requestDispatcher = httpServletRequest.getRequestDispatcher("/items");
dispatcher.forward(request, response);
return;
但是请注意,如果您收到GET请求并尝试转发到POST资源, 它将抛出一个405错误

编辑:

让我了解您试图实现的目标,如果您需要将内容写入响应输出流,您可以使用jersey资源过滤器

 public class YourResourceFilter implements ResourceFilter
    {
    public ContainerRequestFilter getRequestFilter()
        {
            return new ContainerRequestFilter()
            {
                @Override
                public ContainerRequest filter(ContainerRequest containerRequest)
                {
//Pre- editing the request
                return containerRequest;
                }
            };
        }

    @Override
        public ContainerResponseFilter getResponseFilter()
        {
            return new ContainerResponseFilter()
            {
                @Override
                public ContainerResponse filter(ContainerRequest containerRequest, ContainerResponse containerResponse)
                {
// after the request has been completed by your jersey resource
                    return containerResponse;
                }
            };
        }

    }

我通过在web.xml中将Jersey配置为一个过滤器而不是一个servlet,实现了Jersey 2.13。然后,您可以告诉容器也将筛选器应用于包含的请求:

<filter-mapping>
    <filter-name>Jersey Web Application</filter-name>
    <url-pattern>/api/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

RequestDispatcher.include也将用于Jersey处理的请求。不过有一个警告。Jersey调用response.getOutputStream,所以所有输出都必须通过所述输出流执行——这排除了使用response.getWriter的JSP页面。因此,除非您找到解决问题的方法,否则不要在JSP页面中包含Jersey资源,反之亦然,也不要在REST响应中包含评估JSP的结果。

请包含创建dispatcher的代码。@LutzHorn我已经编辑了问题以包含此内容。您得出结论了吗,Jersey如何实现这一点?我无法转发请求,因为不幸的是servlet需要向outputstream Afterwards添加更多内容。我认为您不理解这个问题。我想将一个首先由javax.servlet.http.HttpServlet处理的请求发送到Jersey资源方法。我尝试了您刚才发布的“include”方法,但遇到了问题。对不起,我只是建议使用另一种方法来满足您的需要“在以后向输出流添加更多内容”。谢谢您的帮助,杰拉德=不幸的是,我无法改变这一点,但我很感谢你的建议!你能提供一个链接,上面写着如何包含标签吗?我不能让它工作,当把它包含在web.xml中时,eclipse说它是无效的内容…参见示例;是在Servlet2.4中添加的,请确保声明了正确的web.xml序言。
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
RequestDispatcher requestDispatcher = null;
requestDispatcher = httpServletRequest.getRequestDispatcher("/items");
dispatcher.forward(request, response);
return;
 public class YourResourceFilter implements ResourceFilter
    {
    public ContainerRequestFilter getRequestFilter()
        {
            return new ContainerRequestFilter()
            {
                @Override
                public ContainerRequest filter(ContainerRequest containerRequest)
                {
//Pre- editing the request
                return containerRequest;
                }
            };
        }

    @Override
        public ContainerResponseFilter getResponseFilter()
        {
            return new ContainerResponseFilter()
            {
                @Override
                public ContainerResponse filter(ContainerRequest containerRequest, ContainerResponse containerResponse)
                {
// after the request has been completed by your jersey resource
                    return containerResponse;
                }
            };
        }

    }
<filter-mapping>
    <filter-name>Jersey Web Application</filter-name>
    <url-pattern>/api/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>