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中的研究与应用