从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 类相比而言独一无二的特征:
- 提供一个默认的无参构造函数。
- 需要被序列化并且实现了 Serializable 接口,这样在将对象存储为文件或网络中传递时将非常便利
- 可能包含一系列可读写属性,在 JavaBean 组件中要为所有标识特性的属性提供对应的 get() 方法和 set() 方法,以便为组件用户提供操作和控制组件的接口
- 可能包含一系列方法,在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。