From 682cd47a549bdb7005eb41f9d152074da7fc5d19 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 26 Dec 2017 14:03:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=81=D1=82=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BC=D0=B8=D0=BD=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 16 +++ pom.xml | 100 ++++++++++++++++++ .../dmitriymx/skeleton/springmvc/WebApp.java | 99 +++++++++++++++++ .../skeleton/springmvc/WebAppController.java | 24 +++++ 4 files changed, 239 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/ru/dmitriymx/skeleton/springmvc/WebApp.java create mode 100644 src/main/java/ru/dmitriymx/skeleton/springmvc/WebAppController.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3ce6d95 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +## IDEA ## +.idea/ +out/ +*.iml +*.ipr +*.iws +*.ids + +## ECLIPSE ## +.settings/ +bin/ +.classpath +.project + +## MAVEN ## +target/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d799a93 --- /dev/null +++ b/pom.xml @@ -0,0 +1,100 @@ + + + 4.0.0 + Skeleton - Spring MVC + + ru.dmitriymx.skeleton + spring-mvc + 1.0-SNAPSHOT + + + UTF-8 + 1.8 + 1.7.21 + 4.2.5.RELEASE + 9.4.0.v20161208 + + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + + + org.slf4j + slf4j-simple + ${slf4j.version} + + + + + org.springframework + spring-core + ${spring.version} + + + commons-logging + commons-logging + + + + + org.springframework + spring-webmvc + ${spring.version} + + + + + org.eclipse.jetty + jetty-server + ${jetty.version} + + + org.eclipse.jetty + jetty-webapp + ${jetty.version} + + + + + org.projectlombok + lombok + 1.16.16 + + + + + ${project.artifactId}-${project.version} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.15 + + -Dfile.encoding=${project.build.sourceEncoding} + + + + + + diff --git a/src/main/java/ru/dmitriymx/skeleton/springmvc/WebApp.java b/src/main/java/ru/dmitriymx/skeleton/springmvc/WebApp.java new file mode 100644 index 0000000..836e05e --- /dev/null +++ b/src/main/java/ru/dmitriymx/skeleton/springmvc/WebApp.java @@ -0,0 +1,99 @@ +package ru.dmitriymx.skeleton.springmvc; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Slf4jLog; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import java.net.InetSocketAddress; + +@RequiredArgsConstructor +@Slf4j +public class WebApp { + private final String host; + private final int port; + + /** + * Данный класс является файлом настройки контекста для Spring + * однако, т.к. мы никакие бины не объявляем, то красс пустует + */ + @Configuration + @EnableWebMvc + public static class SpringConfigMVC extends WebMvcConfigurerAdapter { + } + + /** + * Создаем Spring-контекст + * + * @return {@link WebApplicationContext} + */ + private WebApplicationContext getWebApplicationContext() { + AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); + context.register(SpringConfigMVC.class); + context.register(WebAppController.class); + // или + // context.setConfigLocation("ru.dmitriymx.skeleton.springmvc"); + // в этом случае будет просканирован весь пакет на @Configuration + return context; + } + + /** + * Подготавливаем обработчик запросов + * + * @param context Spring-контекст веб-приложения {@link WebApplicationContext} + * @return {@link ServletContextHandler} + */ + private ServletContextHandler getServletContextHandler(WebApplicationContext context) { + ServletContextHandler contextHandler = new ServletContextHandler(); + contextHandler.setErrorHandler(null); + contextHandler.setContextPath("/"); + contextHandler.addServlet(new ServletHolder(new DispatcherServlet(context)), "/*"); + contextHandler.addEventListener(new ContextLoaderListener(context)); + return contextHandler; + } + + /** + * Запуск встроенного Jetty веб-сервера + */ + private void start() { + Log.setLog(new Slf4jLog("Jetty.Logger")); + Server server = new Server(new InetSocketAddress(host, port)); + server.setHandler(getServletContextHandler(getWebApplicationContext())); + try { + server.start(); + server.join(); + } catch (Exception e) { + log.error("Error start server", e); + } + } + + /** + * Для запуска можно указать два параметра: хост и порт. + * По-умолчанию: 127.0.0.1:8080 + * + * @param args параметры запуска + */ + public static void main(String[] args) { + String host = "127.0.0.1"; + int port = 8080; + + if (args.length == 2) { + host = args[0]; + port = Integer.parseInt(args[1]); + } + + log.info("Web app listen: {}:{}", host, port); + WebApp app = new WebApp(host, port); + app.start(); + } +} diff --git a/src/main/java/ru/dmitriymx/skeleton/springmvc/WebAppController.java b/src/main/java/ru/dmitriymx/skeleton/springmvc/WebAppController.java new file mode 100644 index 0000000..45b493a --- /dev/null +++ b/src/main/java/ru/dmitriymx/skeleton/springmvc/WebAppController.java @@ -0,0 +1,24 @@ +package ru.dmitriymx.skeleton.springmvc; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * Здесь описываются все пути, что начинаются с '/' + */ +@Controller +@RequestMapping("/") +public class WebAppController { + + /** + * Обработка корневого запроса '/' + * + * @return Сырое строковое значение + */ + @RequestMapping + @ResponseBody + public String index() { + return "Hello world!"; + } +}