如何从JAX-RS服务转发到JSP?
JBoss版本:4.2.3GA。这在ApacheTomcat6.0中起作用。在JBoss中,我必须添加以下设置:如何从JAX-RS服务转发到JSP?,jsp,http,jakarta-ee,jax-rs,jboss-4.2.x,Jsp,Http,Jakarta Ee,Jax Rs,Jboss 4.2.x,JBoss版本:4.2.3GA。这在ApacheTomcat6.0中起作用。在JBoss中,我必须添加以下设置:-Dorg.apache.catalina.STRICT\u SERVLET\u COMPLIANCE=false,以使转发正常工作,但现在当我加载页面时,会出现下面的错误。感觉上我是以JBoss不喜欢的方式做这件事的,但我没有看到任何其他的例子。有人知道如何让它发挥作用吗 import javax.ws.rs.GET; import javax.ws.rs.Path; import
-Dorg.apache.catalina.STRICT\u SERVLET\u 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)
在从另一个位置得到一些帮助后,我意识到我正在以一种有趣的方式连接JSP和restlet,我真正想做的是使用一个可查看的。这在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);
}
如果您不使用Jersey,您可能需要执行以下操作:
@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));
}
}
@Path(“”)
@应用程序路径(“博客”)
@无国籍
公共类BlogApplication扩展了应用程序{
@EJB私有PostEJB-PostEJB;
@得到
public void getHome(@Context-HttpServletRequest-request,
@上下文(HttpServletResponse){
setAttribute(“posts”,postEJB.getPosts());
getRequestDispatcher(“/WEB-INF/pages/blog/home.jsp”)
.转发(请求、响应);
}
@凌驾
公共集>(Arrays.asList(BlogApplication.class));
}
}
您没有直接使用servlet。您正在使用JAX-WS(Web服务)。我删除了“servlet”引用和标记。要了解真正的servlet实际上是什么,请查看我们的servlets wiki页面我正在使用restlet控制器和jsp视图进行MVC。在我的例子中,这可能看起来很有趣,因为我不应该像那样转发请求。谢谢你的回答。如果此方法可以写入响应或转发到另一个URI怎么办?那么这个方法可以返回一个响应或者一个可查看的?这是否需要我们声明此方法以返回对象?谢谢您的回答。它帮助了我。谢谢你,这很有帮助。下一个挑战是如何强制重定向(而不是转发)到JSP页面。您能否共享JBoss中要使用的可视依赖项?