1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/edwinyxc-pond

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_zh_CN.md 6.7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 01.12.2024 07:28 51c44aa

Pond — гибкий и быстрый веб-фреймворк для разработки (на основе Java 8)

  • Pond-common предоставляет некоторые функции функционального программирования и несколько полезных инструментов класса:
    • Функции программирования — учитывая, что Java имеет много недостатков, не планируется строгое следование принципам и концепциям FP, достаточно частичного включения.
    • Обработка строк.
    • Работа с путями.
    • Часто используемые структуры данных, такие как Matrix и Tree.
    • Инновационный режим отладки — управление Logger на более высоком уровне абстракции, без привязки к конкретной реализации.
    • Интеграция Apache HttpClient с простой обёрткой.

Пример кода:

// Отладка
S._debug(logger, log -> {
  Thread.sleep(3000); // выполнение тяжёлой задачи
  log.debug("xxxxx");
});

// PATH
assertEquals(PATH.classpathRoot(), S.class.getResource("/").getPath());

// Создание массива S.array
Array<String> arr = S.array("This", "is", "A", "GOOD", "Day");
assertArrayEquals(arr.map(str -> str.toUpperCase()).join(),
                  S.array("THIS", "IS", "A", "GOOD", "DAY").join());

// Функция Array#reduce — свёртка
Array<Integer> arr = S.array(1, 23, 4, 5, 6, 7, 8, 9);
assertEquals((long) arr.reduce((acc, cur) -> acc + cur), (1 + 23 + 4 + 5 + 6 + 7 + 8 + 9));

// Функция Array#filter — фильтр
Array<Integer> arr = S.array(1, 23, 4, 5, 6, 7, 8, 9);
assertArrayEquals(new int[]{23}, (int[]) Convert.toPrimitiveArray(arr.filter(x -> x > 20).join()));


**Pond-web — инструменты для быстрой разработки веб-приложений:**

 * API, вдохновлённый express.js.
 * Высокая степень настройки — почти везде можно использовать аспектно-ориентированное программирование.
 * По умолчанию используется Netty в качестве BaseServer — его параллельная производительность достаточно хороша.
 * Простой статический файловый сервер — не рекомендуется использовать в рабочей среде.
 * Простые фильтры.

**Примеры кода:**

// Базовые настройки и конфигурация Pond.init(p -> p.loadConfig(new Properties()), p -> p.get("/123", (req, res) -> res.send("123")) .get("/234", (req, res) -> res.send("234")), p -> p.get("/.*", p._static("www")) ).listen();

// Статические файлы Pond.init(p -> { p.get("/static/.*", p._static("www")); }).listen(9090);

// Загрузка файлов System.setProperty(BaseServer.PORT, "9090"); Pond.init(p -> { p.post("/multipart", (req, resp) -> { Request.UploadFile f = req.file("content"); resp.render(json("

" + dump(req) + "

" + dump(f) + "
")); resp.send(200, "OK"); }).get("/.*", p._static("www")); }).listen();

// Включение отладки S._debug_on(Pond.class, BaseServer.class); System.setProperty(BaseServer.PORT, "9090"); Pond.init(p -> { p.post("/utf8test", (req, resp) -> { S.echo(S.dump(req.params())); resp.render(Render.dump(req.params())); }).get("/.*", p._static("www")); }).listen();

// Сессии Mid session = Session.install(); app.cleanAndBind(p -> {

p.get("/require", session, Mid.wrap((req, resp) -> resp.send(200, "pass")).require(session) );

p.get("/requireFail", Mid.wrap((req, resp) -> resp.send(200, "pass")).require(session) );

});

TestUtil.assertContentEqualsForGet("pass", "http://localhost:9090/require"); HTTP.get("http://localhost:9090/requireFail", http -> { assertNotSame(200, http.getStatusLine().getStatusCode()); });

Pond-db — обработка базы данных (по умолчанию MySQL):

  • Встроенный упрощённый пул соединений.
  • Не навязывается модель, только абстракция таблиц и записей — можно быстро настроить собственную модель.
  • Собственный класс Sql для быстрого создания SQL.
  • Параллельная производительность и настраиваемый механизм кэширования.

Пример кода:

// Определение модели
public class BonusService extends Model{
  {
    db(App.getInstance().getDb());
    table("t_bonus_service");
    id("id");
    field("name");
    field("price");

  }
 //...

// Получение данных на основе модели
List<Model> m = db.get(t -> t.query(Model.class, "select * from t_model"));

// Тест параллелизма
Holder.AccumulatorInt val = new Holder.AccumulatorInt(0);
ExecutorService executorService = Executors.newFixedThreadPool(20);
List<CompletableFuture> futures = new ArrayList<>();

long s = S.now();
S._repeat(() -> {
  futures.add(CompletableFuture.runAsync(
      () -> {
        db.post(tmpl -> {
          tmpl.exec("USE POND_DB_TEST;");
          for (int i = 0; i < 400; i++)
            tmpl.exec("INSERT INTO test values(?,?)",
                String.valueOf(Math.random()), String.valueOf(val.accum()));
        });

      }, executorService));
}, 1000);

try {
``` ```
CompletableFuture.allOf(S._for(futures).join()).thenRun(() -> {
    long beforeSelect = S.now();
    S._for((List<Record>) db.get(t -> {
      t.exec("USE POND_DB_TEST;");
      return t.query("SELECT * FROM test");
    }));
    S.echo("Query time:" + (S.now() - beforeSelect));
    S.echo("ALL FINISHED : time usage " + (S.now() - s));
  }).get();
} catch (InterruptedException e) {
  e.printStackTrace();
} catch (ExecutionException e) {
  e.printStackTrace();
}

Подробности смотрите в тестовом коде и комментариях внутри проекта.

«Наткнулись на проблему? => Свяжитесь с edwinyxc@outlook.com, QQ и WEIXIN: 326436387.

Приглашаем всех присоединиться к обсуждению и поделиться идеями по улучшению! QQ группа: 206693019».

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/edwinyxc-pond.git
git@api.gitlife.ru:oschina-mirror/edwinyxc-pond.git
oschina-mirror
edwinyxc-pond
edwinyxc-pond
master