Skip to content Skip to sidebar Skip to footer

How To Correctly Support Html5

i have a simple ResourceHandler on my Java/jetty application, jetty is serving a 2 simple files, one is a html5 page and the other is my video.mp4 video file.

Solution 1:

This works with Jetty 9.2.3.v20140905

package org.eclipse.jetty.demo;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

publicclassVideoServerMain
{
    @SuppressWarnings("serial")publicclassIndexerServletextendsHttpServlet
    {
        @OverrideprotectedvoiddoGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException
        {
            resp.setContentType("text/html");

            PrintWriterout= resp.getWriter();
            out.println("<!DOCTYPE html>");
            out.println("<html><head><title>Videos</title></head>");
            out.println("<body>");
            for (File file : baseDir.listFiles())
            {
                if (file.isFile() && file.getName().endsWith(".mp4"))
                {
                    StringencodedFilename= URLEncoder.encode(file.getName(), "UTF-8");
                    out.println("<video style=\"width: 400px; height: 300px\" controls loop>");
                    out.printf("  <source src=\"%s\" type=\"video/mp4\">%n",encodedFilename);
                    out.println("</video>");
                    out.printf("<p>%s</p>%n",file.getName());
                    out.println("<hr/>");
                }
            }
            out.println("</body>");
            out.println("</html>");
        }
    }

    publicstaticvoidmain(String[] args)
    {
        if (args.length != 1)
        {
            System.err.printf("ERROR: Usage %s [videos-dir]%n",VideoServerMain.class.getName());
            System.exit(-1);
        }

        FilebaseDir=newFile(args[0]);
        if (!baseDir.exists() || !baseDir.isDirectory())
        {
            System.err.printf("ERROR: not a valid directory: %s%n",baseDir);
            System.exit(-1);
        }

        try
        {
            newVideoServerMain(baseDir).start();
        }
        catch (Throwable t)
        {
            t.printStackTrace(System.err);
        }
    }

    privatefinal File baseDir;

    publicVideoServerMain(File baseDir)
    {
        this.baseDir = baseDir;
    }

    publicvoidstart()throws Exception
    {
        Serverserver=newServer(8080);

        // Establish Scratch directory for the servlet context (used by JSP compilation)FiletempDir=newFile(System.getProperty("java.io.tmpdir"));
        FilescratchDir=newFile(tempDir.toString(),"embedded-jetty-html5-vide-server");

        if (!scratchDir.exists())
        {
            if (!scratchDir.mkdirs())
            {
                thrownewIOException("Unable to create scratch directory: " + scratchDir);
            }
        }

        // Setup the basic application "context" for this application at "/"// This is also known as the handler tree (in jetty speak)ServletContextHandlercontext=newServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        context.setAttribute("javax.servlet.context.tempdir",scratchDir);
        context.setResourceBase(baseDir.toURI().toASCIIString());

        // Add servlet to present html for found videosServletHolderholderIndexer=newServletHolder(newIndexerServlet());
        context.addServlet(holderIndexer,"/indexer");

        // Make sure that our welcome-file is the indexer servlet
        context.setWelcomeFiles(newString[]{ "indexer" });

        // Allow static file serving of videos themselves, via DefaultServlet// Add Default Servlet (must be named "default")ServletHolderholderDefault=newServletHolder("default",DefaultServlet.class);
        holderDefault.setInitParameter("resourceBase",baseDir.getAbsolutePath());
        holderDefault.setInitParameter("dirAllowed","true");
        holderDefault.setInitParameter("welcomeServlets","true");
        holderDefault.setInitParameter("redirectWelcome","true");

        context.addServlet(holderDefault,"/");

        server.setHandler(context);

        server.start();
        server.join();
    }
}

There seems to be 2 issues for you.

  1. The ResourceHandler is too simple for the demands that the browser puts on it.

    The browser seems to do a lot of partial requests, long duration requests, and recovery when needed. These kinds of requests are best done with the DefaultServlet

  2. The HTML you are using for the video tag didn't work, but when I changed it to the following it worked fine.

<video style="width: 400px; height: 300px" controls loop=>
  <source src="VID_20130822.mp4"type="video/mp4">
</video>

then chrome seemed to be happy again.

Post a Comment for "How To Correctly Support Html5