【Java Web编程 五】深入理解Java Bean

简介: 【Java Web编程 五】深入理解Java Bean

从JSP的语法和内置对象的学习中我们了解到,其实JSP一直追求的就是简化代码,尽量发挥自己页面呈现的能力,JSP的设计初衷也是如此,所以在主键学习的过程中我们了解到为了这一目标JSP在进行不断的优化来减少自身页面的逻辑,本篇Blog提到的Java Bean就是为了简化在JSP中重复用到的一些业务对象和业务逻辑而创造的

Java Bean基本概念

JavaBean 是使用 Java 编写的组件,每一个 JavaBean 均实现一个特定的功能。JavaBean 通过对属性和方法的封装,成为具有独立功能、可重复使用并且可与其他控件通信的组件对象,具有以下优点

  • 重用性强,本身就是一个Java类,每次使用时被加载出一个对象,可以多次反复使用
  • 模块化,分离JSP模版元素L和Java代码:让开发某一模块的人员更加专注
  • 处理复杂逻辑,可以进行事务处理,让JSP专注于页面显示

到这为止我们还没有引入Servlet,所以目前能承载Java代码最好的容器就是Java Bean了。

Java Bean的特征

JavaBean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 JavaBean API 规范。接下来给出的是 JavaBean 与其它 Java 类相比而言独一无二的特征:

  1. 提供一个默认的无参构造函数。
  2. 需要被序列化并且实现了 Serializable 接口,这样在将对象存储为文件或网络中传递时将非常便利
  3. 可能包含一系列可读写属性,在 JavaBean 组件中要为所有标识特性的属性提供对应的 get() 方法和 set() 方法,以便为组件用户提供操作和控制组件的接口
  4. 可能包含一系列方法,在JavaBean组件中方法访问级别应该设置为Public

依据以上的定义其实我们发现有两种Java Bean,接下来看看Java Bean的分类。

Java Bean的分类

除了我们上边提到的纯数据的Java Bean以外,其实Java Bean还可以提供一些简单的事务处理,所以我们一般可以把Java Bean分为两类,处理数据的和处理事务的:

封装数据的 JavaBean

封装数据的 JavaBean 通常就是表达一个完整的实体信息,适用于以下两种情况:

  • 在方法中对一个**完整实体VO(值对象)**信息进行传递(可以提高方法的可维护性与可扩展性)
  • 作为某些集合数据中的单个元素实体(集合中存储的实体VO对象信息,代表集合中的单个数据项)

下面给出一个Java Bean的示例,首先创建一个类Person,实现 Serializable 接口,设置几个属性:

然后我们依据IDEA自带的工具生成属性的getter和setter。

这样我们的Java Bean就创建好了:

package com.example.MyFirstJavaWeb.javabean;
import java.io.Serializable;
/**
 * * @Name Person
 * * @Description
 * * @author tianmaolin
 * * @Data 2021/7/16
 */
public class Person implements Serializable {
    private String name="张三";
    private int age=20;
    private String sex="女";
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Person() {
    }
}

封装业务的 JavaBean

封装业务方法的 JavaBean 通常不需要 get()、set() 方法,只要根据业务需求定义相应的业务方法即可,比如针对数据操作的增删改查可以定义对应方法

package com.example.MyFirstJavaWeb.javabean;
import java.util.List;
public class PersonService{
    // 增加 Person
    public boolean add(Person people) {
        return true;
    }
    // 通过 id 更新一个 Person
    public boolean update(Person Person){
        return true;
    }
    // 通过 id 删除一个 Person
    public boolean del(int id) {     
        return true;
    }
    // 根据 id 得到一个 Person
    public Person get(int id){
        return null;
    }
    // 得到所有的 Person
    public List<Person> getAll(){ 
        return null;
    }
}

使用Java Bean

使用Java Bean分为三个步骤,在JSP页面中我们需要声明引用Java Bean类,然后构造Java Bean对象,最后访问Java Bean对象的属性。以下是代码清单:

<%--
  Created by IntelliJ IDEA.
  User: tianmaolin
  Date: 2021/7/16
  Time: 11:21 上午
  To change this template use File | Settings | File Templates.
--%>
<%--导入javabean类--%>
<%@ page import="com.example.MyFirstJavaWeb.javabean.*" pageEncoding="UTF-8" %>
<body>
javabean默认设置:<br>
<%--id表示被实例化的对象名字,class表示类这是javabea声明标签--%>
<jsp:useBean id="person" class="com.example.MyFirstJavaWeb.javabean.Person" scope="request"></jsp:useBean>
<jsp:useBean id="personService" class="com.example.MyFirstJavaWeb.javabean.PersonService" scope="request"></jsp:useBean>
<%-- name就是对象名,property是属性的名字,该语句是属性获取--%>
<jsp:getProperty property="name" name="person"/>
<br>
<jsp:getProperty property="age" name="person"/>
<br>
<jsp:getProperty property="sex" name="person"/>
<br>
<%--name就是对象名,property是属性的名字,value表示要设置的值,该语句是属性设置语句--%>
<jsp:setProperty property="name" name="person" value="田茂林"/>
<br>
javabean获取修改设置:
<jsp:getProperty property="name" name="person"/>
<br>
<br>
<%--PersonService执行--%>
PersonService执行业务逻辑 <%=personService.del(123)%>
<br>
<%--下边的等价脚本段--%>
脚本段默认设置:<br>
<% Person p = new Person();
    p.setAge(20);
    p.setName("张三");
    p.setSex("女");
    out.print(p.getAge() + "<br>");
    out.print(p.getName() + "<br>");
    out.print(p.getSex() + "<br>");
    PersonService pS=new PersonService();
    out.println(pS.del(123));
%>
</body>

返回结果为:

导入Java Bean类

通过page指令实现,将Java Bean类导入到当前JSP内:

<%--导入javabean类--%>
<%@ page import="com.example.MyFirstJavaWeb.javabean.*" pageEncoding="UTF-8" %>

构造Java Bean对象

有两种方式可以使用Java Bean,一种是通过动作标识

<%--id表示被实例化的对象名字,class表示类这是javabea声明标签--%>
<jsp:useBean id="person" class="com.example.MyFirstJavaWeb.javabean.Person" scope="request"></jsp:useBean>
<jsp:useBean id="personService" class="com.example.MyFirstJavaWeb.javabean.PersonService" scope="request"></jsp:useBean>

另一种是通过脚本代码

<% Person p = new Person(); %>

通过动作标识构造的Java Bean对象有个好处就是方便的设定当前bean的存活周期,也就是scope属性,默认是当前page。

同上一篇Blog讲到的一样,这表示了这个被创造出来的对象被放到了哪种作用域里,放到了对应的作用域就能存活对应的范围。

使用Java Bean对象

和构造Java Bean对象一样,也有动作标识和脚本代码两种方式,动作标识方式如下:

<%-- name就是对象名,property是属性的名字,该语句是属性获取--%>
<jsp:getProperty property="name" name="person"/>
<br>
<jsp:getProperty property="age" name="person"/>
<br>
<jsp:getProperty property="sex" name="person"/>
<br>
<%--name就是对象名,property是属性的名字,value表示要设置的值,该语句是属性设置语句--%>
<jsp:setProperty property="name" name="person" value="田茂林"/>
<br>
javabean获取修改设置:
<jsp:getProperty property="name" name="person"/>
<br>
<br>
<%--PersonService执行--%>
PersonService执行业务逻辑 <%=personService.del(123)%>
<br>

脚本标识的方式如下:

<% Person p = new Person();
    p.setAge(20);
    p.setName("张三");
    p.setSex("女");
    out.print(p.getAge() + "<br>");
    out.print(p.getName() + "<br>");
    out.print(p.getSex() + "<br>");
    PersonService pS=new PersonService();
    out.println(pS.del(123));
%>

总体而言使用动作标识会让代码更简介轻快

总结一下

JavaBean 是使用 Java 编写的组件,每一个 JavaBean 实现一个特定的功能,具有重用性强,易维护扩展等特点JavaBean一般需要实现序列化接口,提供无参构造方法,对功能进行getter、setter封装访问,在我看来

  • JavaBean更多的使用就是一个Model,也即我们上文提到的数据Bean,为我们提供可重复展示的VO而已,说白了和我们在JSP的脚本段里new一个对象一样,也可以说成我们自定义创建的为JSP页面提供服务的类
  • JavaBean较少使用业务Bean,虽说Java Bean也可以包含逻辑处理方法,但是其实这部分工作后续也会被拆分为两类,一类是负责的业务逻辑,一类是简单的事务处理,负责业务逻辑会交由Servlet实现,JavaBean的业务Bean会更专注于例如数据的增删改查这类单一的事务逻辑。

到这里MVC我们已经看到了MV,接下来会学习重磅,控制器C,也即Servlet。

相关文章
|
5月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
339 1
|
5月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
248 6
|
5月前
|
安全 前端开发 Java
从反射到方法句柄:深入探索Java动态编程的终极解决方案
从反射到方法句柄,Java 动态编程不断演进。方法句柄以强类型、低开销、易优化的特性,解决反射性能差、类型弱、安全性低等问题,结合 `invokedynamic` 成为支撑 Lambda 与动态语言的终极方案。
247 0
|
6月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
1142 2
|
6月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
548 100
|
6月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
761 0
|
6月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
649 1
|
6月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
483 1
|
6月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
456 16
|
7月前
|
安全 Java Shell
Java模块化编程(JPMS)简介与实践
本文全面解析Java 9模块化系统(JPMS),帮助开发者解决JAR地狱、类路径冲突等常见问题,提升代码的封装性、性能与可维护性。内容涵盖模块化核心概念、module-info语法、模块声明、实战迁移、多模块项目构建、高级特性及最佳实践,同时提供常见问题和面试高频题解析,助你掌握Java模块化编程精髓,打造更健壮的应用。