文章目录
写在前面
先按照 第一章 中的 “1、快速开始一个act项目” 创建act项目。
1、搭建项目基础组成
首先我们建几个包: controller、dao、entity、service、service.impl。
下面是接下来我们要编辑、新建的内容
接下来我们要做一个简单的登录、注册功能。
添加pom依赖:
<!-- ActFramework Hibernate插件,必加 -->
<dependency>
<groupId>org.actframework</groupId>
<artifactId>act-hibernate</artifactId>
</dependency>
<!-- 数据库连接池,HikariCP,Druid选加其一 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<!-- MySql 数据库驱动包 根据你所使用的的数据库选加 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
在mysql里面新建库test、新建表user
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`password` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
`email` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
`phone` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 ;
1.1、新建实体类User.java
import act.Act;
import act.util.SimpleBean;
import javax.persistence.*;
@Entity
@Table(name = "user")
public class User implements SimpleBean {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer id;
@Column
public String password;
@Column
public String email;
@Column
public String phone;
public static String getPasswordHash(String password) {
return Act.crypto().passwordHash(password);
}
}
1.1.1、SimpleBean接口
实现SimpleBean接口, Act会自动生成Getter/Setter方法,但权限一定要是public
这里的get、set方法使用和Lombok的有点不一样,如下:
// get
xxx = user.name;
// set
user.name = xxx;
1.1.2、passwordHash()方法
Act.crypto().passwordHash(password);加密密码
1.2、UserDao.java
import act.db.jpa.JPADao;
import com.demo.entity.User;
public class UserDao extends JPADao<Integer, User> {
}
1.2.1、JPADao类
JPADao 里面封装了基础的 增删改查。 具体更复杂的,我们就需要用到 EntityManager 。
1.3、UserService.java
import act.inject.AutoBind;
import com.demo.entity.User;
@AutoBind
public interface UserService {
int register(User user);
User login(Integer id,String password);
}
1.3.1、@AutoBind 注解
@AutoBind 注解用于依赖注入。它扫描service的实现类,进行自动关联。
1.4、UserServiceImpl.java
import act.Act;
import act.db.sql.tx.Transactional;
import com.demo.dao.UserDao;
import com.demo.entity.User;
import com.demo.service.UserService;
import javax.inject.Inject;
public class UserServiceImpl implements UserService {
@Inject
private UserDao dao;
@Override
@Transactional
public int register(User user) {
dao.save(user);
return 0;
}
@Override
@Transactional
public User login(Integer id, String password) {
User user=dao.findById(id);
if (Act.crypto().verifyPassword(password, user.password)) return user;
else return null;
}
}
1.4.1、@Inject注解
@Inject 为依赖注入注解。注入dao、service接口都用它。
类似spring里面的@Autowire
1.5、UserController.java
import act.controller.Controller;
import com.demo.entity.User;
import com.demo.service.UserService;
import org.osgl.mvc.annotation.GetAction;
import org.osgl.mvc.annotation.PostAction;
import org.osgl.mvc.result.Result;
import javax.inject.Inject;
public class UserController extends Controller.Util {
@Inject
private UserService service;
@GetAction("register")
public void register() {
}
@GetAction("login")
public void login() {
}
@PostAction("doRegister")
public Result doRegister(User user) {
try{
user.password=User.getPasswordHash(user.password);
service.register(user);
}catch (Exception e){
e.printStackTrace();
return renderHtml("<script>alert('\\u6CE8\\u518C\\u5931\\u8D25\\uFF01');window.history.back();</script>");
}
return renderHtml("<script>alert('\\u6CE8\\u518C\\u6210\\u529F\\uFF01uid:"+user.id+"');location.href='login';</script>");
}
@PostAction("doLogin")
public Result doLogin(Integer uid,String pwd) {
try{
User user=service.login(uid,pwd);
if (user!=null)return renderHtml("<script>alert('\\u767B\\u5F55\\u6210\\u529F\\uFF01');location.href='register';</script>");
return renderHtml("<script>alert('\\u767B\\u5F55\\u5931\\u8D25\\uFF01');window.history.back();</script>");
}catch (Exception e){
e.printStackTrace();
return renderHtml("<script>alert('\\u767B\\u5F55\\u5931\\u8D25\\uFF01');window.history.back();</script>");
}
}
}
1.5.1、Controller.Util类
Controller.Util类可以非常简单的写出提示信息。
1.6、register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="doRegister" method="post">
密码:<input name="password" type="password"/><br />
电话:<input name="phone" /><br />
邮箱:<input name="email" /><br />
<button>注册</button>
</form>
</body>
</html>
1.7、login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="doLogin" method="post">
用户ID:<input name="uid" /><br />
密码:<input name="pwd" type="password"/><br />
<button>登录</button>
</form>
</body>
</html>
1.8、配置文件
/resource/conf/db.properties
db.impl = act.db.hibernate.HibernatePlugin
db.driver = com.mysql.jdbc.Driver
db.url = jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
db.username = root
db.password = root
/resource/hibernate.properties
hibernate.show_sql = true
2、运行
重启项目(添加依赖后需要重启),测试:
http://127.0.0.1:5460/register
如果项目报这个错误:InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMIT
请在mysql里先执行下面三条语句,然后重启项目:
SET GLOBAL binlog_format = 'STATEMENT';
SET GLOBAL binlog_format = 'ROW';
SET GLOBAL binlog_format = 'MIXED';