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