【问题标题】:How to return actual html file using JAX-RS如何使用 JAX-RS 返回实际的 html 文件
【发布时间】:2012-07-14 10:50:46
【问题描述】:

到目前为止,我通过以下方式返回 html 我的主页:

@GET
@Produces({MediaType.TEXT_HTML})
public String viewHome()
{
   return "<html>...</html>";
}

我想要做的是返回 home.html 本身,而不是复制其内容并返回字符串。

我该怎么做?谢谢:)

【问题讨论】:

    标签: java html rest jakarta-ee jax-rs


    【解决方案1】:

    这是我使用 JAX-RS 提供网页的首选方式。网页的资源(html、css、图像、js 等)放在main/java/resources 中,应该将它们部署在WEB-INF/classes 中(可能需要一些配置,具体取决于您如何设置项目)。将ServletContext 注入您的服务并使用它来查找文件并将其作为InputStream 返回。我在下面提供了一个完整的示例以供参考。

    @Path("/home")
    public class HomeService {
        @Context
        ServletContext servletContext;
    
        @Path("/{path: .+}")
        @GET
        public InputStream getFile(@PathParam("path") String path) {
            try {
                String base = servletContext.getRealPath("/WEB-INF/classes/files");
                File f = new File(String.format("%s/%s", base, path));
                return new FileInputStream(f);
            } catch (FileNotFoundException e) {
                // log the error?
                return null;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用构建在 RestEasy 之上的 HtmlEasy,它是 Jax-RS 的一个非常好的实现。

      【讨论】:

        【解决方案3】:

        您可以只返回 java.io.InputStreamjava.io.Reader 的实例 — JAX-RS 会做正确的事情。

        @GET
        @Produces({MediaType.TEXT_HTML})
        public InputStream viewHome()
        {
           File f = getFileFromSomewhere();
           return new FileInputStream(f);
        }
        

        【讨论】:

        • 嗯,好的建议先生。我收到 filenotfoundexception -_- 它是否搜索相对于调用文件的“tosearch.txt”?
        • 这取决于应用程序的“当前目录”是什么——这取决于应用程序的执行位置,即它可以(并且可能会)在运行时更改。 System.out.println(System.getProperty("user.dir")); 将打印解析相关文件的路径。
        • 如果您在 Servlet 应用程序中,getResourceAsStream() 方法 (docs.oracle.com/javaee/6/api/javax/servlet/…) 是比使用 java.io.File 实例更好的选择。
        • 在 webapp-dir 中“加载”文件的最佳方式是什么?
        • @Alex 如果它是 Web 应用程序本身中的一个文件(即,在 src/main/wwwroot 下而不是在 servlet 应用程序的类路径中),那么在 ServletContext 上调用 getResourceAsStream 是前进的方向: docs.oracle.com/javaee/7/api/javax/servlet/…
        【解决方案4】:
        1. 使用getResourceAsStream读取文件
        2. 写回返回的字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-20
          • 1970-01-01
          • 2020-09-08
          • 1970-01-01
          • 2014-11-06
          相关资源
          最近更新 更多