8

我有一个 JAX-RS 资源,在解决业务逻辑后,我想在 JSF 页面中显示结果。我怎样才能做到这一点?

@Path("/rest")
public class PaymentServiceRest {

    @GET
    @Path("/status")
    public String method()  {

        // Business logic...

        return "results.xhtml"; // how to return a jsf page? 
    }
}

客户端第一次访问应用程序时使用的是 url,即:http://myApp/rest/status,然后执行一些逻辑并在此基础上进行重定向。

4

3 回答 3

8

好吧,我找到了一种从 JAX-RS 方法转发到 JSF 页面的方法:

@GET
@Path("/test")
@Produces("text/html")
public Response test(@Context ServletContext context,
        @Context HttpServletRequest request,
        @Context HttpServletResponse response) {

    try {
        String myJsfPage = "/response.xhtml";
        context.getRequestDispatcher(myJsfPage).forward(request, response);
    } catch (ServletException | IOException ex) {
        return Response.status(NOT_FOUND).build();
    }
    return null;
}

如此处所述:https ://www.java.net//forum/topic/glassfish/glassfish/forwarding-jsf-jax-rs

通过该方法的注入也可以通过在字段中的注入来完成,这是“偏好”的问题

这已经在 TomEE (Apache CXF) 中进行了测试。如果这只是一个肮脏的“黑客”或者是否有更好的方法,我只是有点好奇。


更新

我找到了一种更好的重定向方法,它可以毫无问题地呈现 JSF 标签(在我的情况下,标签<p:graphicImage/>没有正确呈现)

@GET
@Path("/test")
@Produces("text/html")
public Response test(@Context HttpServletRequest request, @Context HttpServletResponse response)
        throws IOException {
    String myJsfPage = "/response.xhtml";
    String contextPath = request.getContextPath();
    response.sendRedirect(contextPath + myJsfPage);
    return Response.status(Status.ACCEPTED).build();
}
于 2013-10-21T02:37:21.457 回答
0

您可以在这两种解决方案之间进行选择:

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

@Path("/rest")
public class PaymentServiceRest {

    @Context
    private HttpServletRequest request;
    @Context 
    private HttpServletResponse response;

    /**
     * This method uses the injected request/response in the PaymentServiceRest class
     * @return
     * @throws IOException
     */
    @GET
    @Path("/status1")
    @Produces("text/html")
    public Response method1() throws IOException {
        String myJsfPage = "/views/index.xhtml";
        String contextPath = request.getContextPath();
        response.sendRedirect(contextPath + myJsfPage);
        return Response.status(Status.ACCEPTED).build();
    }

    /**
     * This method uses the injected request/response passed as parameters
     * @return
     * @throws IOException
     */
    @GET
    @Path("/status2")
    @Produces("text/html")
    public Response method2(@Context HttpServletRequest request, @Context HttpServletResponse response)
            throws IOException {
        String myJsfPage = "/views/index.xhtml";
        String contextPath = request.getContextPath();
        response.sendRedirect(contextPath + myJsfPage);
        return Response.status(Status.ACCEPTED).build();
    }
}
于 2016-06-14T17:26:16.667 回答
-1

java类文件

public String processPage1(){
      return "page";
   }

在 faces-config.xml 中

<navigation-case>
      <from-action>#{navigationController.processPage1}</from-action>
      <from-outcome>page</from-outcome>
      <to-view-id>page1.jsf</to-view-id>
   </navigation-case>

访问此链接

于 2013-10-20T19:54:27.770 回答