前面几篇博客介绍了TeaFramework的实现,本篇博客将介绍如果利用Teaframework进行web开发,写了一个demo,包括一套完整的增删改查,分页、AOP等等,基于LayUI做了一套界面(感谢@贤心的LayUI)。demo已经上传至码云,地址:https://gitee.com/lxkm/TeaFrameWorkHelloWorld,demo的总体界面如下:
下面就来体验极简的web开发旅程吧。
一、环境搭建
1、安装maven
2、由于Teaframework目前没有发布到中央仓库,所以需要本地down一份Teaframework代码,git地址:https://gitee.com/lxkm/teaframework.git,执行mvn install将Teaframework安装至本地仓库。
3、将demo代码从https://gitee.com/lxkm/TeaFrameWorkHelloWorld.git上down下来,执行mvn install,在mysql中建立一个空库,执行/src/main/resources/db里的sql语句,然后执行mvn tomcat7:run就可以用maven tomcat插件启动web服务了,浏览器访问http://localhost:8080即可看到界面。
二、开发过程
1、teaFramework.properties配置,数据库类型mysql、数据库username、数据库password、包的扫描路径。
teaFramework.databaseType=mysql
teaFramework.baseScanPackage=org.teaframework.helloworld
dbcp.driverName=com.mysql.jdbc.Driver
dbcp.username=root
dbcp.password=12345
dbcp.url=jdbc:mysql://localhost/helloworld?useUnicode=true&characterEncoding=UTF-8
dbcp.initialSize=10
dbcp.maxTotal=30
dbcp.maxIdle=20
dbcp.maxWaitMillis=10000
dbcp.minIdle=10
2、web.xml配置
web请求的转发通过过滤器org.teaframework.web.filter.TeaDispatcherFilter实现,TeaDispatcherFilter可以配置不拦截的资源文件或者图片等,也可以配置编码。
<filter>
<filter-name>TeaDispatcherFilter</filter-name>
<filter-class>org.teaframework.web.filter.TeaDispatcherFilter</filter-class>
<init-param>
<param-name>notIntercept</param-name>
<param-value>.jsp,.png,.gif,.jpg,.js,.css,.jspx,.jpeg,.swf,.ico,.woff</param-value>
</init-param>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>TeaDispatcherFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
另外需要配置listener在web容器启动时启动TeaFramework
<listener>
<listener-class>org.teaframework.web.listener.TeaContextListener</listener-class>
</listener>
3、注解说明
@Namespace:标示URL前缀
@Component:标示该类需要bean容器来实例化
@Inject:注入属性,默认根据类型注入,如果要根据bean注入,可以写成@Inject("beanName")
@TeaDao:注解在dao层的接口上,标示需要被动态代理来生成实现类
@Transcation:注解在方法上,表示方法需要事务控制,注解在类上,表示类的所有公有方法需要被纳入事务管理。
4、控制层
@Namespace("/userManage")标示请求的前缀,注解在类之上,url的形式写成/namespace/method的形式即可,例如:demo中UserController下有个findUserList方法,那么访问这个方法的url可以写成这样:/userManage/findUserList
package org.teaframework.helloworld.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.teaframework.helloworld.base.PageResult;
import org.teaframework.helloworld.domain.User;
import org.teaframework.helloworld.service.UserService;
import org.teaframework.helloworld.vo.UserVO;
import org.teaframework.ioc.annotation.Component;
import org.teaframework.ioc.annotation.Inject;
import org.teaframework.web.annotation.JSON;
import org.teaframework.web.annotation.Namespace;
import org.teaframework.web.annotation.Param;
@Namespace("/userManage")
@Component
public class UserController {
@Inject
private UserService userService;
@JSON
public PageResult<User> findUserList(UserVO userVO) {
return new PageResult<User>(userService.findUserList(userVO));
}
public String dispatch(@Param("mode") String mode, @Param("id") Long id, Map<String, Object> map) {
if ("add".equals(mode)) {
return "/addUserDlg.jsp";
} else if ("edit".equals(mode)) {
map.put("user", userService.getUserById(id));
return "/updateUserDlg.jsp";
}
return null;
}
@JSON
public User addUser(User user) {
return userService.addUser(user);
}
@JSON
public Integer deleteUsers(@Param("ids") String ids) {
List<Long> idList = new ArrayList<Long>();
if (null != ids && !"".equals(ids)) {
String[] idArray = ids.split(",");
for (String id : idArray) {
idList.add(Long.parseLong(id));
}
}
return userService.deleteUserByIds(idList);
}
@JSON
public User updateUser(User user) {
return userService.updateUser(user);
}
}
5、service层
package org.teaframework.helloworld.service.impl;
import java.util.List;
import org.teaframework.aop.annotation.Transcation;
import org.teaframework.helloworld.dao.UserDao;
import org.teaframework.helloworld.domain.User;
import org.teaframework.helloworld.service.UserService;
import org.teaframework.helloworld.vo.UserVO;
import org.teaframework.ioc.annotation.Component;
import org.teaframework.ioc.annotation.Inject;
import org.teaframework.orm.databind.util.DynamicSqlUtil;
import org.teaframework.orm.pagehelper.OrderBy;
import org.teaframework.orm.pagehelper.PageInfo;
import org.teaframework.orm.pagehelper.PageUtil;
@Transcation
@Component
public class UserServiceImpl implements UserService {
@Inject
private UserDao userDao;
@Override
public PageInfo<User> findUserList(UserVO userVO) {
if (userVO.getField() != null && userVO.getSord() != null) {
PageUtil.setPageParameter(userVO.getPage(), userVO.getLimit(),
new OrderBy().addOrderPair(userVO.getField(), userVO.getSord()));
} else {
PageUtil.setPageParameter(userVO.getPage(), userVO.getLimit(), null);
}
String sql = "select * from users";
if (userVO.getId() != null) {
sql += " where id=" + userVO.getId();
}
DynamicSqlUtil.set(sql);
return new PageInfo<User>(userDao.findUserList());
}
@Override
public User addUser(User user) {
Long id = userDao.addUser(user);
return getUserById(id);
}
@Override
public User getUserById(Long id) {
return userDao.getUserById(id);
}
@Override
public Integer deleteUserByIds(List<Long> ids) {
int result = 0;
for (Long id : ids) {
if (userDao.deleteUserById(id) > 0) {
result++;
}
}
return result;
}
public User updateUser(User user) {
userDao.updateUser(user);
return getUserById(user.getId());
}
@Override
public User getUserByUserName(String userName) {
return userDao.getUserByUserName(userName);
}
}
6、dao层
package org.teaframework.helloworld.dao;
import java.util.List;
import org.teaframework.helloworld.domain.User;
import org.teaframework.orm.annotation.AutoIncrement;
import org.teaframework.orm.annotation.DynamicSQL;
import org.teaframework.orm.annotation.SQL;
import org.teaframework.orm.annotation.TeaDao;
@TeaDao
public interface UserDao {
@DynamicSQL
public List<User> findUserList();
@AutoIncrement
@SQL("insert into users(userName,password,name,createDate,createUser,updateDate,updateUser,mobile) values(#userName#,#password#,#name#,#createDate#,#createUser#,#updateDate#,#updateUser#,#mobile#)")
public Long addUser(User user);
@SQL("select * from users where id=#id#")
public User getUserById(Long id);
@SQL("delete from users where id=#id#")
public Integer deleteUserById(Long id);
@SQL("select * from users where userName=#userName#")
public User getUserByUserName(String userName);
@SQL("update users set name=#name#,updateDate=#updateDate#,updateUser=#updateUser#,mobile=#mobile# where id=#id#")
public void updateUser(User user);
}
7、AOP
这里AOP的例子,拦截dao层的新增和修改方法,包createUser、createDate、updateUser、updateDate,四个属性set进去。
package org.teaframework.helloworld.aspect;
import java.util.Date;
import org.teaframework.aop.AbstractProxy;
import org.teaframework.aop.BeanProxy;
import org.teaframework.aop.Proxy;
import org.teaframework.aop.annotation.Aspect;
import org.teaframework.helloworld.base.BaseDomain;
@Aspect(classRegex = "org.teaframework.helloworld.*.dao.*", beforeRegex = "add.*|update.*")
public class DomainAspect extends AbstractProxy {
@Override
public void before(Proxy proxy) {
BeanProxy beanProxy = (BeanProxy) proxy;
if (beanProxy.getArgs() != null && beanProxy.getArgs()[0] instanceof BaseDomain) {
BaseDomain domain = (BaseDomain) beanProxy.getArgs()[0];
domain.setCreateDate(new Date());
domain.setCreateUser("admin");
domain.setUpdateDate(new Date());
domain.setUpdateUser("admin");
}
}
}
好了,通过Teaframework进行web开发的整个后端代码介绍完毕,整个开发的过程基本没配置,完全通过注解、动态sql部分完全可以自由通过代码自由组装,通过分页、排序等等实用功能,赶快下载体验简单的web开发旅程吧。