文章目录
fxml文件
标签
标签都是成对存在的,有两种写法
<Stackpane></Stackpane>
<button/>
绑定控制器
每个fxml文件都有对应一个jave文件,这个java文件叫做控制器 通过fx:controller绑定
x:controller:"com.module.login"
事件
由于每一个标签会对应一个事件,我们可以通过标签中的onAction属性与控制器的相对应方法进行绑定
<button :onAction="#login">
输入框
通过输入框fx:id与控制器属性进行绑定
<TextFiled fx:id ="username">
@FXML private TextField username;
分层的思想
用户相关功能
用户数据初始化
先创建user对象放入到list中,然后通过输出流list对象写出到硬盘的user.txt中,达到持久化的目的
关于serializable接口
由于存到list中的是User对象,所以要让User实现可序列化,要对某个类的对象进行IO操作时,要让该类实现serializable接口。
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
把对象转换为字节序列的过程称为对象的序列化
把字节序列恢复为对象的过程称为对象的反序列化
ObjectOutputStream 类
对象的序列化流:把对象转成字节数据的输出到文件中保存,对象的输出过程称为序列化,可实现对象的持久存储。
FileOutputStream
FileOutputStream流是指文件字节输出流,专用于输出原始字节流如图像数据等,其继承OutputStream类,拥有输出流的基本特性
注意要点
1.利用对象输出流将list数据写出到文件中
oos= new ObjectOutputStream(new FileOutputStream(PathConstant.USER_PATH));
2.写入数据
oos.writeObject(list);
3.记得最后要关闭流
if(oos!=null){
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public class InitDataUtil {
public static void main(String[] args) {
initUser(null);
}
// 初始化用户数据
public static void initUser(List<User> userList){
ObjectOutputStream oos=null;
//创建相关文件和文件夹
try {
File diretory= new File("user/");
//路径全部用常量表示
File file =new File(PathConstant.USER_PATH);
//判断文件是否存在
if(!diretory.exists()){
diretory.mkdir();
}
if(!file.exists()) {
file.createNewFile();
List<User> list = new ArrayList<>();
//判断UserList是否有数据
if (userList == null) {
list.add(new User(1001, "xiaoming", Constant.USER_OK, BigDecimal.TEN));
}else{
list =userList;
}
//利用对象输出流将list数据写出到文件中
oos= new ObjectOutputStream(new FileOutputStream(PathConstant.USER_PATH));
oos.writeObject(list);
}
}
catch (IOException e) {
e.printStackTrace();
}finally {
//最后关闭
if(oos!=null){
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
查询用户
读取user.txt中的文件,将硬盘上的文件加载到内存中
serialVersionUID
user类实现serializable接口后,最好添加serialVersionUID,便于对user版本的控制。如果不添加,在user类改变后UID也会改变,和之前的UID对应不上,导致运行出错。
查询用户中代码的分层使用
controller: UserViewCtrl
service:接口UserService,实现类UserServiceImpl
dao:接口UserDao,实现类UserDaoImpl
这里通过接口的使用可以提高代码的可插拔性,提高了程序的可维护性。
userdoa
public interface UserDao {
List<User> select();
}
public class UserDaoImpl implements UserDao {
/*
从硬盘文件读取数据
*/
public List<User> select() {
try(ObjectInputStream ois=new ObjectInputStream(new FileInputStream(PathConstant.USER_PATH))){
List<User> list =(List<User>)ois.readObject();
return list;
}catch (Exception e){
e.printStackTrace();
}
//如果上面出现了异常,则返回一个List对象
return new ArrayList<>();
}
}
userservice
public interface UserService {
List<User> select();
}
public class UserServiceImpl implements UserService {
private UserDao userDao=new UserDaoImpl() ;
/*
查询
*/
@Override
public List<User> select() {
return userDao.select();
}
}
usercontrol
ObservableList<User> users = FXCollections.observableArrayList();
private UserService userService =new UserServiceImpl() ;
@Override
public void initialize(URL location, ResourceBundle resources) {
//调用Userservice层查询用户数据
List<User> userList =userService.select();
users.addAll(userList);
c1.setCellValueFactory(new PropertyValueFactory<>("id"));
c2.setCellValueFactory(new PropertyValueFactory<>("name"));
c3.setCellValueFactory(new PropertyValueFactory<>("money"));
c4.setCellValueFactory(new PropertyValueFactory<>("status"));
userTableView.setItems(users);
}
添加用户
功能:在界面添加用户信息后,control调用service层,最后调用dao层,将用户数据持久化到硬盘中
在添加界面输入用户信息之后,点击提交按钮,会将用户对象传到service层,service层再调用DAO,在DAO中使用对象输入流将用户集合数据读到内存中,将新增的user对象存入集合里面,之后使用对象输出流将用户集合数据写出到硬盘文件中。
在创建类似User这样的类时,我们通常会在里面添加一个id编号属性,目的是作为该对象的唯一标识,便于查询,修改,删除操作。为了保证id编号不重复,这里通过程序控制id编号自动增长,在多线程环境下需要注意线程安全的问题。
dao层
Uerdao接口添加add方法
userdaoimpl实现上述接口重写add方法
service层
user service接口添加add方法
userserviceimpl 重写add方法调用userdao添加用户
control层
修改userhandleview 调用userservice,再调用user
修改用户
点击修改按钮之后需要将当前选中的修改数据显示到修改界面中,修改界面里面要存储数据的编号id,这些数据传到DAO层之后,通过id在用户集合中找到相应的用户对象,从而进行修改操作。这里的修改界面跟添加界面使用的是同一个fxml
方法:编写dao层,然后编写service层,最后在control层调用user service
关于lamda表达式
(参数) -> 需要返回的值