ããã¯ããªã«ãããããŠæžãããã®ïŒ
- Undertowã«ã¯ãResourceManagerãšãããªãœãŒã¹ãæ±ãã€ã³ã¿ãŒãã§ãŒã¹ããã
- ResourceManagerã®å®è£ ã䜿ããšãéçãã¡ã€ã«ãUndertowã§å ¬éã§ããããã
ãšããããã§ãè©ŠããŠã¿ãŸããã
ResourceManagerïŒ
ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ããã
ããã¥ã¡ã³ãäžã§ããå°ãã ãç»å ŽããŸãã
The resource handler is used to serve static resources such as files. This handler takes a ResourceManager instance, that is basically a file system abstraction. Undertow provides file system and class path based resource mangers, as well as a caching resource manager that wraps an existing resource manager to provide in memory caching support.
HandlerãšããŠã¯ãResourceHandlerã䜿ããŸãã
ResourceManagerã«ã¯å®è£ ãããã€ãããã
- æå®ããjava.io.Fileãèµ·ç¹ã«ããã¡ã€ã«ã·ã¹ãã ãããªãœãŒã¹ãååŸãããã®
- æå®ããjava.nio.file.Pathãèµ·ç¹ã«ããã¡ã€ã«ã·ã¹ãã ãããªãœãŒã¹ãååŸãããã®
- ã¯ã©ã¹ãã¹ãããªãœãŒã¹ãååŸãããã®
- ResourceManagerãã©ãããããã£ãã·ã¥ã®æ©èœãæäŸãããã®
ãšãã£ããã®ãååšããŸãã
ãé¡
ä»åã¯ãç°¡åãªServletïŒResourceManagerïŒResourceHandlerïŒã䜿ã£ãŠãåçã³ã³ãã³ãã®å
¬éãšéçã³ã³ãã³ãã®å
¬éã®
äž¡æ¹ããã£ãŠã¿ãŸãããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã§ãã
$ java -version openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-0ubuntu0.18.04.1-b13) OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode) $ mvn -version Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T03:33:14+09:00) Maven home: $HOME/.sdkman/candidates/maven/current Java version: 1.8.0_181, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre Default locale: ja_JP, platform encoding: UTF-8 OS name: "linux", version: "4.15.0-34-generic", arch: "amd64", family: "unix"
æºå
MavenäŸåé¢ä¿ã¯ããã¡ãã
<dependency> <groupId>io.undertow</groupId> <artifactId>undertow-servlet</artifactId> <version>2.0.13.Final</version> </dependency>
undertow-servletã®ã¿ã§ãããŸãã
ããšãéçãã¡ã€ã«ã¯çšæããã®ãé¢åã ã£ãã®ã§ãBootstrapãããŠã³ããŒãããŠããŠå±éã
JavaScritãCSSã¯ãBootstrapã®zipãå±éåŸããã£ã¬ã¯ããªãã²ãšã€äžã«ç§»ããŠããŸãã
$ find src/main/resources -type f | perl -wp -e 's!(.+)/(.+)!$1 $2!' | sort src/main/resources/static bootstrap-4.1.3-dist.zip src/main/resources/static index.html src/main/resources/static/css .DS_Store src/main/resources/static/css bootstrap-grid.css src/main/resources/static/css bootstrap-grid.css.map src/main/resources/static/css bootstrap-grid.min.css src/main/resources/static/css bootstrap-grid.min.css.map src/main/resources/static/css bootstrap-reboot.css src/main/resources/static/css bootstrap-reboot.css.map src/main/resources/static/css bootstrap-reboot.min.css src/main/resources/static/css bootstrap-reboot.min.css.map src/main/resources/static/css bootstrap.css src/main/resources/static/css bootstrap.css.map src/main/resources/static/css bootstrap.min.css src/main/resources/static/css bootstrap.min.css.map src/main/resources/static/js bootstrap.bundle.js src/main/resources/static/js bootstrap.bundle.js.map src/main/resources/static/js bootstrap.bundle.min.js src/main/resources/static/js bootstrap.bundle.min.js.map src/main/resources/static/js bootstrap.js src/main/resources/static/js bootstrap.js.map src/main/resources/static/js bootstrap.min.js src/main/resources/static/js bootstrap.min.js.map
index.htmlã¯ãGetting startedããããŠã
Introduction / Starter template
BootstrapãæäŸããJavaScriptãCSSã¯ãããŒã«ã«ãã¡ã€ã«ãåç §ããããã«èšè¿°ããŠããŸãã src/main/resources/static/index.html
<!doctype html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="/static/css/bootstrap.min.css"> <title>Hello, world!</title> </head> <body> <h1>Hello, world!</h1> <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="/static/js/bootstrap.min.js"></script> </body> </html>
Servletãçšæ
åçã³ã³ãã³ãã®é 信圹ãšããŠãç°¡åãªServletãäœæããŸãã src/main/java/org/littlewings/undertow/HelloServlet.java
package org.littlewings.undertow; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.getWriter().write("Hello Undertow Servlet!!"); } }
æ¬åœã«ãè³ã£ãŠã·ã³ãã«ã
Undertowãèµ·åãã
ã§ã¯ããã®ServletãšResourceManagerã䜿ã£ãŠãUndertowã䜿ã£ãèµ·åã¯ã©ã¹ãäœæããŠãããŸãã
çµæã¯ããã¡ãã src/main/java/org/littlewings/undertow/Server.java
package org.littlewings.undertow; import java.nio.file.Paths; import javax.servlet.ServletException; import io.undertow.Handlers; import io.undertow.Undertow; import io.undertow.server.HttpHandler; import io.undertow.server.handlers.resource.ClassPathResourceManager; import io.undertow.server.handlers.resource.PathResourceManager; import io.undertow.server.handlers.resource.ResourceManager; import io.undertow.servlet.Servlets; import io.undertow.servlet.api.DeploymentInfo; import io.undertow.servlet.api.DeploymentManager; public class Server { public static void main(String... args) throws ServletException { DeploymentInfo deploymentInfo = Servlets .deployment() .setClassLoader(Server.class.getClassLoader()) .setContextPath("/") .setDeploymentName("app") .addServlets( Servlets.servlet(HelloServlet.class).addMapping("/servlet/hello") ); DeploymentManager deploymentManager = Servlets.defaultContainer().addDeployment(deploymentInfo); deploymentManager.deploy(); ResourceManager resourceManager = new PathResourceManager(Paths.get("src/main/resources/static")); HttpHandler handler = Handlers .path(Handlers.redirect("/static")) .addPrefixPath("/static", Handlers.resource(resourceManager)) .addPrefixPath("/app", deploymentManager.start()); Undertow server = Undertow .builder() .addHttpListener(8080, "localhost") .setHandler(handler) .build(); server.start(); } }
Servletã®ç»é²ãšããããã€ã
DeploymentInfo deploymentInfo = Servlets .deployment() .setClassLoader(Server.class.getClassLoader()) .setContextPath("/") .setDeploymentName("app") .addServlets( Servlets.servlet(HelloServlet.class).addMapping("/servlet/hello") ); DeploymentManager deploymentManager = Servlets.defaultContainer().addDeployment(deploymentInfo); deploymentManager.deploy();
éçãã¡ã€ã«ã®ååŸãä»åã¯ãjava.nio.file.Pathãèµ·ç¹ã«æžããŠããŸãã
ResourceManager resourceManager = new PathResourceManager(Paths.get("src/main/resources/static"));
ã§ããããã䜿ã£ãŠHttpHandlerãäœæã
HttpHandler handler = Handlers .path(Handlers.redirect("/static")) .addPrefixPath("/static", Handlers.resource(resourceManager)) .addPrefixPath("/app", deploymentManager.start());
Handlers.pathã§ã¯ããã©ã«ãã®HttpHandlerãã/ã以äžã«å²ãåœãŠãã®ã§ãããããã¯ã/staticããžãªãã€ã¬ã¯ãããããã«èšå®ã
éçã³ã³ãã³ãã¯ã/staticãé äžãServletã¯ã/appãé äžãšãããã¹ã®å²ãåœãŠã§å ¬éããŸãã
.addPrefixPath("/static", Handlers.resource(resourceManager)) .addPrefixPath("/app", deploymentManager.start());
ããšã¯ããã®HttpHandlerã䜿ã£ãŠUndertowãèµ·åã
Undertow server = Undertow .builder() .addHttpListener(8080, "localhost") .setHandler(handler) .build(); server.start();
確èªã
Servletã
$ curl -i localhost:8080/app/servlet/hello HTTP/1.1 200 OK Connection: keep-alive Content-Length: 24 Date: Sat, 15 Sep 2018 08:26:47 GMT Hello Undertow Servlet!!
éçã³ã³ãã³ãã
$ curl -i localhost:8080/static/index.html HTTP/1.1 200 OK Connection: keep-alive Last-Modified: Sat, 15 Sep 2018 08:26:45 GMT Content-Length: 928 Content-Type: text/html Accept-Ranges: bytes Date: Sat, 15 Sep 2018 08:27:11 GMT <!doctype html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="/static/css/bootstrap.min.css"> <title>Hello, world!</title> </head> <body> <h1>Hello, world!</h1> <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="/static/js/bootstrap.min.js"></script> </body> </html> $ curl -i -I localhost:8080/static/js/bootstrap.min.js HTTP/1.1 200 OK Connection: keep-alive Last-Modified: Tue, 24 Jul 2018 01:37:42 GMT Content-Length: 51039 Content-Type: application/javascript Accept-Ranges: bytes Date: Sat, 15 Sep 2018 08:28:14 GMT $ curl -i -I localhost:8080/static/css/bootstrap.min.css HTTP/1.1 200 OK Connection: keep-alive Last-Modified: Tue, 24 Jul 2018 01:37:28 GMT Content-Length: 140936 Content-Type: text/css Accept-Ranges: bytes Date: Sat, 15 Sep 2018 08:28:36 GMT
JavaScriptãšCSSã¯çµæãé·ãã®ã§ãHEADã ãã
åäœããŠããŸããã
ä»åã¯java.nio.file.Pathãèµ·ç¹ã«ããResourceManagerã䜿ããŸããããã¯ã©ã¹ãã¹ããååŸããå Žåã¯ããããªæãã
ResourceManager resourceManager = new ClassPathResourceManager(Server.class.getClassLoader(), "static");
ã¯ã©ã¹ãã¹äžã®ããããã¹ãèµ·ç¹ã«ãªãœãŒã¹ãååŸããŸãã
å®è¡çµæã¯ãå ã»ã©ãšåããªã®ã§å²æã
ããããããšã¯ç¢ºèªã§ããã®ã§ãOKã§ãã
DeploymentInfoã«ResourceManagerãèšå®ãã
ä»åã¯ãHttpHandlerãšããŠåå¥ã«ResourceHandlerãèšå®ããŸããããResourceManagerãDeploymentInfoã«
å«ããŠèšå®ããããšãå¯èœãªããã§ãã
DeploymentInfo deploymentInfo = Servlets .deployment() .setClassLoader(Server.class.getClassLoader()) .setContextPath("/") .setDeploymentName("app") .setResourceManager(new PathResourceManager(Paths.get("src/main/resources/static"))) .addServlets( Servlets.servlet(HelloServlet.class).addMapping("/servlet/hello") );
Weldã®ããã¥ã¡ã³ããèŠãŠããŠãæ°ã¥ããŸããâŠã
Content-TypeïŒ
ResourceManagerã䜿ãã«ããããContent-Typeãã¡ãã£ãšæ°ã«ãªããšããã ã£ãã®ã§ãããå²ãšãã£ããå
¥ã£ãŠ
ããŸããã
ãããã©ããªã£ãŠããã®ããªãŒãšæã£ãã®ã§ãããããã©ã«ãã§ããçšåºŠç»é²ãããŠããããã§ãã