2017-07-17 79 views
0

刚刚花了一天的时间试图让灰熊静态内容工作。以下来自Grizzly博客的URL解释了很多:Grizzly STatic Content上下文webapp下面的灰熊静态内容路径

我想模仿Tomcat,因为我会将静态内容的路径放在webapp或上下文句柄之下。

public class SampleAdminApplication extends ResourceConfig { 
    public SampleAdminApplication() { 
     packages("com.companyname.sample.sampleadmin.server.services"); 
    } 
} 

public class SampleGrizzlyWebServer { 
    public static void main(String[] args) throws IOException { 
     try { 
      HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(
       URI.create("http://localhost:9090/Sample/")); 

      /*--- Static Content ---*/ 
      String jarPath = getJarPath(SampleGrizzlyWebServer.class); 
      CLStaticHttpHandler clStaticHttpHandler = new CLStaticHttpHandler(
        new URLClassLoader(new URL[] {new File(jarPath).toURI().toURL()}), 
        "/", "/lib/", "/js/", "/css/"); 
      ServerConfiguration sc = httpServer.getServerConfiguration(); 
      sc.addHttpHandler(clStaticHttpHandler,"/SampleUI"); 

      /*--- SampleAdmin WebappContext ---*/ 
      WebappContext SampleAdminContext = new WebappContext("WebappContext", "/" + webapp + "/" + "SampleAdmin"); 

      /*--- Servlet ---*/ 
      final ResourceConfig sampleAdminRc = new SampleAdminApplication(); 
      ServletRegistration sampleAdminRegistration = SampleAdminContext.addServlet("ServletContainer", new ServletContainer(sampleAdminRc)); 
      sampleAdminRegistration.addMapping("/*"); 

      /** 
      * Deploy Server 
      */ 
      SampleAdminContext.deploy(httpServer); 
      /** 
      * Start Server 
      */ 
      httpServer.start(); 
     } catch (Exception ex) { 
      System.err.println("Error: " + ex.getMessage()); 
     }   
    } 
} 

上面的代码适用于以下网址:

http://localhost:9090/Sample/SampleAdmin/restmethod 
http://localhost:9090/SampleUI/hello.htm 

不过,我想静态页面,以低于webapp的路径 “样本” 像:

http://localhost:9090/Sample/UI/hello.htm 

任何帮助将不胜感激。

回答

0

嗯,我不知道我是否得到任何徽章来回答我自己的问题:) 我工作了几天,试图从过滤器实现向前。在这个论坛上有多个关于球衣转发的未回复的帖子。不明显如何从过滤器转发。 EndRant

我的解决方案是使用对HttpHandlerRegistration.builder()的过时调用,它允许我有效地设置一个/ Sample/UI上下文。

现在,代码的行为就像Tomcat,其中Sample/{SampleAdmin,UI}是端点。

startServer("http://", "localhost", "Sample", "UI", "9090"); 

    public static void startServer(String protocol, String host, String webapp, String ui, String port) { 
     try { 
      String BASE_URI = protocol + host + ":" + port + "/" + webapp + "/"; 

      HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI)); 

      /*--- Static UI Content ---*/ 
      if(ui!=null && !ui.equals("")) { 
       String jarPath = getJarPath(SampleGrizzlyWebServer.class); 
       if (jarPath != null) { 
        CLStaticHttpHandler clStaticHttpHandler = new CLStaticHttpHandler(
          new URLClassLoader(new URL[]{new File(jarPath).toURI().toURL()}), 
          "/", "/lib/", "/js/", "/css/"); 
        ServerConfiguration sc = httpServer.getServerConfiguration(); 
        sc.addHttpHandler(clStaticHttpHandler, HttpHandlerRegistration.builder().contextPath("/" + webapp + "/" + ui + "").urlPattern("").build()); 
       } 
      } 

      /*--- SampleAdmin WebappContext ---*/ 
      WebappContext SampleAdminContext = new WebappContext("WebappContext", "/" + webapp + "/" + "SampleAdmin"); 

      /*--- Servlet ---*/ 
      final ResourceConfig sampleAdminRc = new SampleAdminApplication(); 
      ServletRegistration sampleAdminRegistration = SampleAdminContext.addServlet("ServletContainer", new ServletContainer(sampleAdminRc)); 
      sampleAdminRegistration.addMapping("/*"); 

      /** 
      * Deploy Server 
      */ 
      SampleAdminContext.deploy(httpServer); 
      httpServer.start(); 

      System.out.println("Jersey app started with WADL available at:"); 
      System.out.println(BASE_URI + "SampleAdmin/application.wdl"); 
      System.out.println("Hit enter to stop it..."); 
      System.in.read(); 
      httpServer.shutdown(); 
     } 
     catch(Exception ex) { 
      System.err.println("Error: " + ex.getMessage()); 
     } 
    }