# afweb
**Repository Path**: long-zhangming/afweb
## Basic Information
- **Project Name**: afweb
- **Description**: 一个web应用通用框架。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2020-10-23
- **Last Updated**: 2022-02-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# afweb
### 介绍
一个web应用通用框架。
### 软件架构
软件架构说明
### 安装教程
#### 1. 导入源码及依赖jar包
导入本源码(或jar包)到一个普通Web项目中,并导入相关依赖jar包。

①、af.web包是本项目的源码。
②、WebRoot/WWB-INF/lib下面中,各jar包作用
commons-fileupload-1.3.1.jar、commons-io-2.4.jar(文件上传处理jar包)、
dom4j-1.6.1.jar(XML格式处理jar包)、json-org.jar(JSON格式处理jar包)、
Fremarker-2.3.28.jar(模板引擎支持,Framarker)
#### 2. 在src目录下添加配置文件af-service.xml

af-service.xml的内容:
```
```
#### 3.配置框架类的启动
在web.xml文件中添加配置项,
找到web.xml文件,在WebRoot/WEB-INF目录下面

添加上配置
```
AfGenericService
af.web.service.AfGenericService
1
AfGenericService
*.api
AfUploadService
af.web.fileupload.AfUploadService
1
AfUploadService
*.up
```
准备工作完成。。。
### 使用说明
#### 一. RESTful风格接口
要实现RESTful风格的接口,步骤如下
##### 1、新建一个类HelloControllerApi,此类继承自AfRestfulApi,要实现接口的。

HelloControllerApi内部如下;
```
package my.controller;
import org.json.JSONObject;
import af.web.restful.AfRestfulApi;
public class HelloControllerApi extends AfRestfulApi
{
// 业务处理逻辑
@Override
public Object execute(JSONObject jreq) throws Exception
{
return null;
}
}
```
#### 2、在af-service.xml文件中添加接口跟类的对应关系
```
```
#### 3、使用
##### 总览
```
package my.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONObject;
import af.web.restful.AfRestfulApi;
public class HelloControllerApi extends AfRestfulApi
{
/***
* 前端输入:http://127.0.0.1:8080/app/HelloController.api
* 框架截获请求,并得到有效值:HelloController
* 再根据af-service.xml中的配置,通过反射创建,就能把请求放到这个类里面来处理
*
*/
@Override
public Object execute(JSONObject jreq) throws Exception
{
// 如果需要这两个参数可从其父类直接获取
HttpServletRequest request = httpReq;
HttpServletResponse response = httpResp;
// 可以返回null、int、long、boolean、String、double、POJO类或者JSONOBject/JSONArray
return null;
}
}
```
##### 请求
接收请求演示
```
package my.controller;
import org.json.JSONObject;
import af.web.restful.AfRestfulApi;
public class StudentAPI extends AfRestfulApi
{
@Override
public Object execute(JSONObject jreq) throws Exception
{
/***
* 这里只演示了前端通过GET方式来传值,我们的取出方式。
* 但是,我们的框架已经把所有的值都处理好了放在了jreq中,无论是GET方式头部的值,还是POST方式正文的值,
* 都可以通过jreq取得。
*/
/***
* 前端请求URL:http://127.0.0.1:8080/app/HelloController.api?id=5&title=loveyou
*/
int id = jreq.getInt("id");
String title = jreq.getString("title");
// 把拿到的值处理,增删改查数据库等等
///////////////////
return null;
}
}
```
##### 应答
应答演示
```
package my.controller;
import org.json.JSONObject;
import af.web.restful.AfRestfulApi;
public class HelloControllerApi extends AfRestfulApi
{
@Override
public Object execute(JSONObject jreq) throws Exception
{
/***
* 框架会默认构造一个JSON格式的字符串返回给前端,默认带三个参数reason(错误原因)、error(错误码)、data(此方法的返回值转换成JSON格式)
* { "reason":"OK", "error":0, "data":{ } }
*
* 框架会把此方法的返回值转成成JSON格式并放在data中,一同返回给前端
*/
// 可以返回null、int、long、boolean、String、double、POJO类或者JSONOBject/JSONArray
return null;
}
}
```
#### 二. 文件上传接口
1、新建一个类,继承自AfUploadHandler.java,并重写里面的方法。
2、在af-service.xml配置文件中添加文件上传映射配置
```
```
3、具体使用
```
package my.controller;
import java.io.File;
import org.json.JSONObject;
import af.web.AfFormData;
import af.web.fileupload.AfUploadHandler;
import af.web.fileupload.AfUploadUtils;
public class HelloUpdate extends AfUploadHandler
{
String tmpFileName;
/**
* 指定一个上传的临时目录,把前端上传的文件放在哪个目录下,指定一个目录
*/
@Override
public File getTmpDir()
{
// 在WetRoot目录下创建一个upload文件夹来存放临时文件
String path = httpReq.getServletContext().getRealPath("/upload");
return new File(path);
}
/**
* 指定一个文件来存放前端上传的文件
*
* tmpDir:指定的临时目录
*
* realName:前端上传的文件的名字
*/
@Override
public File getTmpFile(File tmpDir, String realName)
{
// 取得文件后缀名,如xxx.txt,就得到.txt
String suffix = AfUploadUtils.fileSuffix(realName);
// 生成UUID
String uuid = AfUploadUtils.createUUID();
this.tmpFileName = uuid + suffix;
return new File(tmpDir, tmpFileName);
}
/***
* 在文件上传完成后,会调用这个方法做最后的处理。
* 通俗来说就是,文件已经上传完成并保存了,接下来怎么处理。
* 比如移动到其他位置,或者把信息保存到数据库等等
*
* size:文件大小
* formData:表单文本的封装
*
*/
@Override
public Object complete(long size, AfFormData formData)
{
// 文件访问路径
String storePath = "/upload/" + tmpFileName;
String contextPath = httpReq.getServletContext().getContextPath();
String url = contextPath + storePath;
// 把文件路径返回给前端
JSONObject result = new JSONObject();
result.put("storePath", storePath);
result.put("url", url);
return result;
}
}
```
#### 三. MVC接口
1、新建一个类,继承自AfSimpleMVC,并重写其方法
2、添加注解@WebServlet("xxx")
```
package my.controller;
import java.util.Map;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import af.web.freemarker.AfSimpleMVC;
@WebServlet("xxx")
public class HelloMVC extends AfSimpleMVC
{
@Override
protected String execute(HttpServletRequest req, HttpServletResponse resp, Map model)
throws Exception
{
// 返回模板地址
// 对应hello.html
return "hello";
}
}
```
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
7. 学java,来http://afanihao.cn/