Java Bean基本概念
首先了解软件设计分层概念,在开发软件过程中,应尽量将业务逻辑和表现层分开,从而达到完全解耦。经常使用javabean去实现业务逻辑,而jsp页面去用于表现层。jsp页面只用于接收用户的输入以及显示处理之后的结果,不需要在jsp页面嵌入大量的java代码。
javabean的特性
1.支持反射机制:利用反射机制可以分析出javabean是如何运行的。
2.支持事件:事件是一种简单的通信机制,利用它将相应的信息通知给javabean
3.支持属性:自定义属性,利用标准标签与jsp页面交互数据
4.支持持久性:持久性指可以将javabean进行保存,在需要时重新载入
创建javabean的基本结构
public class test implements Serializable {
private String test_id;
private String test_name;
private double price;
private String info;
public test(){
super();
}
public String getTest_id() {
return test_id;
}
public void setTest_id(String test_id) {
this.test_id = test_id;
}
public String getTest_name() {
return test_name;
}
public void setTest_name(String test_name) {
this.test_name = test_name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
1.JavaBean类必须是public类
2.提供给jsp页面调用的方法,必须赋予public访问权限
3.JavaBean类中属性,提供给jsp页面调用时必须提供public的get和set方法
4.必须拥有不带参数构造方法
JSP中使用JavaBean
首先注意:
1.要按照规范定义Bean类,并给出类属性的相应get和set方法
2.在页面中要导入相应的Bean类
3.在JSP页面中利用jsp:useBean标签使用bean类
对于Bean的Class文件部署在Web服务器的工共目录中;
属性值 | 说明 |
id | Bean的变量名,可以在指定的范围中使用该变量名 |
class | Bean的类路径 |
scope | Bean的有效范围,取值page,request,session,application |
beanName | 实例化的类名称或序列化模板的名称,指定的名称可以为其接口,父类 |
type | 指定其父类或接口模型,例如想实例化HsahMap,但是type可以填为Map |
在使用jsp:useBean标签注意
1.class或beanName不能同时存在;若javaBean对象已经存在,class和beanName属性可以不指定,只需指定type属性
2.class可省去type独立使用,但beanName必须和type一起使用
3.class指定的类必须包含public,无参的构造方法。
4.class或beanName指定的类必须包括包含名称,而type可以 省去包名,通过<%@page import = " "%>指定所属包
class通过new创建javaBean对象,beanName由java.beans.Beans.instantiate初始化JavaBean对象
jsp:useBean标签中Bean的作用域四个:page,request,session,application。 jsp引擎会根据作用域给用户分配不同的Bean,运行多个用户拥有相同的Bean,每个客户的Bean是相互独立的。
1.request:针对同一个用户的不同请求,给用户分配不同的Bean对象
Bean的生命周期就是从客户请求开始到响应结束这段时间。
2.page:针对不同的页面,给用户分配不同的Bean对象,客户进入当前页面是会分配一个对象,当用户离开当前页面时,取消分配的Bean对象。Bean生命周期就位于当前页
3.session:针对同一用户访问同一web项目下的不同页面时,会分配给用户不同的Bean对象。当用户离开Web目录时,取消分配的Bean对象,该Bean的生命周期是Web项目的一个session时间
4.application:为访问用户分配同一个Bean对象,生命周期就是Web应用的存在时间,Web应用的服务器中存在的时间。
访问Bean属性
标签:
jsp:setProperty使用该标签可以设置Bean的属性值
1.使用字符串或表达式给Bean属性赋值,表达式的值与Bean属性的值类型相同
2.使用表单参数形式给Bean属性赋值,表单中提供的参数名字与Bean属性的名字相同。
3.使用表单参数值给Bean赋值,要求表单中提供的参数名字必须与jsp:setProperty标签中的param属性值名字相同。
jsp:getProperty使用该标签用来获得Bean属性
Bean的作用域
1.演示Bean的request生命周期
//Bean类
public class circle implements Serializable {
private double radius = 1.0d;
private double circleArea = 0.0d;//面积
private double circum = 0.0d;//周长
public circle(){
super();
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getCircleArea() {
circleArea = Math.PI*radius*radius;
return circleArea;
}
public void setCircleArea(double circleArea) {
this.circleArea = circleArea;
}
public double getCircum() {
circum = 2*Math.PI*radius;
return circum;
}
public void setCircum(double circum) {
this.circum = circum;
}
}
//request.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*,until9javabean.circle" %>
<!--导入bean-->
<jsp:useBean id="circle" class="until9javabean.circle" scope="request"/>
<html>
<head>
<title>Bean的request生命周期</title>
<!--1.对于Bean的request生命周期对于每次的请求,在页面上显示的bean对象名不一样
2.对于提交的内容进行请求,若为空则设置为1
-->
</head>
<%
String radius = request.getParameter("radius");
if (radius==null||radius.equals("")){
radius = "1";
}
double rad = Double.parseDouble(radius);
circle.setRadius(rad);
%>
<body>
<form action="" method="post">
输入圆的半径:<input type="text" name="radius"/><br/>
<input type="submit" name="提交"><br/>
该Bean的对象为<%=circle.toString()%><br/>
圆的半径:<jsp:getProperty name="circle" property="radius"/><br/>
圆的周长:<jsp:getProperty name="circle" property="circum"/><br/>
圆的面积:<jsp:getProperty name="circle" property="circleArea"/>
</form>
</body>
</html>
2.Bean的page生命周期
Bean类相同
//page_scope.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" import="until9javabean.circle,java.util.*" %>
<jsp:useBean id="circle" class="until9javabean.circle" scope="page"/>
<!--
1.该页面进行半径设置并观察该页面的bean对象
2.使用跳转到下一个页面,观察下一个页面的bean对象的值和半径有所不同
-->
<html>
<head>
<title>Bean的page生命周期</title>
</head>
<body>
该Bean类对象:<%=circle.toString()%><br/>
设置该Bean的半径为20:
<%
circle.setRadius(20);
%>
圆的半径:<jsp:getProperty name="circle" property="radius"/><br/>
圆的周长:<jsp:getProperty name="circle" property="circum"/><br/>
圆的面积:<jsp:getProperty name="circle" property="circleArea"/><br>
<form action="page_scope1.jsp" method="post">
<input type="submit" name="跳转">
</form>
</body>
</html>
//page_scope1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" import="until9javabean.circle,java.util.*" %>
<jsp:useBean id="circle" class="until9javabean.circle" scope="page"/>
<html>
<head>
<title>bean的page生命周期</title>
</head>
<body>
该Bean类对象:<%=circle.toString()%><br/>
圆的半径:<jsp:getProperty name="circle" property="radius"/><br/>
圆的周长:<jsp:getProperty name="circle" property="circum"/><br/>
圆的面积:<jsp:getProperty name="circle" property="circleArea"/><br>
</body>
</html>
3.Bean的session生命周期与page生命周期相同,只需要将scope改为session。显示效果就是,同一个用户情况下是,是引用的是同一个Bean对象,所以两次跳转的属性值,也是相同的。
4.Bean的application生命周期对于显示效果就是,先获取系统默认的数据,刷新一次之后数值变换,但是对象没有改变,说明引用的是同一个对象