1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Spark — Потрясающий веб-микрофреймворк для Java

Содержание

Introduction to Spark Java

This is an introductory tutorial of the Spark Java web framework. We introduce the Spark Java framework and provide three code examples.

Spark Java

Spark is a Java micro framework for creating web applications in Java 8 with minimal effort. Spark framework is a simple and lightweight Java web framework built for rapid development. It was inspired by Sinatra, a popular Ruby micro framework.

Spark uses Java 8’s lambda expressions extensively, which makes Spark applications a lot less verbose. In contrast to other Java web frameworks, Spark does not use heavily XML files or annotations.

Routes

A Spark application contains a set of routes. A route maps URL patterns to Java handlers.

A route has three parts:

  • a verb, including get, post, put, delete, head, trace, connect, and options
  • a path such as /first or /hello/:name
  • a callback (request, response) ->

First application

The first application returns a simple message. Gradle is used to build the application.

This is the project structure. The Gradle’s Java plugin expects the Java production code to be located in src/main/java directory.

This is the Gradle build file. It includes dependencies for Spark core components and the slf4j simple logger.

The applications returns the «First Spark application message» to the GET request. When we run the application, Spark starts an embedded Jetty web server.

The get() method maps the routes for HTTP GET requests. In the Spark lingo, a route is a handler A route is a URL pattern that is mapped to a handler. A handler can be a physical file or a

We build the application with gradle build command.

We run the application with gradle run command. An embedded Jetty server is started.

We send a GET request to the server with the curl tool. The built-in embedded Jetty server listens on port 4567 by default.

Hello application

The second application will respond with a greeting to the user. The client sends a name with the URL and the application responds with a greeting to the user.

This is the Gradle build file of the application.

This is the project structure.

The Spark application retrieves the request parameter, builds a message, and returns it to the caller.

The params() method returns the value of the provided route pattern parameter.

We build and run the application.

We send a request to the server; the URL includes a name. The application sends back a greeting.

Running Spark application in Tomcat

By default, Spark applications run in an embedded Jetty server. In this example, we show how to run a Spark Java application in Tomcat. This time we use Maven build tool and create a project in NetBeans.

Figure: NetBeans project structure

The figure shows how the project looks like in NetBeans.

This is the Maven build file.

This is the context.xml file.

In the web.xml deployment descriptor, we specify the spark.servlet.SparkFilter .

We implement the SparkApplication interface and specify the route in the init() method.

Finally, we run the Tomcat web server.

The NetBeans’ built-in Tomcat listens on port 8084.

Template engines

Spark does not have its own templating system; it uses third-party engines. In the following two examples, we use Thymeleaf and FreeMarker.

Using Thymeleaf

In the following example, we are going to integrate the Thymeleaf template engine into our Spark application. Thymeleaf is a modern server-side Java template engine for both web and standalone environments.

This is the directory structure of the project. The template files are located in the src/main/resources/templates directory.

Here we have the Gradle build file, which includes the spark-template-thymeleaf dependency.

The application reads the request parameter and puts it into the ModelAndView object.

An instance of the ThymeleafTemplateEngine is passed to the get() method.

This is the hello.html template file. It refers to the name variable which was passed with the ModelAndView object.

We get this output.

FreeMarker

In the following example, we are going to integrate the FreeMarker template engine into our Spark application. FreeMarker is a well established Java template engine.

This is the directory structure of the project. The template file is located in the src/main/resources/views directory.

Here we have the Gradle build file, which includes the spark-template-freemarker dependency.

We set up the same application for FreeMarker.

We configure FreeMarker with the Configuration class. The template files are going to be placed into the views directory, which must be located on the classpath.

The FreeMarkerEngine is passed to the get() method.

This is the hello.ftl template file; it refers to the name variable which was passed with the ModelAndView object.

This is the output.

In this tutorial, we have introduced the Spark Java framework.

The rise of Java Microframeworks

Together with the growing popularity of microservices and light-weight REST API, we are witnessing another trend in Java: the rise of Java Microframeworks. Javalin, Micronaut, Spark and many more make building REST APIs a breeze. In this article, I look at this exciting space and share my opinions on their use.

What is a microframework?

Microframework is a minimalistic web application framework. What usually differs it from more traditional, large applications framework is:

  • Focus on simplicity and speed of development
  • Usually much smaller codebase
  • Lack of some advanced features, such as templating engines, advanced security features etc.

It is not a scientific definition and some frameworks (Vert.x for example) sit at the boundary of the two- on one hand, it is lightweight and much smaller than let’s say Spring, but on the other, it is pretty well featured and non-trivial.

It is worth adding that Java did not invent microframeworks. One of the earlier examples is Sinatra from Ruby (2007) which inspired quite a few Java microframeworks. I am sure some of the readers will be familiar with even earlier examples- if you are, let me know if the comments!

Why are microframeworks growing in popularity?

First of all- microframeworks are not yet mainstream. That may soon change especially with the rapid growth of interest in the Serverless Architectures. Serverless really benefits from small and lightweight deployments- if you want to use Java in that context, microframeworks seem like a good choice.

Читать еще:  Не открывается файл Excel: почему и что делать

Another big driver for their popularity is the increasing adoption of containers (Docker), containers management systems (Kubernetes) and patterns such as API Gateway. Suddenly, the services do not need to deal with as many problems as they used to.

All that would not matter much if the microframeworks themselves were not easy to work with. The new projects are amazing. I am a huge proponent of Spring Boot in the enterprise, but I can’t deny the elegance of Javalin. Unbelievable what today’s microframework creators can accomplish in just a few thousands lines of code!

Tour of microframeworks

Enough talking, let’s look at some of my favorite projects and see how easy they are to work with.

Javalin

A simple web framework for Java and Kotlin

This was my first encounter with a “modern” Java microframework. Javalin is written in Kotlin and has support for both Java and Kotlin. If you want to write a nice REST API, it is a pleasure with Javalin.

Javalin is being actively developed with new versions released every few weeks.

Javalin Hello World:

Spark Java

Spark – A micro framework for creating web applications in Kotlin and Java 8 with minimal effort

One of the earlier Java take on microframeworks dating back to 2011. Spark is very small, focused and probably the most commonly used from the frameworks mentioned here.

Spark is being actively developed with bug fixes and maintenance released every few months. New features are added less frequently.

Spark Hello World:

Micronaut

A modern, JVM-based, full-stack framework for building modular, easily testable microservice applications.

With Micronaut, we are getting quite close to the barrier what is considered a microframework and what is not. The framework is very simple, but it packs a bit more than most of the competition. I think of it as a somewhat extremely slimmed down version of Spring Boot.

What is great about Micronaut is their focus on the cloud. Working on AWS and making it easy to write serverless applications is high on their priority list.

The first milestone of 1.0.0 version was only released on May 30th, 2018 so we are in the very early days here. I think Micronaut has a serious chance of being the next big thing, so keep an eye on this one!

Micronaut Hello World:

Easy to use, fun and asynchronous.

Not quite a Java, but rather a Kotlin microframework. Ktor is sponsored and developed by JetBrains- creators of Kotlin and strives at making development easy and fun. I did not have a chance to test it yet but based on the popularity among Kotlin enthusiasts and the JetBrains support, it is worth mentioning it here.

Ktor did not yet release 1.0.0 version, but it should be sometime this year.

Ktor Hello World:

Other notable microframeworks

It is very difficult to give an overview of every Java microframework out there. Here is the list of the ones that I did not explore further, but can still be investigated and considered:

  • Ratpack – Ratpack is a set of Java libraries for building scalable HTTP applications. It is a lean and powerful foundation, not an all-encompassing framework.
  • Jooby – Scalable, fast and modular micro web framework for Java.
  • Akka HTTP – The Akka HTTP modules implement a full server- and client-side HTTP stack on top of akka-actor and akka-stream. It’s not a web-framework but rather a more general toolkit for providing and consuming HTTP-based services.
  • Dropwizard – Dropwizard is a Java framework for developing ops-friendly, high-performance, RESTful web services.
  • Jodd – Jodd is set of micro-frameworks and developer-friendly tools and utilities. Simple code. Small size. Good performances. Whatever. Use what you like.
  • Armeria – Armeria is an open-source asynchronous HTTP/2 RPC/REST client/server library built on top of Java 8, Netty, Thrift and gRPC.
  • Ninja – Ninja is a full stack web framework for Java. Rock solid, fast, and super productive.
  • Pippo – It’s an open source (Apache License) micro web framework in Java, with minimal dependencies and a quick learning curve.
  • Rapidoid – Rapidoid is an extremely fast HTTP server and modern Java web framework / application container, with a strong focus on high productivity and high performance.

Out of that list, I would recommend checking out Ratpack, Jooby, and Dropwizard. Especially the first two frameworks quite closely follow the microframework philosophy.

I need more than a microframework!

If you need something light, but fully featured I can recommend two main options:

Spring Boot – Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.

Vert.x – Eclipse Vert.x is a tool-kit for building reactive applications on the JVM.

Spring Boot is definitely not micro with all the dependencies that it brings, but the development experience can be quite similar if you are careful with what you chose to use.

Summary

Working with microframeworks is fun and productive. Sometimes it is too easy to always chose Spring Boot and forget that there is a whole world of Java and Kotlin innovation happening out there. I am particularly excited for Micronaut and Javalin and the way they may influence future JVM development. The ultimate cloud support and ultimate simplicity really appeal to me.

If I missed any of your favorite frameworks (or did not give them justice in my comments), be sure to let me know in the comments section!

Spark — A micro framework for creating web applications in Kotlin and Java 8 with minimal effort

Quick start

Kotlin

Run and view

Built for productivity

Spark Framework is a simple and expressive Java/Kotlin web framework DSL built for rapid development. Sparks intention is to provide an alternative for Kotlin/Java developers that want to develop their web applications as expressive as possible and with minimal boilerplate. With a clear philosophy Spark is designed not only to make you more productive, but also to make your code better under the influence of Spark’s sleek, declarative and expressive syntax.

Lets you take full advantage of the JVM

The JVM offers one of the biggest programming ecosystems in the world. It has a lot of Java web frameworks, but pure Java web development has traditionally been very cumbersome. If you love the JVM, but hate verbose code and frameworks, Spark is the web framework for you. It will have you up and running in minutes, and you can even use it with Groovy or Kotlin or whatever you want. Spark is an expressive, lightweight and unopinionated pure Java (and Kotlin) web framework that doesn’t get in your way, unlike in other web frameworks, you can structure your application as you want.

Microservices, microservices everywhere!

2015 was the year of microservice hype, and now that you’re getting around to looking into it you’re about to realize that Spark is great for microservices. Microservices work best with micro frameworks, and Spark has your REST API ready to serve JSON in less than ten lines of code. Spark is mainly used for creating REST API’s, but it also supports a multitude of template engines. Why not create one Spark application for your backend and one for your frontend?

Some companies using Spark:

NodeJS developer? Using TypeScript? Try Spark instead!

Lately, a lot of server-side web development has been taken over by NodeJS, but a growing number of NodeJS developers are using TypeScript and other statically typed languages that compile to JavaScript. Why not go all the way and use a language that was actually designed with types, and intended to run on the server-side? You also get all the benefits of running your application on the JVM, where libraries aren’t deprecated every day. If you’re coming from ExpressJS, then Spark’s syntax will feel very familiar, and unlike a lot of JavaScript web frameworks, Spark won’t be deprecated tomorrow.

Читать еще:  Основы работы с DbForge Studio - инструментом для работы с MySQL

Typical usage

Our 2015 survey tells us that over 50% of Spark users use Spark to create REST APIs, while about 25% use Spark to create websites. About 15% of deployed Spark applications each serve more than 10.000 users a day. Click here to read the full survey.

Spark Framework is a free and open source Java Web Framework, released under the Apache 2 License | Contact | Team

The Spark micro framework

Join the DZone community and get the full member experience.

Jump into a code sample

Features (or lack thereof)

Spark’s API contains few features, but very focused ones.

Request and Response objects provide full control over HTTP headers and functionalities. You can access query and URL parameters; specific headers like Content-Length and Content-Type are provided by a dedicated method, while you can always access any header from the parametric interface. This interface is really equivalent to the Servlet API.

Routes can be provided in a sequential order, each specified for a particular HTTP method (GET or POST usually, but not exclusively) and linking to a callback which will be executed. The callback is the point of conjunction between your application and the HTTP world: separation of concerns is easy to maintain.

Filters are a series of hooks that can be inserted before or after the execution of a request; they can optionally match only certain routes. Filters, which are small objects where a single method should be implemented, are the most coupled mechanism introduced by the Spark framework.

How it works: containers

Spark is a bit different from the classic Java frameworks. It starts itself and configure the application with a main() method, not with the classic inversion of control mechanism where some servlets are deployed into a container.

The advantages of this approach are that it simplifies end-to-end testing, and gives you back the control over the lifecycle of your objects. An hexagonal application uses a few servlets just to wrap its own code, so why bother playing with servlets when you can have your own main?

The disadvantages of the approach are that you won’t get ant functionality from the container, which does not exist here; and you won’t be able to access the standard Servlet API but only Spark’s one (may be a sacrilege).

Actually Spark features Jetty as an embedded container, so the Servlet API is just wrapped by it. You can even run Spark applications in Tomcat or other web servers supporting servlets, and it will integrate like many other frameworks by providing a fixed web.xml. But in my opinion you can just go for Spring in that case.

How it works: configuration

Another pecularity of Spark is that configuration (like routes) are mapped via Java code: there are no XML files, no annotations, and no INIs.

Rather you can use a DSL written in Java, with quite a bit of easy to read static imports (and indeed used at the highest level of abstraction, not inserted in your domain objects.)

This syntax is inspired by Sinatra, a similar DSL for Ruby applications; in interpreted languages is quite common to use the language itself for configuration. After all, this choice forces you to treat configuration that may break the application as code; and when was the last time you changed a route specified in XML without changing any of the Java classes?

Is this a trend?

In general, in my little area of the programming world I’m noticing a softer approach to frameworks, where most of the functionality is provided via libraries instead of as invasive components inserted in the flow of control.

This is also where the PHP world is heading (I know Java developers won’t care, but still it’s interesting):

If you look around, every single framework seems to implement the MVC pattern. And most of them are advertised as MVC frameworks. but not Symfony2. Have a look at the documentation, and you will see that the MVC pattern is only mentioned once or twice, but Symfony2 is never defined as being an MVC framework. Why? [..] I don’t like MVC because that’s not how the web works. Symfony2 is an HTTP framework; it is a Request/Response framework. That’s the big deal. The fundamental principles of Symfony2 are centered around the HTTP specification. — Fabien Potencier

Conclusions

The Java platform is not necessarily tied to the mindset of giant enterprise frameworks; see also how beautifully the Play framework manages HTTP actions (although still with configuration over convention).

Moreover, it does not matter in which language you do develop web applications: at least you can embrace HTTP as the lowest common denominator instead of the MVC machine of a framework. You may not need it, and you may also start not to like it anymore.

10 лучших фреймворков Java для разработчиков

Перевод статьи Клеофаса Мулонго «10 Best Java Frameworks For Software Developers».

С помощью фреймворков Java вы сможете строить приложения быстро, легко и эффективно. Они избавят вас от необходимости писать код с нуля. Также они дадут вам возможность использовать уже написанный код повторно. В этой статье мы расскажем о лучших фреймворках Java, идеально подходящих для разработчиков софта.

1. Spring Framework

Spring относится к самым популярным фреймворкам Java. Большинство Java-разработчиков останавливает свой выбор именно на нем. Одна из причин подобной любви – возможность dependency injection.

Spring это идеальный фреймворк для разработки корпоративных приложений и моделей конфигурации на языке Java. Он помогает разработчикам сосредоточиться на бизнес-логике приложения. Spring очень близок к фреймворку Spring Boot.

2. PrimeFaces

PrimeFaces это один из самых легковесных фреймворков Java. Это простой .jar-файл. Поскольку он доступен уже много лет, PriemFaces служит в качестве фреймворка пользовательского интерфейса для JavaServer Faces и Java EE.

PrimeFaces может похвастать более чем 100 компонентами. Среди его ключевых компонентов можно назвать, например, валидацию на стороне клиента и touch mobile kit.

3. Blade

Blade это легковесный MVC-фреймворк на основе Java 8. Когда мы говорим о легковесности Blade, то имеем в виду размер его исходного кода, который не превышает 500KB.

Это простой фреймворк с роутингом интерфейса в стиле RESTful. Он относится к немногим фреймворкам Java, в которых нет invasive interceptors.

Чтобы использовать Blade, вам нужно создать обычный проект Maven. Blade предоставляет поддержку модульности, которая есть в Java 9. Также он поддерживает довольно много веб-компонентов Java.

4. Dropwizard

Dropwizard это мощный фреймворк Java, оптимизированный для разработки RESTful сервисов. Это также отличный фреймворк для разработки микросервисов Java. С помощью Dropwizard вы легко получите доступ ко всем мощным библиотекам Java.

Фреймворк Dropwizard поставляется со многими библиотеками, в числе которых Google Guava, Jetty server, Hibernate Validator, Logback, Joda Time. Также есть библиотека Jackson для обработки JSON-файлов. JSON даст вам возможность сэкономить время на написании кода для единиц измерения и конфигураций. Вместо этого вы сможете направить все свои силы на функционал приложения. Проще говоря, этот фреймворк поможет вам достигнуть максимального уровня эффективности.

Dropwizard поставляется с документацией, дружественной для начинающих, – с ее помощью вам будет легко начать пользоваться этим фреймворком.

5. Google Web Toolkit (GWT)

Как следует из названия, Google Web Toolkit это фреймворк Java, разработанный Google. Он был создан, чтобы помочь разработчикам, желающим строить веб-приложения на Java. Этот фреймворк позволяет пользователям писать код на Java и запускать его в браузерах как JavaScript.

Читать еще:  Профилируем Unity проект с Android Studio

Поскольку это продукт Google, GWT имеет хорошую поддержку команды опытных программистов. Вы можете использовать его для разработки сложного веб-приложения, даже если у вас нет практического опыта в языках программирования фронтенда, таких как JavaScript.

Этот фреймворк имеет уникальный функционал, например, в нем есть UI abstraction, межбраузерная портируемость, интернационализация и booking.

6. JavaServer Faces

Фреймворк JavaServer Faces (JSF) новым не назовешь. Он существует уже 14 лет. Это MVC-фреймворк, упрощающий задачу создания пользовательского интерфейса для веб-приложения. Для этого фреймворк имеет особый функционал. Самое замечательное, что UI-компоненты, созданные с помощью этого фреймворка, могут использоваться повторно для других веб-страниц.

Для шаблонов JavaServer Faces использует Facelets.

7. JHipster

Jhipster принадлежит к числу последних фреймворков Java. Он был выпущен в 2013 году. Jhipster объединяет Spring Boot, Angular и React в один большой фреймворк. С ним вы можете с легкостью построить современное веб-приложение на языке Java.

Spring Boot, встроенный в этот фреймворк, позволит вам разрабатывать приложения на основе фреймворка Spring. Кроме Angular и React, JHipster также содержит Bootstrap. Этот фреймворк позволяет разработчикам выбирать между двумя видами архитектуры: монолитной и микросервисной. В случае монолитной фронтенд и бэкенд встроены в одно приложение, а в случае микросервисной они разделены.

8. Spark Framework

Фреймворк Spark идеален для программистов, разрабатывающих приложения с использованием языка Java. С его помощью вы можете быстро и легко построить бэкенд для своего сайта. Spark использует возможности Java8 и обладает выразительным API.

9. MyBatis

MyBatis это mapper-фреймворк для программирования на Java. Он упрощает процесс связи вашего Java-приложения с базой данных SQL. Этот фреймворк действует как промежуточное ПО между ними.

Обычно для подсоединения вашего приложения к реляционной базе данных вам понадобится Java Database Connectivity API. MyBatis упрощает процесс. Он дает разработчикам возможность осуществлять основные SQL-операции, используя лишь несколько строк кода.

MyBatis можно сравнить с фреймворком Hibernate. Они оба представляют собой нечто вроде моста между приложением и базой данных. Единственная разница в том что MyBatis не отображает объекты Java в реляционную базу данных.

10. Play Framework

Play это еще один легковесный фреймворк Java, который нравится большинству разработчиков. Он также может использоваться для программирования на Scala.

Этот фреймворк предоставляет интерфейс, в котором разработчики могут реализовывать изменения в коде без необходимости повторного разворачивания или повторной компиляции.

В фреймворке Play есть асинхронные APIs, позволяющие масштабировать приложения без внедрения дополнительных ресурсов. Этот фреймворк предоставляет превосходную поддержку различных паттернов микросервисов.

Заключение

Какой же фреймворк Java выбрать? Однозначного ответа на этот вопрос нет. Все, что нужно, – быть открытым для нового и изучить информацию о разных фреймворках. Сделав это, вы сможете выбрать идеальный вариант для своих нужд.

programming

3 344 пользователя находятся здесь

МОДЕРАТОРЫ

Welcome to Reddit,

the front page of the internet.

and join one of thousands of communities.

отправлено 3 года назад автор alek_sys

Want to add to the discussion?

[–]dpash 5 очков 6 очков 7 очков 3 года назад (0 дочерних комментарев)

[–]geodel 25 очков 26 очков 27 очков 3 года назад (6 дочерних комментарев)

[–]jnordwick 24 очка 25 очков 26 очков 3 года назад (1 дочерний комментарий)

[+]geodel рейтинг комментария ниже порога -6 очка -5 очков -4 очков 3 года назад (0 дочерних комментарев)

[–]rockum 5 очков 6 очков 7 очков 3 года назад (2 дочерних комментария)

[–]geodel -3 очков -2 очков -1 очков 3 года назад (1 дочерний комментарий)

[–]mp911de 1 очко 2 очка 3 очка 3 года назад (0 дочерних комментарев)

[–]joequin 3 очка 4 очка 5 очков 3 года назад (0 дочерних комментарев)

[–]kazagistar 3 очка 4 очка 5 очков 3 года назад (6 дочерних комментарев)

[–]jnordwick 3 очка 4 очка 5 очков 3 года назад (2 дочерних комментария)

[–] [deleted] 2 очка 3 очка 4 очка 3 года назад (1 дочерний комментарий)

[–]Turbots 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]Turbots 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]sfsdfd 2 очка 3 очка 4 очка 3 года назад * (15 дочерних комментарев)

[–]alek_sys [S] 5 очков 6 очков 7 очков 3 года назад (6 дочерних комментарев)

[+]sfsdfd рейтинг комментария ниже порога -7 очка -6 очка -5 очков 3 года назад (5 дочерних комментарев)

[–]frugalmail 4 очка 5 очков 6 очков 3 года назад (4 дочерних комментария)

[–]sfsdfd -1 очков 0 очков 1 очко 3 года назад (3 дочерних комментария)

[–]sfsdfd 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]frugalmail -2 очков -1 очков 0 очков 3 года назад (0 дочерних комментарев)

[+]cantwedronethatguy рейтинг комментария ниже порога -6 очка -5 очков -4 очков 3 года назад (1 дочерний комментарий)

[–]Turbots 0 очков 1 очко 2 очка 3 года назад (4 дочерних комментария)

[–]sfsdfd 0 очков 1 очко 2 очка 3 года назад * (3 дочерних комментария)

[–]Turbots -1 очков 0 очков 1 очко 3 года назад (2 дочерних комментария)

[–]sfsdfd 0 очков 1 очко 2 очка 3 года назад * (1 дочерний комментарий)

[–]Turbots 1 очко 2 очка 3 очка 3 года назад (0 дочерних комментарев)

[–]rockum 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]darkean 5 очков 6 очков 7 очков 3 года назад (0 дочерних комментарев)

[–] [deleted] 4 очка 5 очков 6 очков 3 года назад (0 дочерних комментарев)

[–]Paradox 13 очков 14 очков 15 очков 3 года назад (7 дочерних комментарев)

[–]alek_sys [S] 10 очков 11 очков 12 очков 3 года назад (5 дочерних комментарев)

[–]sdeleuze 2 очка 3 очка 4 очка 3 года назад (1 дочерний комментарий)

[–]segv 0 очков 1 очко 2 очка 3 года назад (2 дочерних комментария)

[–] [deleted] 1 очко 2 очка 3 очка 3 года назад (1 дочерний комментарий)

[–]Turbots 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]virtyx 3 очка 4 очка 5 очков 3 года назад (2 дочерних комментария)

[–]rydan 1 очко 2 очка 3 очка 3 года назад (0 дочерних комментарев)

[–]Turbots -1 очков 0 очков 1 очко 3 года назад (0 дочерних комментарев)

[–]xymor 1 очко 2 очка 3 очка 3 года назад (3 дочерних комментария)

[–]joequin 3 очка 4 очка 5 очков 3 года назад * (0 дочерних комментарев)

[–] [deleted] 1 очко 2 очка 3 очка 3 года назад (0 дочерних комментарев)

[–]kersurk 1 очко 2 очка 3 очка 3 года назад (0 дочерних комментарев)

[–]paul_h 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]prdktr 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]prdktr 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]SimonGray 16 очков 17 очков 18 очков 3 года назад (6 дочерних комментарев)

[–] [deleted] 7 очков 8 очков 9 очков 3 года назад (0 дочерних комментарев)

[–]cenanozen 2 очка 3 очка 4 очка 3 года назад (1 дочерний комментарий)

[–]yogthos 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]alek_sys [S] 6 очков 7 очков 8 очков 3 года назад (0 дочерних комментарев)

[–]Sun_Kami 1 очко 2 очка 3 очка 3 года назад (0 дочерних комментарев)

[–]joequin 0 очков 1 очко 2 очка 3 года назад * (4 дочерних комментария)

[–]eckyp 4 очка 5 очков 6 очков 3 года назад (3 дочерних комментария)

[–]joequin -1 очков 0 очков 1 очко 3 года назад (2 дочерних комментария)

[–] [deleted] 1 очко 2 очка 3 очка 3 года назад (1 дочерний комментарий)

[–]joequin 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]kitd 0 очков 1 очко 2 очка 3 года назад (4 дочерних комментария)

[–]Turbots 0 очков 1 очко 2 очка 3 года назад (3 дочерних комментария)

[–]kitd 0 очков 1 очко 2 очка 3 года назад (2 дочерних комментария)

[–]Turbots 1 очко 2 очка 3 очка 3 года назад (1 дочерний комментарий)

[–]kitd 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]geodel -2 очков -1 очков 0 очков 3 года назад (1 дочерний комментарий)

[–]Turbots 0 очков 1 очко 2 очка 3 года назад (0 дочерних комментарев)

[–]Turbots 1 очко 2 очка 3 очка 3 года назад (0 дочерних комментарев)

[–]rockum 0 очков 1 очко 2 очка 3 года назад (2 дочерних комментария)

[–]Turbots 1 очко 2 очка 3 очка 3 года назад (0 дочерних комментарев)

  • о reddit
  • блог
  • о reddit
  • реклама
  • careers
  • помощь
  • правила сайта
  • Reddit help center
  • реддикет
  • mod guidelines
  • связаться с нами
  • приложенияи инструменты
  • Reddit for iPhone
  • Reddit for Android
  • mobile website

Использование данного сайта означает, что вы принимаете пользовательского соглашения и Политика конфиденциальности. © 2020 reddit инкорпорейтед. Все права защищены.

REDDIT and the ALIEN Logo are registered trademarks of reddit inc.

π Rendered by PID 7317 on r2-app-07e7235fec3203592 at 2020-05-27 01:18:37.321155+00:00 running 567675e country code: CH.

Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector