# javaSE阶段综合练习



已知用户类结构如下：

```java
class User{
    private String username;
    private String password;
    // 省略有参构造方法、无参构造方法、getter方法、setter方法、toString方法
}
```

已知**用户服务``UserService``**接口如下：

```java
public interface UserService {
    /**
     * 用户注册
     * @param user
     */
    void register(User user);

    /**
     * 用户登录
     * @param username
     * @param password
     * @return 登录结果
     */
    String login(String username,String password);
}
```

# 一、用户注册

案例描述：

> 创建``UserService``接口的实现类``UserServiceImpl``，重写``register()``方法，要求在方法中实现用户注册功能。

案例需求：

> ``register(User user)``方法内需要实现以下操作：
>
> 1. 创建以user对象中username属性值为文件名的``.properties``文件。比如：
     >    - ``user.getUsername()``的返回值为``zhangsan``，则创建名为``zhangsan.properties``的文件
> 2. 在已创建的``.properties``文件中写入user对象的password属性值。比如：
     >    - ``user.getPassword()``的返回值为``123456``，则在文件中写入``password=123456``
> 3. 要求验证user对象的username值的唯一性，如果传入的user对象的username重复了，则抛出``UsernameDuplicateException``异常，该异常需要自定义。

实现步骤分析：

- 当调用``register(User user)``方法传入``user``对象后，在方法中首先要验证user对象的用户名``username``是否重复，比如``username=zhangsan``。也就是查询是否具有``zhangsan.properties``文件，如果有，则直接抛出``UsernameDuplicateException``异常。
- 如果没有重复，则创建文件名为``zhangsan.properties``的文件。
- 获取``user``对象的``password``属性值，比如``password``属性值为``zs123456``。将``password=``和``zs123456``进行字符串拼接。比如：``password=zs123456``。
- 拼接完成后，使用文件输出流将拼接好的字符串输出到``zhangsan.properties``文件中。
- 释放资源，关闭流。



# 二、用户登录

案例描述：

> 创建``UserService``接口的实现类``UserServiceImpl``，重写``login()``方法，要求在方法中实现用户登录功能。

案例需求：

> ``login(String username,String password)``方法内需要实现以下操作：
>
> 1. 搜索文件名为username实际参数的文件是否存在。比如：
     >    - username为``zhangsan``，则搜索``zhangsan.properties``文件是否存在。
> 2. 不存在，则返回结果："用户名不正确，请重新输入"，存在，则验证该文件中的password的值是否和传入方法的实参password一致。如果一致，则返回结果："登录成功"，否则返回结果"密码错误，登录失败"。
> 3. 要求使用Properties集合来获取文件中的password属性值。

实现步骤分析：

- 当调用``login(String username,String password)``方法传入user对象后，在方法中首先要验证user对象的用户名``username``是否存在，比如``username=zhangsan``。也就是查询是否具有``zhangsan.properties``文件，没有则直接返回结果：``"用户名不正确，请重新输入"``。
- 如果有该文件，则通过Properties对象的``load()``方法获取``password``属性的值。
- 然后将获取到的密码，和传入方法的密码实参进行比较，如果相同则返回结果：``"登录成功"``。否则返回：``"密码错误，登录失败"``。
- 释放资源，关闭流。



















