2017-07-17 80 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()); 
     } 
    }