?

Java Web項目之JavaBean應用

2023-05-29 09:23段莎莉
電子技術與軟件工程 2023年7期
關鍵詞:調用頁面實體

段莎莉

(山西國際商務職業學院 山西省太原市 030031)

JavaWeb 開發在BS 架構軟件開發中占據著重要位置,常見的電商、政務、教學平臺網站基本上都是JavaWeb 項目。它以Java 程序設計語言為開發語言,無論開發技術Servlet 還是運行所需的服務器tomcat 都是java 開發的,java 跨平臺、易擴展的特性和更新速度較快的JavaEE 框架技術都是它的開發優勢,項目開發中的實體和實體關系是借助JavaBean 完成數據封裝轉換、傳遞和操作的。

1 JavaBean概述

JavaBean 是一個可重復用的軟件組件[1],是java 封裝特性的體現,JavaWeb 項目中通常會把需求分析中處理的實體、實體關系(如用戶、圖書、借閱等)和實體操作(如與實體對應的業務邏輯)定義為JavaBean 形式,有狹義和廣義之分。

狹義JavaBean 需滿足特定語法規則:公有類、無參構造方法、私有屬性和公有設置、讀取屬性的setter()和getter()方法。一般將實體和實體關系定義為狹義的JavaBean,是為了在JavaWeb 項目的JSP 頁面中進行交互。

廣義的JavaBean 就是一個Java 類,沒有特殊要求,是為了封裝單一功能的業務邏輯代碼,方便模塊功能修改、擴充及重復使用,實現了在Java Web 項目開發中典型業務邏輯(JavaBean組件)與界面框架表現形式(JSP頁面)的分離[2]。如數據庫操作、用戶注冊、登陸、修改信息和查詢業務類UserService,圖書借閱和歸還業務類SBService 等。

將功能不同的JavaBean 合理地組織在一起,便于快速生成一個全新的項目。

2 JavaBean在Java Web項目開發中的應用分析

MVC 模式將整個項目劃分為模型層Model、視圖層View 和控制器層Controller,它們各司其職,當項目功能需要擴展或調整時,由于層與層之間只是調用關系,而不是包含關系,故只需在本層中更改代碼,其它層不受影響,這樣利于分工開發、組件重用和功能擴展。

JavaBean 在基于MVC 設計模式JavaWeb 開發模型JSPModel2 擔任Model 角色,下面以用戶注冊、登陸為例說明其應用場景(如圖1 所示)。

圖1:MVC 模式下業務邏輯JavaBean 被復用示意圖

2.1 封裝實體對象的JavaBean

封裝實體對象的狹義JavaBean 在定義時應注意私有屬性名、JSP 頁面表單項名和數據庫用戶表中的字段名完全一致,這樣便于添加數據時用 Apache Commons的BeanUtils[3]工具類快捷地將用戶填寫的表單數據一一映射User 類的對象,同時也便于將User 對象整體或調用User 對象的getxxx()方法獲得屬性值傳遞給控制器層、業務邏輯層和數據訪問層,作為數據庫表記錄增、刪、改、查的依據。

在用戶注冊登陸案例中,用戶類被定義為狹義JavaBean 的User 類,代碼如圖2 所示。

圖2:User 類

定義好JavaBean 后用BeanUtils.copyProperties(user,request.getParameterMap());將用戶在瀏覽器中填寫的數據被封裝在User 對象中,調用User 類和toString()方法輸出其信息驗證如下:User [id=0, username=dsa_239,email=dsa_239@163.com, password=root, name=sxibs,phone=13903511234, address=山西太原, isadmin=false,isvalidate=false]。

BeanUtils 工具拷貝屬性時已封裝了類型轉換器,方便快捷。此外,如果想支持中文信息被正確獲取,使用Servlet 規范中的過慮器指定編碼[4],在doFilter()方法中將request 對象解碼碼表設置為utf-8,并設置過濾路徑為整個項目有效,即可解決所有頁面的中文亂碼。

2.2 封裝數據庫操作的工具類

一個JavaWeb 項目的各個模塊基本都需要通過JDBC 與數據庫連接并操作其中的記錄,如:讀取數據庫表中的記錄展示在JSP 頁面中、在JSP 頁面通過表單向數據庫表中添加、修改和刪除記錄等。當一個功能有被多個模塊重復調用的需求時,即可將其定義為JavaBean。

JavaWeb 項目會被多個用戶同時訪問,同一個用戶會在一個會話中訪問不同的模塊,就會頻繁地創建和斷開數據庫連接,有可能造成響應不及時,影響用戶使用體驗。實際開發中會用數據庫連接池技術來改善這種I/O 消耗,如采用默認配置的C3P0 數據庫連接池,將其定義為廣義的JavaBean,代碼如下所示:

數據源雖然改善了I/O 消耗,但是操作依然像JDBC 一樣繁瑣,故Apache 組織提供了DBUtils 工具對JDBC 功能進行封裝后簡化數據庫操作。用實現了DataSource 接口的C3P0 數據源為參數構造核心類QueryRunner 對象r,r 與核心接口ResultSetHandle 配合起來使得不熟悉JDBC 操作的程序員僅通過(String sql,ResultSetHandle rsh,Object...params) 即sql 語句、封裝操作結果的結果集ResultSetHandler(如:行對象BeanHandler、列對象ScalarHandle 和對象集合BeanListHandler)及與sql 語句對應的條件可變參數三項就可以操作數據庫。

在此基礎上我們再自定義一個更加便捷的工具類ObjectUtil,操作某個實體類對應的數據庫時就調用ObjectUtil userUtil = new ObjectUtil();生成對應實體的工具類,進一步簡化操作,即不用考慮操作結果類型,只需傳入sql 語句、實體類.class 和可變參數來操作數據庫,這是廣義的JavaBean。

2.3 封裝業務邏輯的JavaBean

與實體相關的業務操作被定義為一個獨立的類,是可重用組件,屬于廣義JavaBean 的范疇,它不需要遵守嚴格的定義語法,一般命名為xxxService。例如:UserService 包括用戶注冊、登陸、按id 號查找用戶、修改用戶密碼和地址、刪除用戶、分頁顯示用戶記錄等功能。獨立定義后,可以被UserRegisterServlet、UserLoginServlet、UserChangePwdServlet、UserLogout Servlet 和AdminUserListServlet 等不同的控制器根據自身所需功能調用所需方法,實現了UserService 的代碼復用。

負責業務邏輯的UserService并不直接操作數據庫,它會調用UserDao 完成數據庫記錄的CRUD 操作,是為了降低各層之間的耦合,為項目功能擴展留下空間。

2.4 用戶操作案例

MVC 模式下,控制器將前端頁面和業務邏輯分離開,降低耦合度,便于功能擴展。數據從表單視圖流向控制器,控制器接收前端傳遞的數據選擇業務邏輯層方法處理業務,業務處理本質是調用數據訪問層的方法CRUD 操作之后將結果逆向逐級返回控制器層,由它根據處理結果選擇合適的頁面展示。

用戶注冊登陸案例中,廣義JavaBean——UserService被注冊、登陸等控制器多次調用,其中傳遞的數據是狹義JavaBean——User 類,分層開發,代碼復用,提高效率,如下所示。

2.4.1 用戶注冊

控制器UserRegisterServlet 調用業務邏輯User Service.register(User u)完成用戶注冊,而register()則是通過調用UserDao.isUsernameExist() 和UserDao.isEmailExist()來判斷用戶名或郵箱是否與數據庫表中記錄有重復,有則注冊失敗,沒有則注冊成功;

2.4.2 用戶登陸

控制器UserLoginServlet 調用業務邏輯UserService.login(User u)完成用戶登陸,而login()則是通過uDao.selectByUsernamePassword() 和uDao.selectByEmail Password()來判斷用戶名密碼或郵箱密碼能否從數據庫表中查找到,找到則登陸成功,否則登陸失敗,成功時還會把User 對象寫入Session 域對象中,便于在個人中心頁展示及后續的修改操作,無論是前端傳遞的數據還是服務器端傳回來的結果都被封裝在狹義JavaBean——User 對象中,由于嚴格的定義語法使得它以整體或局部傳遞都很方便,復用無處不在。

2.4.3 刪除用戶

控制器AdminUserDeleteServlet 調用業務邏輯User Service.delete(User u)完成用戶刪除,而delete()則是通過調用UserDao.delete(),如果用戶有其它相關記錄時則給出刪除不成功的提示,否則給出刪除成功的提示,將提示寫入session 域對象中,繼而請求派發到用戶列表頁分頁展示。

2.4.4 修改用戶信息

分兩步完成,首先控制器AdminUserEditshowServlet調用業務邏輯UserService.selectById(id)從用戶表查找id 對應的對象并寫入Session 域對象后,跳轉到JSP 頁面用表單展示具體的用戶信息;然后當輸入新信息后提交給控制器AdminUserEditServlet,由它調用UserService.updateUserInfo(User u),而updateUserInfo()則是調用UserDao.update()更新用戶表中的記錄,繼而請求派發到用戶列表頁分頁展示。

2.4.5 分頁展示用戶記錄

當用戶登陸、刪除和修改成功后都會跳轉到用戶列表頁,由控制器AdminUserListServlet 調用業務邏輯UserService.getUserPage(int pageNumber) 方法, 其實是調用UserDao.selectUserList(pageNumber,pageSize)用limit 關鍵字在數據庫中查詢指定頁面用戶記錄組成的List寫入session 域對象中,JSP 頁面通過標簽循環輸出集合中的元素及其屬性。

在上述案例中,雖然javabean 技術較好地封裝實體及其操作邏輯,提高了代碼的復用率和可擴展性,但是控制器層調用業務邏輯層時,先創建業務邏輯層的對象再通過對象調用該層相應的方法完成業務操作,這樣使得各層之間保持著較高的耦合度,不符合“低耦合、高內聚”的開發原則,怎么來消除這種對象相互嵌套相互依賴的關系了?

3 JavaBean在Spring框架中的應用

在JavaWeb 主流開發框架Spring 中,通過控制反轉和依賴注入機制把所有對象的創建和依賴關系的維護工作都交給Spring 容器管理。

xml 配置文件中的監聽器ContextLoaderListener 監聽到項目被加載后由Web 服務器實例化Spring 容器,由該容器完成所有對象的創建和依賴關系的維護。當控制器層需引入業務邏輯層對象作為屬性時,只需定義,然后用@Autowired 注解配合掃描所有Bean 文件所在包的方式取代new 構造方法()的完成Bean 的裝配,從而獲得業務邏輯層的實例對象,即借助容器完成二者關系的維護,大大降低了模塊之間的耦合度。

當控制器層從容器中獲取了業務邏輯層的對象后,對廣義JavaBean——Userservice 層的代碼復用思路和在JSPModel2 是一樣的。

Spring 總是盡全力的讓溝通的雙方信息暢通,當它管理好的模塊之間信息溝通的對象時,就使得程序員專注于業務的實現,提高項目開發效率。

4 結論

從JavaWeb 最初開發模型到現下主流的技術框架一直穿梭著JavaBean 的身影,JavaBean 很好地在JavaWeb項目的視圖層、控制器層、業務邏輯層和數據訪問層之間流動傳遞,本著功能可復用的初心,將越來越多的模塊視為JavaBean,并通過第三方容器來協調對象之間的關系,可見JavaBean 在JavaWeb 項目開發中發揮著重要作用。

猜你喜歡
調用頁面實體
刷新生活的頁面
核電項目物項調用管理的應用研究
前海自貿區:金融服務實體
LabWindows/CVI下基于ActiveX技術的Excel調用
實體的可感部分與實體——兼論亞里士多德分析實體的兩種模式
兩會進行時:緊扣實體經濟“釘釘子”
振興實體經濟地方如何“釘釘子”
基于系統調用的惡意軟件檢測技術研究
利用RFC技術實現SAP系統接口通信
網站結構在SEO中的研究與應用
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合