不使用 JnlpDownloadServlet 类启动 JNLP

use*_*353 5 .net java jnlp servlets

Oracle 建议使用该JnlpDownloadServlet 示例从 Web 应用程序启动 JNLP。

无论出于何种原因,我无法使用它,并且必须编写自己的 JNLP 启动代码。

这就是我想出的(启动它的 Servlet):

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException 
{
    performTask(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException 
{
    performTask(request, response);
}

private void performTask(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException 
{
    response.setContentType("application/x-java-jnlp-file");
    byte [] b = getJNLP(..some params..).getBytes();

    response.setContentLength((int) b.length);
    OutputStream responseOutputStream = response.getOutputStream();
    responseOutputStream.write(b);
}
Run Code Online (Sandbox Code Playgroud)

getJNLP是一种将整个 JNLP 文件作为String.

这似乎工作正常。但我错过了什么吗?是否有任何额外的标题等需要设置?

更新:我不使用 JnlpDownloadServlet 的原因是,我必须从 2 个不同的 Web 应用程序启动此 JNLP - 一个 Java 一个和一个 DOTNET 一个。我显然无法使用 DOTNET Web 应用程序中的 JnlpDownloadServlet。我在 DOTNET 应用程序中编写了类似的代码(如上所述)来启动 JNLP。所以我在 Java 应用程序中也保持相同。

Tob*_*tto 1

是的,还有更多需要了解。

例如:Jnlp-Download-Service执行代码库和 href 的替换,如果您在不同的服务器(dev、qa、prod)上安装相同的 WebStart 应用程序,这一点很重要。所以这适用于所有服务器:

<?xml version='1.0' encoding='UTF-8'?>
<jnlp spec='7.0' href='$$name' version='2.5-null' codebase='$$codebase'>
  <information>...
Run Code Online (Sandbox Code Playgroud)

如果不使用 JnlpDownloadServlet,您会失去更多好处。

请查看:https ://docs.oracle.com/javase/8/docs/technotes/guides/javaws/developersguide/downloadservletguide.html#substitutions

但是,您可以在没有任何 Servlet(即没有 JnlpDownloadServlet)的情况下启动 WebStart 应用程序。您甚至可以在不涉及任何服务器的情况下启动 WebStart 应用程序。如果将 jnlp 文件和所有资源放在 Windows 目录中,则不需要任何应用程序服务器。

例如:我在c:\tmp\webstartdemo下有两个文件

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="file:///C:/tmp/webstartdemo">
    <resources>
        <j2se version="1.7+" href="http://java.sun.com/products/autodl/j2se"/>
        <jar href="SwingGui.jar" main="true" />
    </resources>
    <application-desc name="Demo" main-class="Demo"/>
</jnlp>
Run Code Online (Sandbox Code Playgroud)

加上一个只有一个类的迷你SwingGui.jar :

public class Demo {
  public static void main(String... args){
      javax.swing.JOptionPane.showMessageDialog(null, "Hello World");
   }
}
Run Code Online (Sandbox Code Playgroud)

然后我开始:

javaws c:\tmp\webstartdemo\demo.jnlp
Run Code Online (Sandbox Code Playgroud)

当然,您可以将 jnlp 文件和所有资源放在网络服务器中,但它不需要是动态的。我希望这是您问题的答案。