# DON
**Repository Path**: windfly/DON
## Basic Information
- **Project Name**: DON
- **Description**: java 小型web项目快速开发框架,实现无配置,直接关注业务开发.主要解决请求分发解析
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2014-04-07
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#DON框架介绍
##目标
>1. 启动零配置快速进入开发
1. 开发时,请求controller路由零配置
1. 配合windfly.jar工具包快速开发
1. 最终实现加入jar包即可快速开发
##主要特点
>1. 无需配置请求url映射,自动根据url映射到对应的类和方法上
1. 根据请求类方法的返回值不同,自动输出不同类型值
1. 内置常用工具类集合,方便实现常用功能
## DON能解决的问题 ##
>1. 无需任何配置,按照标准的web项目组织结构生成目录,加入jar包,可直接去写业务逻辑.
1. 无需配置url和控制器的映射,通过固定url格式自动映射到类的方法上
1. 控制器使用POJO类,无侵入性,可方便做单无测试
## DON的限制 ##
>1. 项目的结构必须是标准组织结构
2. 开发中IDE中的class生成目录必须指定为 `/WEB-INF/classes/`
3. 动态页面必须为JSP,并放置于目录 `/WEB-INF/jsp/ `
6. url固定后缀名,即 `.dhtml`
7. 控制器类名要以固定后缀结尾
8. 页面必须以 UTF-8 编码
9. 同一个类中不能有同名的controller方法,即不支持重载
10. JDK1.8+
## web项目的组织结构 ##
>标准的web组织结构
```
WebContent
+---WEB-INF
+---/classes/
+---/lib/
+---/jsp/
+---web.xml
```
# DON 使用说明 #
[如何写controller](使用说明/如何写controller.md)
## URL请求格式说明 ##
```
http://上下文路径/类名前缀/方法名.dhtml
http://testWeb/Index/main.dhtml
http://Index/main.dhtml
```
>- DON只对以 .dhtml 结尾的请求路径进行解析处理
- 上下文路径是看项目在容器中的部署情况,核心在于 `Index/main.dhtml `
- Index 指定了将会去查找 `IndexController.java` 类
- main 指定了会去执行 IndexController.java 中的 main(Map map); 方法
- 对于 .dhtml 请求,如果格式不对会抛出异常 如: `http://testWeb/xxx/Index/main.dhtml` 会抛异常
## 控制器类 ##
>- 普通pojo类,其类名要以 `Controller` 结尾
- 类名不可重复,即在不同包中不能有相同名称的控制器.
## 控制器方法说明 ##
>- 方法名不能有相同的多个,即不可重载
- 方法的参数不固定,请求的参数值会自动根据参数名注入到方法的参数中
- 除请求参数外,可注入类型为HttpServletRequest,HttpServletResponse,HttpSession,Map类型参数,request主要用于登录会话处理和下载流处理。map参数中包含了请求的所有参数
- 方法参数可注入pojo bean,根据bean的set/get方法注入参数
- 方法参数注入Map的类型,除了包含了请求参数外,向map中存值也就相当于调用request.setAttribute(k,v)
- 方法的返回值不固定,参考返回值说明
- 方法不能为 `static`
- 必须为 `public`
- 示例: `public String main(long id,Map map)`;
- 方法体中取参数时可直接对map进行操作
```
long _id = (Long)map.get(id);
```
## 控制器方法返回值 ##
>- 根据返回值类型,对页面进行不同的渲染
- String字符串,如果有特殊前缀则进行特殊处理. `redirect:` 跳转请求 `string:` 直接输出字符串到页面中.否则渲染在/WEB-INF/jsp/目录中相应路径的jsp页面.示例:
```
return "redirect:/Index/main.dhtml"; // 跳转到http://Index/main.dhtml
return "string:hello"; // 直接在页面中输出hello
return "admin/hello"; // 渲染 /WEB-INF/jsp/admin/hello.jsp
```
- 非字符串对象类型,返回json数据,自动转换
```
// 有User类,并有name和age属性
return new User("张三",12); // 返回 {"name":"张三","age":12}
```
## 上传文件功能 ##
>- 页面中form类型设置 `enctype="multipart/form-data"`
- 属性的value不能为中文,后台将以`iso8859-1`格式接收文件
- 单个上传文件内容不能大于10M
- 方法一
> 直接在参数中取属性名,value类型为 `File`
```
File logoFile = (File)map.get("logoP");
String remark = (String)map.get("fileRemarkP");
saveFile(logoFile,remark);
```
- 方法二
> 直接在参数中取属性名,value类型为 `String`,框架会自动保存文件到resources/upload/ 文件夹下,传入文件相对路径。注意,这种方式只能使用String 接收,不能使用Map接收
```
public String upload(String filePath){
savePath(filePath);
return "string:success";
}
```
## 服务层使用建议 ##
>- DON 框架并没有过多的涉及到服务层
- 如果项目不大且已经确定了数据存储方式,一般都可以去除数据层,直接在服务层进行数据处理,这样可以更快的进行项目开发.配合windfly-util.jar包中的AR方式进行JPA快速开发
- 如果对后期数据存储不确定,可能会换数据处理的实现,则要进行数据层的分离,分离时还要考虑服务层的事务整体性.
## 数据层使用建议 ##
>- DON 框架中对于数据性不过多涉及,建议使用windfy-util项目中的 `util使用JpaEntityBase类` 的工具类.
- 对于数据操作建议使用JPA
- JPA实现建议使用 `eclipselink`,一个jar包即可
- 将 `persistence.xml` 放置于 `/WEB-INF/classes/META-INF/persistence.xml`
- 内容,可适当的修改,使用derby可谓是最方便的了,加入derby.jar包,复制以下内容,直接使用
```
org.eclipse.persistence.jpa.PersistenceProvider
false
```
- 操作实体类时,实体类继承JpaEntityBase类,可方便使用继承的方法
```
class UserEntity extends JpaEntityBase
UserEntity user = new UserEntity();
user.setName("jone");
user.save();
user.setName("jake");
user.update();
user.delete();
// 查询分页
user.setPageCondition("name like :name",MapUtil.toMap("name","%j%"),1,10);
PageBarUtil users = user.searchPageBarUtil();
```
## 版本更新
## todo
> 启动加入版本号
## trunk
## v1.3.1
> 参数注入时,Date类型的增加自动解析格式: yyyy-MM-dd HH:mm:ss,yyyy-MM-dd,yyyy-MM-dd HH:mm,yyyy-MM,yyyy,HH:mm:ss,HH:mm
## v1.3
> 分离util包,加入windfly-util.jar包
> beanutil中toFiledsString方法更改private > public
> JsonResult code为0时,字段变动 msg > data
> IE11的application/json问题处理
> 增加 WeiXinUtil 工具类
> fix bug: ie edge 上传文件,文件名全路径错误
> 上传文件增加url全路径前缀配置
> 修改,上传文件后缀名配置为空时,文件后缀名不限制
> 增加微信退款方法
> fix bug:修复post方法获取字符串中丢失换行符问题
## v1.2
> 整合windfly-util代码
> 去除log4j代码
> controller参数中增加自有TypeMap参数
> 请求参数名相同,参数值转为List
> 增加上传文件大小限制,在don.config文件中配置
> 增加application/json头信息请求处理
> 上传参数是文件时,参数值根据接收参数类型自动自动转换,Stirng类型转换成访问地址
> BeanUtil增加辅助方法
> fileutil增加上传文件默认处理方法
> JpaEntityBase fix bug:使用update静态方法时会处理所有数据
> JsonUtil fix bug:部分类属性无权访问
> NumberByteUtil 增加辅助方法
> 增加MessageException类
## v1.1.0.5
> fix bug:增加请求头是application/json的内容处理
> controller请求参数增加TypeMap类型
> fix bug:上传文件多了两个字节
> fix bug:DBUtil部分方法连接未关闭
> 去除slf4j包依赖
> 将util类分为windfly-util项目包
> ## v1.0.2.1
> fix bug:上传文件流行中不是Content-Disposition时抛异常
> fix bug:上传文件名为空时异常
>
> ## v1.0.0.0