JBoss等价的glassfish交替docroot

时间:2013-08-07 00:13:45

标签: jsf jboss glassfish jboss7.x

使用Glassfish非常容易:

考虑我在unix /apps/static_content/上的绝对路径。 使用Glassfish,我只需将备用doc root 定义为:

<property name="alternatedocroot_1"
  value="from=/static/* dir=/apps/static_content/"/>

当我上传我的图片和其他数据文件时,我可以将它们保存到/apps/static_content目录,在我的JSF页面中,我可以正常显示我的静态内容:

<p:graphicsimage value="/static/external_web_app.png"/>

我真的需要在JBoss AS7中实现相同的功能

我该怎么做?

3 个答案:

答案 0 :(得分:1)

这个问题有点老了,但是如果有人需要用更新版本的JBoss / Wildfly来解决这个问题。

JBoss AS从版本8重命名为Wildfly(即Wildfly 8是JBoss AS 8),Red Hat支持的JBoss版本更名为JBoss EAP。所以这适用于:

  • Wildfly(任何版本)
  • JBoss EAP(版本7)

首先要注意的是&#34; Alternate doc root&#34;玻璃鱼中的特征并不像那样。请查看此问题,以获取有关此功能行为的说明:Alternate docroot not working on glassfish 4

现在,为了回答这个问题,JBoss / Wildfly是基于Undertow构建的,它可以让你完全按照你的需要做。请参阅此问题,了解如何将underow配置为静态内容的Web服务器:How to configure Wildfly to serve static content (like images)?

答案 1 :(得分:0)

  • 选项1:您可以尝试部署单独展开的.war文件,并将其用于静态内容

在您的情况下:.../jboss-7/standalone/deployments/必须有static.war/

因此上传进入此目录,并以正常方式回馈内容。

有关详细信息,请参阅Is it possible to deploy an exploded war file (unzipped war) in JBoss AS 7

正如BalusC所指出的:只要上传数据,就不得重新部署/删除此目录。您应该定期备份此目录。

据我所知,这是仅通过配置/设置的唯一可能性。


  • 选项2:创建名称为static.war的单独网络应用程序。添加 servlet以流式传输静态内容

这样就不需要将文件上传/存储到../deployments/下面的文件系统中,它可以是任何目录,但是你需要一个额外的servlet,所以它以编程方式解决。

一个简单的流式servlet看起来像这样(只是流式传输 - 没有身份验证等):

public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

        final File dir = new File("/var/cms/storage/");
        final String start = "/static/";
        final String relativePath = request.getRequestURI().substring(
                request.getRequestURI().indexOf(start) + start.length());
        final File file = new File(dir, relativePath);
        final String ct = URLConnection.guessContentTypeFromName(file.getName());
        response.setContentType(ct);

        final InputStream is = 
            new BufferedInputStream(new FileInputStream(file));
        try {
            final boolean closeOs = true;
            org.apache.commons.fileupload.util.Streams.copy
                    (is, response.getOutputStream(), closeOs);
        } finally {
            is.close();
        }
    }

将所有URL映射到此servlet:

<servlet-mapping>
    <servlet-name>DownloadServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

名称static.war提供/static/网络上下文,因此应与代码中的网址兼容。

答案 2 :(得分:0)

如果您浏览jboss目录,您会发现有很多可用于存储不同类型数据的内容,例如jboss.serer.data.dir。

您可以尝试通过系统属性询问此目录路径,并在您的服务所使用的数据文件夹中存储此目录。

String path = System.getProperty("jboss.server.data.dir");  

然后你可以根据需要使用 path ,如果只是静态,如你的例子中所示直接设置目录的名称。

这应该有用,我希望:p

ps:如前一个答案所示,保存的数据将保留在目录中,您不能重新部署/删除此目录..它会将您的数据保存在那里..