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

相关文章
|
15天前
|
Kubernetes 负载均衡 Java
k8s的出现解决了java并发编程胡问题了
Kubernetes通过提供自动化管理、资源管理、服务发现和负载均衡、持续交付等功能,有效地解决了Java并发编程中的许多复杂问题。它不仅简化了线程管理和资源共享,还提供了强大的负载均衡和故障恢复机制,确保应用程序在高并发环境下的高效运行和稳定性。通过合理配置和使用Kubernetes,开发者可以显著提高Java应用程序的性能和可靠性。
61 31
|
16天前
|
Java 编译器 开发者
注解的艺术:Java编程的高级定制
注解是Java编程中的高级特性,通过内置注解、自定义注解及注解处理器,可以实现代码的高度定制和扩展。通过理解和掌握注解的使用方法,开发者可以提高代码的可读性、可维护性和开发效率。在实际应用中,注解广泛用于框架开发、代码生成和配置管理等方面,展示了其强大的功能和灵活性。
61 25
|
8天前
|
Java API Docker
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
|
3月前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
25天前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
56 19
|
19天前
|
机器学习/深度学习 开发框架 API
Python 高级编程与实战:深入理解 Web 开发与 API 设计
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧以及数据科学和机器学习。本文将深入探讨 Python 在 Web 开发和 API 设计中的应用,并通过实战项目帮助你掌握这些技术。
|
1月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
80 7
|
18天前
|
Java 开发工具
课时6:Java编程起步
课时6:Java编程起步,主讲人李兴华。课程摘要:介绍Java编程的第一个程序“Hello World”,讲解如何使用记事本或EditPlus编写、保存和编译Java源代码(*.java文件),并解释类定义、主方法(public static void main)及屏幕打印(System.out.println)。强调类名与文件名一致的重要性,以及Java程序的编译和执行过程。通过实例演示,帮助初学者掌握Java编程的基本步骤和常见问题。
|
3月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
101 5
Java 并发编程——volatile 关键字解析
|
2月前
|
Kubernetes Java 持续交付
小团队 CI/CD 实践:无需运维,Java Web应用的自动化部署
本文介绍如何使用GitHub Actions和阿里云Kubernetes(ACK)实现Java Web应用的自动化部署。通过CI/CD流程,开发人员无需手动处理复杂的运维任务,从而提高效率并减少错误。文中详细讲解了Docker与Kubernetes的概念,并演示了从创建Kubernetes集群、配置容器镜像服务到设置GitHub仓库Secrets及编写GitHub Actions工作流的具体步骤。最终实现了代码提交后自动构建、推送镜像并部署到Kubernetes集群的功能。整个过程不仅简化了部署流程,还确保了应用在不同环境中的稳定运行。
112 9

热门文章

最新文章