KuaFu MVC 开发框架
KuaFu — это Java Web MVC-фреймворк для быстрой разработки.
<dependency>
<groupId>tech.yixiyun.framework</groupId>
<artifactId>kuafu-mvc</artifactId>
<version>0.0.7</version>
<type>jar</type>
</dependency>
<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>
public class Main {
public static void main(String[] args) {
TomcatStarter.start();
}
}
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 на веб-странице.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Demo</title>
</head>
<body>
Hello Kuafu
</body>
</html>
public View hello() {
return jsp("hello");
}
Снова перезапустите приложение и перейдите по адресу localhost:80/demo/hello, чтобы открыть страницу.
Правила генерации URL-адресов для маршрутизации:
@Route("/")
public View hello() {
return jsp("hello");
}
Теперь при переходе по адресу localhost:80/ будет открываться страница hello.
@Controller("abc")
public class DemoController extends BaseController {
...
}
При переходе по адресу localhost:80/abc/add будут отображаться данные в формате JSON.
/**
* Пример сервиса
* @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 здесь я просто не буду писать, вы обязательно должны написать
<%@ 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>
public class DemoController extends BaseController {
private DemoService demoService;
public View add(User user) {
demoService.add();
return json(user);
}
public View hello() {
return jsp("hello");
}
}
Теперь можно попробовать посетить /demo/hello, чтобы открыть страницу формы, ввести некоторую информацию и нажать «Отправить», чтобы увидеть эффект. В норме вы должны увидеть строку JSON с данными, которые вы отправили. Если это не работает, проверьте, настроен ли плагин компиляции в pom.xml с параметром -parameters.
Фреймворк автоматически анализирует параметры запроса, сопоставляя имена параметров запроса и имена методов. Кроме того, фреймворк также автоматически определяет способ преобразования параметров в зависимости от Content-Type запроса, поэтому даже если вы используете библиотеки, такие как axios, для отправки запросов в формате application-json, фреймворк может нормально анализировать параметры без каких-либо аннотаций.
Далее мы попытаемся сохранить данные в базе данных. Сначала мы зарегистрируем источник данных. Фреймворк предоставляет поддержку источника данных Druid от Alibaba, поэтому здесь мы рассмотрим регистрацию источника данных Druid:
Добавьте зависимости 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>
{
"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"
}
}
}
public class DataSourceProvider implements IDataSourceProvider {
@Override
public DataSourceDefinition[] get() {
DataSourceDefinition[] definitions = {new DruidDataSourceDefinition("app.datasource")};
return definitions;
}
}
/**
* Создание или обновление структуры таблицы на основе класса Domain
* @return
*/
public View generateTable() {
DbKit.createOrAlterAllSingleTable();
return jsonSuccess();
}
Затем мы перезапускаем систему и посещаем её через браузер. /demo/generateTable, если возвращается {state:"SUCCESS"}, это означает успешное выполнение. После этого, открыв базу данных, мы должны увидеть успешно созданную таблицу.
Далее попробуем добавить данные в базу данных. Вернёмся к методу 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 )