【问题标题】:How to forward from a JAX-RS service to JSP?如何从 JAX-RS 服务转发到 JSP?
【发布时间】:2011-10-22 11:55:32
【问题描述】:

JBoss 版本:4.2.3GA。这适用于 apache tomcat 6.0。在 JBoss 中,我必须添加以下设置:-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=false 才能使转发工作,但现在当我加载页面时,我收到以下错误。感觉就像我正在以 JBoss 不喜欢的方式这样做,但我还没有看到任何其他示例。有谁知道让它工作的方法吗?

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

...


@GET
@Path("/forward")
public String forward(
    @Context final HttpServletRequest request,
    @Context final HttpServletResponse response) throws Exception
{
  RequestDispatcher dispatcher = request.getRequestDispatcher("/index.html");
  dispatcher.forward(request, response);
  return "";
}

例外:

java.lang.ClassCastException: $Proxy114 cannot be cast to javax.servlet.ServletRequestWrapper
    com.itt.scout.server.servlet.admin.config.ConfigController.forward(ConfigController.java:46)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$VoidOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:151)
    com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:70)
    com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:279)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:136)
    com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:86)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:136)
    com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:74)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1357)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1289)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1239)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1229)
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:497)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:684)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

【问题讨论】:

  • 您没有直接使用 servlet。您正在使用 JAX-WS(网络服务)。我删除了“servlet”引用和标签。要了解真正的 servlet 究竟是什么,请查看我们的 servlet wiki 页面 stackoverflow.com/tags/servlets/info
  • 我在做 MVC,带有一个 restlet 控制器和一个 jsp 视图。这在我的示例中可能看起来很有趣,因为我不应该这样转发请求。

标签: jsp http jakarta-ee jax-rs jboss-4.2.x


【解决方案1】:

在从另一个位置获得一些帮助后,我意识到我正在以一种有趣的方式连接我的 JSP 和 restlet,而我真正想做的是使用 Viewable。这在 JBoss 中也更有效。以下是我最终得到的摘要:

import javax.ws.rs.core.Context;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import com.sun.jersey.api.view.Viewable;


@GET
@Path("/index")
public Viewable index(
    @Context HttpServletRequest request,
    @Context HttpServletResponse response) throws Exception
{
  request.setAttribute("key", "value");
  return new Viewable("/jsps/someJsp.jsp", null);
}

【讨论】:

  • 感谢您的回答。如果此方法可以写入响应或转发到另一个 URI,该怎么办?那么这个方法既可以返回一个Response,也可以返回一个Viewable?这是否需要我们声明此方法以返回一个对象?
  • 感谢您的回答。它帮助了我。
  • 谢谢,这有帮助。下一个挑战是如何强制重定向而不是转发到 JSP 页面。
  • 能否分享一下 JBoss 中使用的 Viewable 依赖项?
【解决方案2】:

如果您不使用泽西岛,您可能需要这样做:

@Path("")
@ApplicationPath("blog")
@Stateless
public class BlogApplication extends Application {

    @EJB private PostEJB postEJB;

    @GET
    public void getHome(@Context HttpServletRequest request, 
                        @Context HttpServletResponse response) {
        request.setAttribute("posts", postEJB.getPosts());
        request.getRequestDispatcher("/WEB-INF/pages/blog/home.jsp")
               .forward(request, response);
    }

    @Override
    public Set<Class<?>> getClasses() {
        return new HashSet<Class<?>>(Arrays.asList(BlogApplication.class));
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多