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

OSCHINA-MIRROR/yixiyun-tech-kuafu

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

KuaFu MVC 开发框架

Введение

KuaFu — это Java Web MVC-фреймворк для быстрой разработки.

Требования к фреймворку

  • JDK11 (рекомендуется использовать AdoptOpenJDK).
  • База данных MySQL (на данный момент компонент SQL не поддерживает другие базы данных, но планируется дальнейшее развитие).

Инструкция по установке

  1. Создайте новый проект Maven.
  2. В файле pom.xml добавьте зависимость от jar-пакета фреймворка KuaFu-MVC:
<dependency>
    <groupId>tech.yixiyun.framework</groupId>
    <artifactId>kuafu-mvc</artifactId>
    <version>0.0.7</version>
    <type>jar</type>
</dependency>
  1. В pom.xml также необходимо настроить build:
<build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>

            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>Ваш jdk версии, не ниже 11</source>
                    <target>Ваш jdk версии, не ниже 11</target>
                    <encoding>UTF-8</encoding>
                    <compilerArgument>-parameters</compilerArgument>
                </configuration>
            </plugin>

        </plugins>
    </build>
  1. Создайте класс Main и напишите метод main для запуска проекта:
public class Main {
    public static void main(String[] args) {
        TomcatStarter.start();
    }
}

Быстрый старт

  1. Создайте класс Controller:
import tech.yixiyun.framework.kuafu.controller.BaseController;
import tech.yixiyun.framework.kuafu.view.View;

/**
 * Демонстрационный пример
 * @author Yixiyun
 * @version 1.0
 * @date 2021-05-16 15:00
 */
public class DemoController extends BaseController {


    public View add(){
        return json("name", "zhangsan", "age", 14);
    }

}

Перезапустите приложение и перейдите по адресу localhost:80/demo/add, чтобы увидеть данные в формате JSON на веб-странице.

  1. Создайте файл hello.jsp в папке webapp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Demo</title>
</head>
<body>
 Hello Kuafu
</body>
</html>
  1. Добавьте новый метод в класс DemoController:
 public View hello() {
      return jsp("hello");
  }

Снова перезапустите приложение и перейдите по адресу localhost:80/demo/hello, чтобы открыть страницу.

  1. Фреймворк автоматически распознаёт компоненты Controller на основе наличия аннотации @Controller на классе или его родительском классе. После распознавания он анализирует методы класса. Если метод является публичным и возвращает тип View, то фреймворк автоматически генерирует маршрутизацию.

Правила генерации URL-адресов для маршрутизации:

  • Если метод имеет аннотацию @Route, то используется значение аннотации в качестве URL.
  • В противном случае используется шаблон «/базовый путь / имя метода». Базовый путь определяется аннотацией @Controller, а по умолчанию используется первый символ имени класса без слова «Controller». Например, для класса DemoController базовый путь будет «demo», а URL для метода add — «/demo/add».
  1. Добавьте аннотацию @Route("/") к методу hello:
@Route("/")
public View hello() {
    return jsp("hello");
}

Теперь при переходе по адресу localhost:80/ будет открываться страница hello.

  1. Добавьте аннотацию @Controller("abc") к классу DemoController:
@Controller("abc")
public class DemoController extends BaseController {
   ...
}

При переходе по адресу localhost:80/abc/add будут отображаться данные в формате JSON.

  1. Класс BaseController предоставляет множество удобных методов, таких как:
  • json(key,value, key,value...) — создание ответа JSON на основе переданных пар ключ-значение.
  • json(data) — создание ответа JSON из переданного объекта.
  • jsonSuccess(data) — создание ответа {state: SUCCESS, data: data}.
  • jsonFail(msg) — создание ответа {state: ERROR, msg: msg}.
  • jsp(path) — переход на страницу JSP с использованием относительного пути в папке webapp.
  • dispatch(path) — перенаправление на другой адрес.
  • redirect(path) — переадресация на другой адрес.
  • text(content) — возврат текстового ответа.
  • ftl(path) — переход на страницу Freemarker.
  • setAttr(key,value) — привязка данных к запросу.
  • image(byte[]) — возврат изображения.
  • download(filename, byte[]) — загрузка файла.
  • getRequest() — получение объекта запроса.
  • getResponse() — получение объекта ответа.
  • getSession() — получение сеанса.
  1. Напишите класс Service для бизнес-логики:
/**
 * Пример сервиса
 * @author Yixiyun
 * @version
``` **hotdeploy**: false,  
// *Флаг, указывающий на то, будет ли активирован режим горячей замены (Hot Deployment) для приложения.*  

*//*  
**//** *Используется для мониторинга серверов и приложений в режиме реального времени.*  
*monitor:* {  
    *enable:* true  
},  
// *Запрос-ориентированные настройки.*  

*request:* {  
    // *Поддержка CORS.*  
    *cors:* true,  
    // *Ресурсы, которые могут быть запрошены.*  
    *resources:* {  
        // *Только запросы, соответствующие этим правилам, будут обрабатываться фреймворком. В противном случае они будут обработаны сервлетом. Синтаксис аналогичен синтаксису url-pattern фильтра.*  
        *include:* [«/*»],  
        // *На основе include, запросы, соответствующие следующим правилам, будут пропущены через фильтр и обработаны напрямую. Синтаксис аналогичен синтаксису url-pattern фильтра.*  
        *exclude:* [«*.ico»]  
    },  
    *session:* {  
        *manager:* «tech.yixiyun.framework.kuafu.controller.session.ServletSessionManager» // *Класс, используемый для получения экземпляров Session. Должен реализовывать интерфейс ISessionManager.*  
    },  
    *upload:* {  
        *singleMaxSize:* 51200, // *Максимальный размер одного файла для загрузки, в килобайтах. По умолчанию — 50 мегабайт.*  
        *totalMaxSize:* 51200, // *Максимально допустимый размер запроса при загрузке, в килобайтах. По умолчанию — 50 мегабайт.*  
        *savePath:* «/upload/{date:yyyyMMdd}/{uuid}.{suffix}», // *Путь по умолчанию для сохранения загруженных файлов, относительно webroot.*  
        *notAllowSuffix:* [ // *Типы файлов, запрещённые к загрузке.*  
            // *Типы файлов, запрещённые к загрузке.*  
            «.exe»,  
            «.bat»,  
            «.sh»,  
            «.dll»,  
            «.jsp»,  
            «.php»,  
            «.jar»,  
            «.class»,  
            «.js»,  
            «.asp»,  
            «.jspx»,  
            «.html»,  
            «.htm»,  
            «.shtml»,  
            «.ftl»,  
            «.py»  
        ]  
    }  
},  
// *Настройки шаблонов.*  

*template:* {  
    *freemarker:* { // *Шаблоны Freemarker.*  
        *config:* { // *Параметры конфигурации. См. документацию: https://freemarker.apache.org/docs/api/freemarker/template/Configuration.html#setSetting-java.lang.String-java.lang.String-.*  
            *ContentType:* «text/html; charset=UTF-8»,  
            *TemplatePath:* «[/, classpath:templates/]»,  
            *locale:* «zh_CN»,  
            *template_exception_handler:* «rethrow»,  
            *date_format:* «yyyy-MM-dd»,  
            *time_format:* «HH:mm»,  
            *datetime_format:* «yyyy-MM-dd HH:mm»,  
            *template_update_delay:* «2000»,// *В миллисекундах. По умолчанию 5000. Рекомендуется установить значение ниже в среде разработки и выше в рабочей среде.*  
            *default_encoding:* «UTF-8»,  
            *number_format:* «0.###»,  
            *incompatible_improvements:* «2.3.30»  
    
        }  
    }  
},  
// *Ответные настройки.*  

*response:* {},  
// *Настройки базы данных.*  

*db:* {  
    // *Транзакции.*  
    *transaction:* {  
        // *Префиксы методов, автоматически запускающих транзакции.*  
        *autoOpenPrefix:* [«add», «modify», «del», «update», «do», «save», «create», «alter», «insert»],  
        // *Уровень изоляции транзакций по умолчанию. См. TransactionLevel.*  
        *defaultLevel:* «REPEATABLE_READ»,  
        // *Предупреждение о тайм-ауте транзакции. Если время выполнения транзакции превышает указанное значение в миллисекундах, выводится предупреждение.*  
        *timeoutWarning:* 1000  
    }  
},  
// *Настройки логгера.*  

*logger:* {  
    *default:* «kuafuLogger», // *По умолчанию используется этот регистратор.*  
    *configuration:* { // *Конфигурация. См. log4j.*  
        *status:* «error»,  
        *name:* «kuafu»,  
        *appenders:* {  
            *appender:* [  
                {  
                    *type:* «Console»,  
                    *name:* «console», **Конфигурация логирования**

PatternLayout: {
    pattern: "%-d{MM-dd HH:mm:ss} [%p]-[%C{1}.%M()]: %m %n"
},
{ //开发环境用的打印,可以显示颜色
    type: "Console",
    name: "dev_console",
    PatternLayout: {
        pattern: "%-d{MM-dd HH:mm:ss} [%highlight{%-5level}{INFO=Magenta, TRACE=White, DEBUG=Blue}]-[%highlight{%C{1}.%M()}{INFO=Magenta, TRACE=White, DEBUG=Blue}]: %highlight{%m%n}{INFO=Magena, TRACE=White, DEBUG=Blue}"
    }
},
{
    type: "RollingFile",
    name: "file",
    fileName: "logs/run.log", //日志文件保存路径
    filePattern: "logs/%d{MM-dd}_%i.log.gz", //分割后的命名规则
    PatternLayout: {
        pattern: "%-d{MM-dd HH:mm:ss} [%p]-[%C{1}.%M()]: %m %n"
    },
    Policies: {
        CronTriggeringPolicy: {
            schedule: "0 0 0 * * ? *", //日志每天零点分割一次
            evaluateOnStartup: true
        },
        SizeBasedTriggeringPolicy: { size: "60M" } //单个日志文件超过60M也分割一次
    },
    DefaultRolloverStrategy: {
        max: 10 //所有的日志文件最多保留10个
    }
}
]
},
loggers: {
    logger: [{
        name: "kuafuLogger",
        level: "info",
        additivity: "false",
        AppenderRef: [ //默认会向这两个地方写入,上线后,可以不向console写入
            {
                ref: "console"
            },
            {
                ref: "file"
            }
        ]
    }],
    root: {
        level: "info",
        AppenderRef: {
            ref: "console"
        }
    }
}
}.

**Комментарии к коду**

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

Также в коде определены два логгера: «kuafuLogger» и корневой логгер. Для каждого из них заданы уровень логирования (info), аддитивность (false) и ссылки на аппендеры (console и file). **Текст запроса:**

    private String favors[];
        //性别,true代表男,false代表女
        private Boolean gender;
        //出生年月日
        private java.sql.Date birthday;
        //记录的创建时间
        private Date createTime;

        //getter setter 这里我就不写了,你一定要写上

**Перевод:**

    Частная строка favors [];
        // Пол, true представляет мужчину, false представляет женщину
        частный логический пол;
        // Дата рождения
        частная дата рождения java.sql;
        // Время создания записи
        частное время создания даты;

        // getter setter здесь я просто не буду писать, вы обязательно должны написать
  1. После создания мы посмотрим, как контроллер автоматически анализирует и преобразует параметры запроса. Вернёмся к hello.jsp и создадим форму.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Demo</title>
    <style>
        form {
            display: flex;
            flex-direction: column;
        }
    </style>
</head>
<body>
<form action="/demo/add" method="post">
    <label >
        Имя:
        <input type="text" name="user.name" />
    </label>
    <label >
        Увлечения:
        <input type="checkbox" name="user.favors" value="плавание">плавание
        <input type="checkbox" name="user.favors" value="фитнес">фитнес
        <input type="checkbox" name="user.favors" value="программирование">программирование
    </label>
    <label >
        Пол:
        <input type="radio" name="user.gender" value="1">мужской
        <input type="radio" name="user.gender" value="0">женский
    </label>
    <label >
        Дата рождения:
        <input type="date" name="user.birthday" />
    </label>
    <label >
        Время создания:
        <input type="datetime-local" name="user.createTime" />
    </label>
    <button type="submit">Отправить</button>
</form>
</body>
</html>
  1. Можно видеть, что эта форма будет отправлена на адрес demo/add, поэтому вернёмся к методу add в DemoController и внесём изменения, чтобы вернуть полученный объект user браузеру.
public class DemoController extends BaseController {

    private DemoService demoService;

    public View add(User user) {
        demoService.add();
        return json(user);
    }

    public View hello() {
        return jsp("hello");
    }
}
  1. Теперь можно попробовать посетить /demo/hello, чтобы открыть страницу формы, ввести некоторую информацию и нажать «Отправить», чтобы увидеть эффект. В норме вы должны увидеть строку JSON с данными, которые вы отправили. Если это не работает, проверьте, настроен ли плагин компиляции в pom.xml с параметром -parameters.

  2. Фреймворк автоматически анализирует параметры запроса, сопоставляя имена параметров запроса и имена методов. Кроме того, фреймворк также автоматически определяет способ преобразования параметров в зависимости от Content-Type запроса, поэтому даже если вы используете библиотеки, такие как axios, для отправки запросов в формате application-json, фреймворк может нормально анализировать параметры без каких-либо аннотаций.

  3. Далее мы попытаемся сохранить данные в базе данных. Сначала мы зарегистрируем источник данных. Фреймворк предоставляет поддержку источника данных Druid от Alibaba, поэтому здесь мы рассмотрим регистрацию источника данных Druid:

  4. Добавьте зависимости druid и mysql в maven:

<dependency> <!-- 数据库连接池 -->
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>${druid.version}</version>
</dependency>
<dependency><!-- mysql-connector-java -->
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
  1. Добавьте конфигурацию источника данных в файл конфигурации app-config-dev.json:
{
    "app": {
        "datasource": { //данные конфигурации источника, обратите внимание, что все значения являются строками и не могут быть других типов, конкретные параметры конфигурации см. https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8
            "name": "main", //имя источника данных
            "url": "jdbc:mysql://адрес вашей базы данных?useSSL=false&autoReconnect=true&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai",
            "username": "имя пользователя базы данных",
            "password": "пароль базы данных",
            "keepAlive": "true"
        }
    }
}
  1. Напишите класс реализации IDataSourceProvider:
public class DataSourceProvider implements IDataSourceProvider {
    @Override
    public DataSourceDefinition[] get() {
        DataSourceDefinition[] definitions = {new DruidDataSourceDefinition("app.datasource")};
        return definitions;
    }
}
  1. После выполнения этих шагов источник данных будет зарегистрирован. Затем мы создадим или обновим структуру таблицы в соответствии с классом Domain, открыв класс DemoController и написав метод:
/**
 * Создание или обновление структуры таблицы на основе класса Domain
 * @return
 */
public View generateTable() {
    DbKit.createOrAlterAllSingleTable();
    return jsonSuccess();
}

Затем мы перезапускаем систему и посещаем её через браузер. /demo/generateTable, если возвращается {state:"SUCCESS"}, это означает успешное выполнение. После этого, открыв базу данных, мы должны увидеть успешно созданную таблицу.

  1. Далее попробуем добавить данные в базу данных. Вернёмся к методу add в DemoService и немного его изменим:

    public void add(User user) {
        LOGGER.info("выполнил метод add");
        insertOne(user);
    }

Затем изменим метод add в DemoController:

```java
public View add(User user) {
    demoService.add(user);
    return json(user);
}
```

После этого попробуем обратиться к /demo/hello. На странице введём некоторые данные и нажмём кнопку отправки для проверки результата.

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

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

1
https://api.gitlife.ru/oschina-mirror/yixiyun-tech-kuafu.git
git@api.gitlife.ru:oschina-mirror/yixiyun-tech-kuafu.git
oschina-mirror
yixiyun-tech-kuafu
yixiyun-tech-kuafu
master