【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。

相关文章
|
1天前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第12天】 在现代软件开发中,多线程编程是提升应用程序性能和响应能力的关键手段之一。特别是在Java语言中,由于其内置的跨平台线程支持,开发者可以轻松地创建和管理线程。然而,随之而来的并发问题也不容小觑。本文将探讨Java并发编程的核心概念,包括线程安全策略、锁机制以及性能优化技巧。通过实例分析与性能比较,我们旨在为读者提供一套既确保线程安全又兼顾性能的编程指导。
|
2天前
|
安全 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第11天】在Java并发编程中,线程安全和性能优化是两个重要的主题。本文将深入探讨这两个方面,包括线程安全的基本概念,如何实现线程安全,以及如何在保证线程安全的同时进行性能优化。我们将通过实例和代码片段来说明这些概念和技术。
3 0
|
2天前
|
Java 调度
Java并发编程:深入理解线程池
【5月更文挑战第11天】本文将深入探讨Java中的线程池,包括其基本概念、工作原理以及如何使用。我们将通过实例来解释线程池的优点,如提高性能和资源利用率,以及如何避免常见的并发问题。我们还将讨论Java中线程池的实现,包括Executor框架和ThreadPoolExecutor类,并展示如何创建和管理线程池。最后,我们将讨论线程池的一些高级特性,如任务调度、线程优先级和异常处理。
|
3天前
|
缓存 Java 数据库
Java并发编程学习11-任务执行演示
【5月更文挑战第4天】本篇将结合任务执行和 Executor 框架的基础知识,演示一些不同版本的任务执行Demo,并且每个版本都实现了不同程度的并发性。
24 4
Java并发编程学习11-任务执行演示
|
4天前
|
存储 安全 Java
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
|
4天前
|
缓存 Java 程序员
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
|
4天前
|
缓存 Java 数据库
Java并发编程中的锁优化策略
【5月更文挑战第9天】 在高负载的多线程应用中,Java并发编程的高效性至关重要。本文将探讨几种常见的锁优化技术,旨在提高Java应用程序在并发环境下的性能。我们将从基本的synchronized关键字开始,逐步深入到更高效的Lock接口实现,以及Java 6引入的java.util.concurrent包中的高级工具类。文中还会介绍读写锁(ReadWriteLock)的概念和实现原理,并通过对比分析各自的优势和适用场景,为开发者提供实用的锁优化策略。
6 0
|
5天前
|
JavaScript 小程序 Java
基于java的少儿编程网上报名系统
基于java的少儿编程网上报名系统
11 2
|
5天前
|
存储 安全 算法
掌握Java并发编程:Lock、Condition与并发集合
掌握Java并发编程:Lock、Condition与并发集合
11 0
|
5天前
|
前端开发 JavaScript Java
Java与Web开发的结合:JSP与Servlet
Java与Web开发的结合:JSP与Servlet
8 0