实现一个简易的java web框架。
- ioc
- mvc
- orm
- dao
- aop
- 其他...
Download项目代码后使用maven install到本地仓库后就可以使用。
<dependency>
<groupId>com.coin</groupId>
<artifactId>coin-framework</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
在resources下新建一个coin.properties
#ioc扫描的package 多个用","隔开,应该包括controller,service和Aspect
coinioc_package com.dwl
#controller所在package 多个用","隔开
coinact_package com.dwl
#数据库连接基本信息
jdbc.driver com.mysql.jdbc.Driver
jdbc.url jdbc:mysql://localhost:3306/reports?useUnicode=true&characterEncoding=UTF-8
jdbc.username root
jdbc.password 111111
#静态资源路径 ,不配置时默认webapp下的static文件夹
static_path /static/
#jsp路径,不配置时默认WEB-INF下的jsp文件夹
jsp_path /WEB-INF/jsp/
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>coin-framework</display-name>
<servlet>
<servlet-name>coinServlet</servlet-name>
<servlet-class>com.me.coin.framework.mvc.DispatchServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>coinServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/index.html</welcome-file>
</welcome-file-list>
</web-app>
- @Table 表名
- @Id 主键
- @Column 字段映射
@Table("T_USER")
public class User {
@Id
@Column("id")
private String id;
@Column("name")
private String name;
//getter/setter省略
}
- @Service 标识service层
- @Inject 依赖注入
@Service
public class UserServiceImpl implements UserService{
@Inject
private Dao dao;
@Override
public List<User> getList(String name) {
return dao.query(User.class, Cnd.where().and("name", "=", name));
}
@Override
@Transaction
public long addUser(User user) {
return dao.insert(user);
}
}
- @Act 标识控制层
- @Request 地址映射
- @Inject 依赖注入
@Act
@Request("/user")
public class UserController {
@Inject
private UserService userService;
/**
* 获取执行姓名的用户
* @param name
* @return Result
*/
@Request("/list")
public Result getUsers(@Param("name") String name){
//获取用户 -select * from T_USER where name = ?
List<User> list = userService.getList(name);
Map<String, Object> data = new HashMap<>();
data.put("list", list);
return new Result(data, View.Json);
}
/**
* 添加用户,返回主键
* @param user
* @return Result
*/
@Request("/add")
public Result addUser(@Entity("user.")User user){
long pk = userService.addUser(user);
Map<String, Object> data = new HashMap<>();
data.put("pk", pk);
return new Result(data, View.Json);
}
}
- @Param 基本参数类型及其包装类
- @Entity 对象参数类型
使用@Entity("user.")时,前端传过来的参数user.name,user.age,user.sex都会封装到user对象中。
定义了三种基本视图
- View.Json 返回json
- View.Jsp 返回jsp
- View.Redirect 重定向
dao在项目启动时已交给ioc管理
使用@Inject即可使用
@Inject
private Dao dao;
- 查询
//获取所有用户 -select * from T_USER
List<User> list1 = dao.query(User.class, Cnd.where());
//获取用户 分页 -select * from T_USER limit 0,10
List<User> list2 = dao.query(User.class, Cnd.where(),new Pager());
//获取用户 -select * from T_USER where age = 16
List<User> list3 = dao.query(User.class, Cnd.where().and("age", "=", 16));
//获取用户 -select * from T_USER where id = 1
User user = dao.fetch(User.class, 1);
- 新增
int sus = dao.insert(user);//返回执行成功的条数
long id = dao.insert(user,Long.class);//返回自增主键
- 删除
dao.delete(user);//删除对象
dao.delete(User.class,1);//按主键删除
dao.delete(User.class, Cnd.where().and("name", "=", "dwl"));//按条件删除
- 更新
dao.update(user);
- 统计
long count = dao.count(User.class, Cnd.where());//统计全表
long count = dao.count(User.class, Cnd.where().and("age", ">", 35));//按条件统计
使用@Act,@Service,@IocBean标记的类将交给ioc管理,由ioc负责创建和注入。
- @Act controller类
- @Service service类
- @IocBean 组件类
- @Inject 需要注入的属性
事务管理在service层进行,@Transaction与@Service需配合使用才能生效,暂不支持事务传播行为。
- @Transaction 声明式事务管理
@Service
public class UserServiceImpl implements UserService{
@Inject
private Dao dao;
@Override
@Transaction
public long addUser(User user) {
return dao.insert(user);
}
}
使用@Aspect声明切面类,切面也需要交给ioc管理。
支持对同一切入点的多重切面。
- @Aspect(pointCut="") 切面,切入点
- @Before 前置通知
- @After 后置通知
- @Throwing 异常通知
@IocBean
@Aspect(pointCut="com.dwl.controller")
public class AspectT {
@Before
void start(Method method,Object[] args){
System.out.println("前置通知");
System.out.println(method.getName());
}
@After
void end(Method method,Object[] args){
System.out.println("后置通知");
}
@Throwing
void error(Method method,Object[] args,Throwable throw){
System.out.println("异常通知");
}
}