Текст технической направленности из области разработки и тестирования программного обеспечения
NoFramework — это проект сетевого краулера, который автор разрабатывал в свободное время. Проект получил название Seeker и впоследствии развился в серию No. За время разработки некоторые проекты были переписаны, а архитектура претерпела значительные изменения. Некоторые решения продолжают оптимизироваться, и в процессе оптимизации автор получает понимание деталей нижнего уровня.
Многие люди не понимают, зачем нужен этот проект. Автор объясняет:
он может заменить Tomcat, Spring и MyBatis для разработки веб-сервисов!
Преимущества использования этой платформы:
В основе многих фреймворков Java лежат простые принципы. Из известных автору фреймворков используются:
Поэтому создать фреймворк кажется довольно просто, поскольку необходимые технологии не так уж сложны, и существует множество готовых открытых решений, которые можно использовать напрямую. Однако в процессе реализации возникает много неожиданных трудностей. Если вам интересно, вы можете попробовать самостоятельно реализовать Spring и протестировать его в тестовой среде. Этот процесс, вероятно, поможет вам лучше понять мои предыдущие слова.
Вернёмся к основной теме. В течение почти года автор прошёл путь от базового анализа JSON и XML до создания контейнера сервисов и, наконец, создания базовой структуры веб-сайта. Конечно, некоторые модули всё ещё имеют много недостатков и требуют оптимизации. Автор будет продолжать работу над ними. Возможно, в конечном итоге код потеряет смысл, но автор всё равно будет стремиться улучшить его.
No Framework (NF) — это набор сервисов, предоставляющий комплексное решение для веб-разработки на Java.
Проект | Версия | Функция |
---|---|---|
noframework | 1.1.3 | Зависимость родительского модуля для дочерних модулей |
Проект | Версия | Функция |
---|---|---|
noson | 1.1.3 | Сериализация и десериализация JSON |
nocat | 1.1.3 | Веб-контейнер на основе Java |
noaoc | 1.1.3 | IOC и AOP |
nomvc | 1.1.3 | MVC |
nolog | 1.1.3 | Логирование и инструменты |
seeker | 1.1.3 | Анализ XML |
nodb | 1.1.3 | ORM |
noasm | 1.1.3 | Инструменты ASM |
nomvc-support-for-nocat | 1.1.3 | Поддержка MVC для nocat |
nomvc-support-for-tomcat | 1.1.3 | Поддержка MVC для Tomcat |
noaoc-listener-for-nocat | 1.1.3 | Слушатель загрузки noaoc для nocat |
nf | 1.1.3 | Обеспечивает зависимости других модулей |
Перед изучением использования модулей, если у вас есть интерес, вы можете сначала ознакомиться с их функциями.
Каждый модуль NF играет важную роль, они взаимодействуют друг с другом и вместе выполняют окончательную работу. Ниже приводится краткое введение в их функции.
Noson отвечает за анализ данных JSON в процессах взаимодействия между передней и задней частью. Это инструмент сериализации и десериализации по умолчанию для контейнера MVC. После непрерывной оптимизации производительность Noson стала весьма впечатляющей. Хотя она не сравнима с FastJson, Jackson или Gson, для тех, кто не предъявляет высоких требований к производительности, Noson является хорошим выбором.
Noson обладает высокой отказоустойчивостью. Например, следующий JSON может быть корректно проанализирован Noson:
{value:[{\"key1\":a,'key2':b,key3:1c,key4:'\"d',key5:\"'e\",key6:':,[]{}',key7:,key8:'%$&%$&%^><:'}]}
После анализа он преобразуется в стандартный JSON:
{"value":[{"key1":"a","key2":"b","key3":"1c","key4":"\"d","key5":"\'e","key6":":,[]{}","key7":"key8:\'%$&%$&%^><:\'"}]}
Noson также может обрабатывать сложные типы данных:
json = "{list:[{map:{map:{list:[{map:{value:{\"name\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}},{map:{value:{\"name\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}}]}}},{map:{map:{list:[{map:{value:{\"name\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}},{map:{value:{\"name\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}}]}}}]}";
Map<String, List<Map<String, Map<String, Map<String, List<Map<String, Map<String, Nico>>>>>>>> target = Noson.convert(json, new NoType<Map<String, List<Map<String, Map<String, Map<String, List<Map<String, Map<String, Nico>>>>>>>>>(){});
Noson может решать проблемы циклических вложений:
Cycle c = new Cycle();
System.out.println(Noson.reversal(c));
Map<String, Object> map = new HashMap<String, Object>();
map.put("map", map);
System.out.println(Noson.reversal(map));
List<Object> list = new ArrayList<Object>();
list.add(list);
System.out.println(Noson.reversal(list));
Set<Object> sets = new HashSet<Object>();
sets.add(sets);
System.out.println(Noson.reversal(sets));
map.put("list", list);
System.out.println(Noson.reversal(map));
Вывод:
{"cycle":{}}
{"map":{}}
[[]]
[[]]
{"list":[[]],"map":{"list":[[]]}}
У Noson есть и другие интересные функции, которые вы можете изучить в следующем разделе.
Nocat основан на сокетах Java и предоставляет базовые функции доступа к ресурсам. Он предоставляет три основных модуля:
Его функции можно рассматривать как аналоги фильтров, слушателей и сервлетов Tomcat. Отличие от Tomcat заключается в том, что Nocat можно легко запустить в основном методе:
public static void main(String[] args) {
ServerBootStrap bootStrap = new ServerBootStrap();
bootStrap.start(8080);
}
Приведённый выше код запустит сервис на порту 8080 локально.
Noaoc использует небольшое количество кода для реализации основных функций Spring IOC и AOP. Он поддерживает конфигурацию через xml и аннотации. Ноаос отвечает за управление зависимостями классов во всей семье, а также предоставляет гибкую возможность расширения извне. Это значительно облегчает интеграцию с Номвк.
Ноаос предоставляет слушателя для Нокат:
noaoc-listener-for-nocat.
В конфигурационном файле Нокат добавьте слушатель и настройте параметры:
<listener>
<handler>org.nico.aoc.listener.NoaocListener</handler>
<payload>
{
// Сканируемые файлы конфигурации XML
"xmls":["cat-mysql.xml","cat-redis.xml"],
// Пакеты аннотаций для сканирования
"packs":["org.nico.ct"],
// Саморасширяющиеся компоненты
"compents":["org.nico.cat.mvc.compent.MVCCompent"]
}
</payload>
</listener>
Номвк основан на контроллере маршрутизации и использует Noson для помощи в разборе входящих и исходящих данных. Он также включает модуль Verify для проверки входных параметров метода.
Номвк предоставляет два модуля расширения:
Для интеграции с Нокат необходимо добавить слушателя и путь перехвата API в конфигурационный файл:
<listener>
<handler>org.nico.cat.mvc.listener.ListenerForNocat</handler>
<payload>
// Пакет аннотаций MVC
{"scanpack":"org.nico.ct.controller"}
</payload>
</listener>
<api>
<uri>/v1/**</uri>
<handler>org.nico.cat.mvc.router.RouterForNocat</handler>
</api>
Нолог использует несколько простых файлов для реализации лёгкого инструмента ведения журнала. Кроме того, он включает в себя некоторые часто используемые инструменты.
Сам по себе Нолог не имеет никаких зависимостей, но для поддержки переключения на Log4J добавлена зависимость от SLF Log4j.
Имя входного файла Нолога — logno.properties. Далее будет представлено краткое введение в параметры конфигурации и использование Нолога.
Первоначально Сикер был ориентирован на веб-сканирование, анализируя HTML-текст и предоставляя интерфейс поиска для получения целевых данных. Позже было обнаружено, что Сикер также может использоваться для анализа XML.
Сикер отвечает за анализ гипертекста в семье NF, включая конфигурацию Нокат и Ноаос.
Подобно Hibernate, но гораздо более лёгкий ORM-фреймворк, который в настоящее время поддерживает только MySQL. По производительности близок к JDBC и предоставляет удобные интерфейсы для запросов с условиями и разбиения на страницы.
Можно использовать Ноаос для прямой интеграции:
<book id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<param key="jdbcUrl"
value="jdbc:mysql://localhost:3306/xx?useUnicode=true&characterEncoding=utf8&useSSL=false" />
<param key="user" value="xx" />
<param key="password" value="xx" />
<param key="driverClass" value="com.mysql.jdbc.Driver" />
<param key="maxPoolSize" value="100" />
<param key="minPoolSize" value="10" />
</book>
<book id="MysqlSession" class="org.nico.db.session.branch.MysqlSession">
<param key="autoCommit" value="false" />
<label name="dataSource" ref="DataSource" />
</book>
<book id="MysqlDBHelper" class="org.nico.db.helper.impl.MysqlDBHelper">
<param key="printLog" value="false" />
<label name="session" ref="MysqlSession" />
</book>
<book id="TransationManager" class="org.nico.db.datasource.TransationManager">
<label name="dataSource" ref="DataSource" />
</book>
Зависит от исходного кода ASM и в настоящее время предоставляет следующие методы:
Если вы не хотите писать так много зависимостей модулей NF в pom.xml, просто импортируйте модуль NF напрямую. Кроме того, некоторые модули зависят от других модулей. Конкретные зависимости можно найти по ссылке:
Используйте Git для клонирования проекта на локальный компьютер. Затем используйте вашу IDE, чтобы добавить модули в среду проекта, или вы можете вручную упаковать проект в jar-файл и затем импортировать его!
NF предоставляет простой проект CoffeeTime (https://gitee.com/ainilili/CoffeeTime), который демонстрирует процесс разработки с использованием NF. Проект можно клонировать на локальный компьютер с помощью Git, а затем импортировать в вашу IDE как Maven Project.
Запуск CoffeeTime: org.nico.ct.CtApplication
TP: Для удобства запуска, все ссылки на базы данных используют внешний IP-адрес сервера автора. Автор просит не делать ничего плохого, так как сервер не имеет большой ценности, но это всё равно может вызвать некоторые неудобства для автора.
Давайте рассмотрим использование NF-фреймворка на примере CoffeeTime.
Структура проекта:
Создайте новый Maven-проект и добавьте зависимости NF и другие часто используемые jar-файлы в файл pom.xml:
<dependencies>
<dependency>
<groupId>com.gitee.ainilili</groupId>
<artifactId>nf</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
</dependencies>
Сначала создаём файл конфигурации cat.xml для Nocat:
<?xml version="1.0" encoding="UTF-8"?>
<app>
<cat:welcomes>
<welcome>index.html</welcome>
<welcome>index.jsp</welcome>
<welcome>index.asp</welcome>
<welcome>index.php</welcome>
</cat:welcomes>
<cat:configs>
<!-- 定义访问资源的路径, / 代表项目工作路径 -->
<property field="server_resource_path" value="/web" />
<property field="server_port" value="8080" />
<property field="server_charset" value="utf-8" />
<property field="server_revice_buffer_size" value="104857600" />
<property field="server_so_timeout" value="0" />
</cat:configs>
<cat:listeners>
<listener>
<handler>org.nico.aoc.listener.NoaocListener</handler>
<payload>
{
"xmls":[
"cat-mysql.xml",
"cat-redis.xml"
],
"packs":[
"org.nico.ct"
],
"compents":[
"org.nico.cat.mvc.compent.MVCCompent"
]
}
</payload>
</listener>
<listener>
<handler>org.nico.cat.mvc.listener.ListenerForNocat</handler>
<payload>
{"scanpack":"org.nico.ct.controller"}
</payload>
</listener>
</cat:listeners>
<cat:filters>
<filter>
<uri>/v1/authc/**</uri>
<handler>org.nico.ct.section.AuthFilter</handler>
</filter>
</cat:filters>
<cat:apis>
<api>
<uri>/v1/**</uri>
<handler>org.nico.cat.mvc.router.RouterForNocat</handler>
</api>
</cat:apis>
</app>
Конфигурируем интеграцию Noaoc с MySQL и Redis в файле cat-mysql.xml:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<param key="jdbcUrl"
value="jdbc:mysql://localhost:3306/ct?useUnicode=true&characterEncoding=utf8&useSSL=false" />
<param key="user" value="root" />
<param key="password" value="root" />
<param key="driverClass" value="com.mysql.jdbc.Driver" />
<param key="maxPoolSize" value="100" />
<param key="minPoolSize" value="10" />
<!-- <param key="maxIdleTime" value="0" /> -->
</book>
<book id="MysqlSession" class="org.nico.db.session.branch.MysqlSession">
<param key="autoCommit" value="false" />
<label name="dataSource" ref="DataSource" />
</book>
<book id="MysqlDBHelper"
``` Данный текст написан на языке Java.
Ниже представлен перевод текста на русский язык:
around(ProcessingAspectPoint point) throws Throwable { Object result = point.process(); return result; }
@Override @After(value = "expression(org.nico.ct.service.impl..(..))") public void after(AspectPoint point) { try { tm.commitTransaction(); tm.relaseConnection(); } catch (SQLException e) { } }
@Override @Wrong(value = "expression(org.nico.ct.service.impl..(..))") public void wrong(ProcessingAspectPoint point, Throwable e) throws Throwable{ tm.rollbackTransaction(); throw e; }
**В запросе отсутствует информация о том, что делать с кодом и специальными символами.**
* * *
> **Входная проверка**

#### 3.3.8. Запуск сервиса


#### 3.3.9. Размещение передней страницы

#### 3.3.10. Доступ




Поддержка потокового видео в прямом эфире

## Четыре. Продолжайте стараться
### 4.1. Обнаружение ошибок
Если вы обнаружите ошибку в проекте или нелогичное место в дизайне, я очень надеюсь, что вы сможете создать для меня ``Issues``, чтобы сделать NF-фреймворк всё более совершенным.
### 4.2. План на будущее
- Использовать NF для завершения CoffeeTime
- Использовать NF для завершения CoffeeBlog
- Доработать модуль загрузки Noaoc
- Добавить RPC-модуль
- Увеличить Noaoc с помощью таймера
- Оптимизировать Nodb
- Определить дальнейшие шаги позже
### 4.3. Свяжитесь со мной
Email — ```ainililia@163.com```
QQ — ```473048656```
Группа общения — ```177563526```
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )