本篇匯總留言板業務層完整契約,定義 MessageService 與 UserService 兩大核心介面,涵蓋發文、回覆、查詢、刪除、用戶認證、註冊等所有業務場景,為 Controller 層提供穩定的依賴介面。

public interface MessageService {
// 主題貼發布
void postTopic(Integer userId, String title, String content);
// 回覆貼文
void reply(Integer parentId, Integer userId, String title, String content);
// 分頁查詢主題列表
PageBean<Message> findTopics(int pageNo, int pageSize);
// 查詢貼文詳情(含用戶資訊、遞歸回覆樹)
Message findById(Integer id);
// 軟刪除(狀態標記)
void deleteById(Integer id);
// 統計直接回覆數
int countDirectReplies(Integer topicId);
// 依用戶查詢其發文(分頁)
PageBean<Message> findByUser(Integer userId, int pageNo, int pageSize);
// 關鍵字搜尋主題(分頁)
PageBean<Message> searchTopics(String keyword, int pageNo, int pageSize);
}
public interface UserService {
// 用戶註冊
void register(String username, String password, String email);
// 用戶登入驗證,成功返回 User 物件
User login(String username, String password);
// 依 ID 查詢用戶
User findById(Integer id);
// 依用戶名查詢(唯一性檢查)
User findByUsername(String username);
// 修改密碼
void changePassword(Integer userId, String oldPwd, String newPwd);
// 修改個人資料
void updateProfile(Integer userId, String email);
}
public class PageBean<T> implements Serializable {
private int pageNo; // 當前頁碼 (1-based)
private int pageSize; // 每頁筆數
private long totalCount; // 總筆數
private int totalPage; // 總頁數
private List<T> list; // 當前頁資料
public PageBean(int pageNo, int pageSize, long totalCount, List<T> list) {
this.pageNo = pageNo; this.pageSize = pageSize; this.totalCount = totalCount;
this.totalPage = (int) Math.ceil((double) totalCount / pageSize);
this.list = list;
}
// getter/setter 略
}
null 或空列表,不拋異常;業務違規(如重複用戶名)拋 BusinessException。在 Spring 中:
<bean id="messageService" class="com.example.service.impl.MessageServiceJdbcImpl">
<property name="dataSource" ref="dataSource" />
<property name="userService" ref="userService" />
</bean>
Controller 僅需 @Autowired MessageService messageService; 即可使用,完美解耦。
系列接近尾聲,下一篇將展示發文頁面(JSTL 版),串聯前後端完整流程。