# my-mvc
**Repository Path**: mySpaceHome_tonly_pam/my-mvc
## Basic Information
- **Project Name**: my-mvc
- **Description**: 😊一个极其简单的MVC框架
- **Primary Language**: Java
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 1
- **Created**: 2023-10-07
- **Last Updated**: 2023-11-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Web, MVC, Java
## README
# MY-MVC
这是一个极简的mvc框架,可以帮助你急速开发一个webapp。
**使用的web容器:Jetty**
**开发方式:Router**
## 一、快速上手
### 1.引入依赖
```xml
com.uhu
my-mvc
1.0.0-for-javax
```
### 2.样例
```java
package com.uhu.mvc;
import cn.hutool.http.ContentType;
import com.uhu.mvc.router.PathRouter;
import com.uhu.mvc.router.impl.AbstractPathRouter;
import com.uhu.mvc.server.JettyWebServer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author Bomber
* @Description 主方法
* @Date 2023/10/7 21:29
* @Version 1.0
*/
public class Main {
public static void main(String[] args) throws Exception {
// 创建路由
PathRouter router = new AbstractPathRouter()
// 添加路径映射处理
.addGet("/hello/{name}/{age}", metadata -> {
// 设置响应类型,之后return的结果会转为json后响应
metadata.setRespContentType(ContentType.JSON);
// 返回结果
return new Student(metadata.getPathVariable("name"),
metadata.getPathVariable("age", Integer.class));
});
// 创建服务并启动
new JettyWebServer(router).setHost("localhost").setPort(8080).run();
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Student {
String name;
Integer age;
}
```
启动即可
## 二、关于PathRouter
进行请求的处理分发功能
- 添加GET请求处理`PathRouter addGet(String path, PathHandler handler)`
- 添加POST请求处理`PathRouter addPost(String path, PathHandler handler)`
- 添加PUT请求处理`PathRouter addPut(String path, PathHandler handler)`
- 添加DELETE请求处理`PathRouter addDelete(String path, PathHandler handler)`
- 添加全局异常处理` AbstractPathRouter addExceptionAdvice(ExceptionHandler handler, Class causeClass)`
- 设置全局响应类型`PathRouter setGlobalRespContentType(ContentType contentType)`
- 设置全局跨域`PathRouter setCors(String allowOrigin, List allowMethods, List allowHeaders);`
样例:
```java
// 设置全局跨域
router.setCors("*", List.of("*"), List.of("*"))
```
### 关于拦截器的操作
在这个框架中,建议使用PathInterceptor而非使用Servlet中的Filter,因为Interceptor的设置颗粒度可以更好的把控,同时支持`/*`和`**`的通配符
`InterceptorSetter addInterceptor(List paths, PathInterceptor interceptor)`
添加完毕拦截器后会响应一个拦截器设置类型,需要设置拦截的结果返回
```java
PathRouter router = new AbstractPathRouter()
// 添加一个拦截器
.addInterceptor(List.of("/hello/**"), interceptor)
.setInterceptResp(metadata -> "拦截成功");
```
### 关于JSON返回值转换的设置
在PathRouter接口中,存在` PathRouter addJsonMessageConvert(Class rowType, Function converter);`方法,供开发者自定义JSON的返回值类型转换
场景:经常返回的对象中有Long类型的属性,传递回前端的时候会出现尾精度丢失问题,就需要配置一个Long ==> String的JSON转换器
代码:
```java
// 添加json转换设置 (Long --> String)
pathRouter.addJsonMessageConvert(Long.class, (value) -> {
return String.valueOf(value);
})
```
## 三、关于RequestMetadata
存储处理web请求的大部分功能
- 获取request
- 获取response
- 获取请求param
- 获取session
- 获取pathVariable
- 获取header
- 设置响应类型`setRespContentType`
## 四、关于ORM框架
自带了`MybatisPlus`的工具对象,如下即可获取DAO(MAPPER)和SERVICE对象,依然支持xml方式获取`MybatisPlus.fromXml()`
```java
public class Main {
public static void main(String[] args) throws Exception {
// 创建orm框架的工具类
MybatisPlus mybatisPlus = MybatisPlus.builder()
.setDriver(Driver.class.getTypeName())
.setUrl("jdbc:mysql://localhost:3306/dining_app")
.setUsername("root")
.setPassword("123456")
.setMapperPackage("com.uhu.mvc.main")
.build();
StudentMapper studentMapper = mybatisPlus.getMapper(StudentMapper.class);
ServiceImpl studentService = mybatisPlus.getService(StudentMapper.class, Student.class);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Student {
Long id;
String name;
Integer age;
}
@Mapper
interface StudentMapper extends BaseMapper {
}
}
```
## 五、关于自定义日志
此框架支持logback的日志文件配置,同时也新增代码方式配置日志,如下可重新配置日志文件()
```java
// 创建日志工具类
LogbackSlf4j.builder()
// 设置日志等级
.setLevel(Level.INFO)
// 设置显示的元素(参考枚举LogItem)
.appendLogItem(LogItem.TIME, Color.WHITE)
.appendLogItem(LogItem.LEVEL)
.appendLogItem(LogItem.THREAD, Color.MAGENTA)
.appendLogItem(LogItem.LOGGER, Color.green)
.appendLogItem(LogItem.MSG, Color.WHITE)
.build()
// 使用此日志
.use();
```