0x01 JavaBean

  • JavaBean是什么,它能干什么?
  • JavaBean是Java语言开发的一个可以重复使用的组件。在使用表达式<%=%>小脚本<%%>声明<%!%>的时候,我们常把这些程序代码和我们的静态内容html混在一起,这样对项目和日后维护带来了很大的困难和任务的复杂性。JavaBean的好处是可以将HTML和Java代码分离减少重复的代码量,让代码看起来更简洁一些。
  • JavaBean的使用要求:
  • JavaBean虽然有自己的很大优势,但也不是无条件的,就好比天上不会掉馅饼(楼上扔的除外哈。。。),JavaBean的使用也是有前提条件的。条件有哪些呢?
  1. 所有的类必须放在一个包中;
  2. 所有的类必须声明为public class,因为类声明为public后,才可以被其他外部类所访问,这点很重要哈。。。
  3. 类中所有的属性都必须使用private关键字进行封装;
  4. 使用private封装的属性如果需要被外部类使用的话,则必须编写与属性相对应的setter,和getter方法,不然外部类是无法操作的;
  5. 类中必须包含有一个无参的构造方法,这个对象实例化(new对象)了以后,默认会有的(由Java虚拟机自动生成一个无参的构造方法)。当然你如果类中有一个构造方法的话,就需要自己编写一个无参的不干事的构造方法了,至于啥是构造方法,我就不多逼逼了,程序员都知道。。。
  • 简单JavaBean代码
package com.bean.demo;

public class Person {

    private Integer age;    // 年龄

    private String name;    // 名字

    private String address; // 地址

    public Integer getAge() {

        return age;

    }

    public void setAge(Integer age) {

        this.age = age;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getAddress() {

        return address;

    }

    public void setAddress(String address) {

        this.address = address;

    }

}
  • JavaBean的使用
  • 使用小脚本、表达式实现属性的设置和输出
<!-- 表达式 小脚本实现 -->

<%

    Person person = new Person();   // 类实例化

    person.setName("张三");           // 使用set方法给属性设置

    person.setAge(20);

    person.setAddress("中国光谷");

%>

<h3>姓名:<%=person.getName() %></h3>  <!-- 使用表达式调用get方法获取set方法设置的属性值 -->

<h3>年龄:<%=person.getAge() %></h3>

<h3>地址:<%=person.getAddress() %></h3>
  • 使用指令完成(语法如下)

  • 主要属性如下:
  • id:表示实例化对象的名称
  • scope:表示此对象保存的范围(page,request,session,application)
  • class:对象所对应的包.类名称
  • 代码实现如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<jsp:useBean id="person" scope="page" class="com.bean.demo.Person"></jsp:useBean>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>JavaBeanDemo</title>

</head>

<body>

<!-- 小脚本 表达式实现 -->

<%

    person.setName("张三");           // 使用set方法给属性设置

    person.setAge(20);

    person.setAddress("中国光谷");

%>

<h3>姓名:<%=person.getName() %></h3>   <!-- 使用表达式调用get方法获取set方法设置的属性值 -->

<h3>年龄:<%=person.getAge() %></h3>

<h3>地址:<%=person.getAddress() %></h3>

</body>

</html>
  • JavaBean获取表单
  • 使用小脚本表达式实现获取表单属性
<body>

<form action="JavaBeanform2.jsp" method="post">

<table>

    <tr><th colspan="2" align="center">JavaBean表单</th></tr>

    <tr>

        <td>姓名:</td>

        <td><input type="text" name="name"/></td>

    </tr>

    <tr>

        <td>年龄:</td>

        <td><input type="text" name="age"></td>

    </tr>

    <tr>

        <td>地址:</td>

        <td><input type="text" name="address"/></td>

    </tr>

    <tr>

        <td colspan="2" align="center">

            <input type="submit" value="提交"/>

            <input type="reset" value="重置">

        </td>

    </tr>

</table>

</form>

</body>
<body>

<!-- 小脚本 表达式实现 -->

<%

    request.setCharacterEncoding("utf-8");

    Person person = new Person();   // 声明并实例化person对象

    // 使用set方法设置属性,使用request.getParemeter()方法获取表单传过来的属性

    person.setName(request.getParameter("name"));   // 获取姓名

    person.setAge(Integer.parseInt(request.getParameter("age")));   // 获取年龄 

    person.setAddress(request.getParameter("address")); // 获取地址

%>

<h3>姓名:<%=person.getName() %></h3>   <!-- 使用表达式调用get方法获取set方法设置的属性值 -->

<h3>年龄:<%=person.getAge() %></h3>

<h3>地址:<%=person.getAddress() %></h3>

</body>
  • 使用和获取所有的属性操作
<body>

<!-- jsp标签实现 -->

<% 

    request.setCharacterEncoding("utf-8");  // 设置request编码,避免表单输入为中文时,产生的乱码问题 

%>

<jsp:useBean id="person" scope="page" class="com.bean.demo.Person"></jsp:useBean>

<jsp:setProperty name="person" property="*"/>

<h3>姓名:<%=person.getName() %></h3>   <!-- 使用表达式调用get方法获取属性值 -->

<h3>年龄:<%=person.getAge() %></h3>

<h3>地址:<%=person.getAddress() %></h3>

</body>
  • <jsp:setProperty>:表示操作指定JavaBean中的属性。
  • name:表示的是ID中定义的值;
  • property:表示的是设置里面的属性内容,*号表示自动匹配;
  • JavaBean的实现原理
  • 在编写Java类的时候,类中的属性必须使用private封装,封装后的属性按照Java封装的使用规则,必须编写对应的setter、getter方法。在使用jsp标签的时候,最终调用的是setter和getter方法。而setter和getter方法有严格的命名要求,所以在参数名称必须要与属性名称一致,不然就无法完成设置。这种原理用的是Java的反射机制
  • 为了验证我们上面的理论,我们修改一下Java类,以验证我们的结论
package com.bean.demo;

public class Person {

    private Integer age;    // 年龄

    private String name;    // 名字

    private String address; // 地址

    public Integer getAge() {

        System.out.println("=====获取年龄的方法=====");

        return age;

    }

    public void setAge(Integer age) {

        System.out.println("=====设置年龄的方法=====");

        this.age = age;

    }

    public String getName() {

        System.out.println("=====获取姓名的方法=====");

        return name;

    }

    public void setName(String name) {

        System.out.println("=====设置姓名的方法=====");

        this.name = name;

    }

    public String getAddress() {

        System.out.println("=====获取地址的方法=====");

        return address;

    }

    public void setAddress(String address) {

        System.out.println("=====设置地址的方法=====");

        this.address = address;

    }

}

下面我们再次重新启动tomcat服务器,提交表单,看看控制台的输出内容,jsp代码不变

  • JavaBean的设置属性标签,这个标签会自动调用类中的setter()方法,进行属性设置
  • 设置属性的四种使用方法:
  • 自动匹配(推荐使用,比较方便):
<jsp:setProperty name="person" property="*"/>
  • 指定属性:
<jsp:setProperty property="name" name="person"/>    <%-- 给person对象的name属性设置 --%>

<jsp:setProperty property="address" name="person"/> <%-- 给person对象的address属性设置 --%>
  • 指定参数:
<jsp:setProperty property="address" name="person" param="name"/>    <%-- 把name的属性值赋给address --%>

<jsp:setProperty property="name" name="person" param="address"/>    <%-- 把address的属性赋给name --%>
  • 指定内容:
<jsp:setProperty property="name" name="person" value="杨钊"/> <%-- 给person对象的name属性设置指定内容 内容为value属性 --%>

<jsp:setProperty property="address" name="person" value="湖北武汉"/>    <%-- 给person对象的address属性设置指定内容,内容为value值 --%>

<jsp:setProperty property="age" name="person" value="19"/>  <%-- 给person对象的age属性设置指定内容,内容为value值 --%>
  • 获取数据标签,这个标签是自动调用getter()方法:
  • <jsp:getProperty name=”实例化对象的名称” property=”属性名称”>
<h3>姓名:<jsp:getProperty property="name" name="person"/></h3>    <%-- 获取person对象中的name属性 --%>

<h3>年龄:<jsp:getProperty property="age" name="person"/></h3> <%-- 获取person对象的age属性 --%>

<h3>地址:<jsp:getProperty property="address" name="person"/></h3> <%-- 获取person对象中的address属性 --%>
  • JavaBean的四种范围
  • 的标签指令上存在了一个scope属性,表示这个标签指令的保存范围,保存范围有如下四种:
  • page:保存当前页面对象之中,其他页面JavaBean失效;
  • request:保存在一次request服务器请求跳转范围之中;
  • session*:属性设置成功后,保存在用户的一次会话中(从用户访问服务器站点的一个页面,到用户关闭所有与服务器站点相关联的所有页面,或者关闭客户端(浏览器)的这一个过程,称之为一个会话),当用户重新打开一个浏览器的时候,服务器会认为有一个新的会话进行连接(也会声明新的JavaBean)。
  • application:设置成功后,会在整个服务器应用程序中生效,除非服务器重启或关闭,不然一直有效。

(由于有些内容需要视频演示讲解才能更好的说明问题的形成性,所以在此不贴出相应的代码片段了,这个问题会尽快解决,也谢谢大家对本博客的支持)

在此找到了一篇关于此内容讲解不错的,希望对大家的理解有所帮助,更多请点击我

  • JavaBean的删除操作
  • JavaBean虽然使用了标签进行创建,但是其操作依靠的仍然是四种属性范围(page、request、session、application),如果一个JavaBean不再使用的话,可以使用removeAttribute()方法进行删除操作。
  • page范围:pageContext.removeAttribute(JavaBean名称);
<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>JavaBean获取表单</title>

</head>

<body>

<!-- jsp标签实现 -->

<% 

    request.setCharacterEncoding("utf-8");  // 设置request编码,避免表单输入为中文时,产生的乱码问题 

%>

<jsp:useBean id="person" scope="page" class="com.bean.demo.Person"></jsp:useBean>

<jsp:setProperty property="*" name="person"/>

<h3>姓名:<jsp:getProperty property="name" name="person"/></h3>    <%-- 获取person对象中的name属性 --%>

<h3>年龄:<jsp:getProperty property="age" name="person"/></h3> <%-- 获取person对象的age属性 --%>

<h3>地址:<jsp:getProperty property="address" name="person"/></h3> <%-- 获取person对象中的address属性 --%>

<%

    pageContext.removeAttribute("person");

%>

</body>

</html>
  • request:request.removeAttribute(JavaBean名称);
  • session:session.removeAttribute(JavaBean名称);
  • application:application.removeAttribute(JavaBean名称);

(其他属性范围操作都是相同的,以此类推,所以不再阐述)

总结:JavaBean的删除依然使用了四种属性范围中提供的删除范围,所以实际上JavaBean就相当于是一个保存在指定范围中的属性