目 录

  • 概述
  • 编写JavaBean
  • 保存bean的字节码
  • 创建与使用bean
  • 使用bean
  • bean的加载原理
  • bean的有效范围(生命周期)
  • 获取和修改beans的属性
  • getProperty动作标记
  • setProperty动作标记
  • beans的辅助类



概述

Javabean是一种Java类
通过封装属性和方法成为具有某种功能或者处理某个业务的对象简称bean

具有以下特点:

  1. 可以实现代码的重复利用。
  2. 易编写、易维护、易使用。
  3. 可以在任何安装了Java运行环境的平台上的使用,而不需要重新编译。

JSP页面可以将数据的处理过程指派给一个或几个bean来完成,即JSP页面调用bean完成数据的处理,并将有关处理结果存放bean中.JSP页面可以使用Java程序片或某些JSP指令标记显示bean中的数据,

JSP页面的主要工作是显示数据,不负责数据的逻辑业务处理



Javabean分为可视组件非可视组件

在JSP中主要使用非可视组件。对于非可视组件,我们不必去设计它的外观,主要关心它的属性和方法。

编写Javabean就是编写一个Java的类,所以只要会写类就能编写一个Javabean,这个类创建的一个对象称为一个Javabean,简称bean

编写JavaBean

为了能让使用这个bean的应用程序构建工具(比如JSP引擎)知道这个bean的属性和方法,只需在类的方法命名上遵守以下规则:

  1. 如果类的成员变量的名字是xxx,类中提供两个方法:
    getXxx(),用来获取属性xxx。
    setXxx(),用来修改属性xxx.。
    后缀是将成员变量名字的首字母大写的字符序列。
  2. 对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用“is”代替上面的“get”和“set”。
  3. 类中声明的方法的访问属性都必须是public的
  4. 类中需提供public、无参数的构造方法


javabean与pojo的区别 javabean和jsp的区别_jsp

package tom.jiafei;
public class Circle {
    double radius;
    public Circle() {
       radius=1;
    }
    public double getRadius() {
       return radius;
    }
    public void setRadius(double newRadius) {
       radius=newRadius;
    }
    public double circleArea() {
       return Math.PI*radius*radius;
    }
    public double circlLength() {
       return 2.0*Math.PI*radius;
    }
}

保存bean的字节码

在当前Web服务目录下建立子目录结构:\WEB-INF\classes,然后根据类的包名,在classes下再建立相应的子目录,比如类的包名为tom.jiafei,那么在classes下建立子目录结构:tom\jiafei

将创建bean的字节码文件,比如Circle.class,复制到“\WEB-INF\classes\tom\jiafei”中

javabean与pojo的区别 javabean和jsp的区别_j2ee_02

创建与使用bean

使用bean

使用JSP动作标记:useBean
加载使用Bean
语法格式:
<jsp:useBean id="bean的名字" class="创建beans的字节码" scope="bean有效范围"/> 或者

<jsp:useBean id= "bean的名字" class="创建beans的类" scope= "bean有效范围">
...
...
</jsp:useBean>

例如:
<jsp:useBean id="circle" class="tom.jiafei.Circle" scope="page" />

bean的加载原理

当JSP页面使用JSP需要使用一个bean时,JSP引擎将首先根据JSP动作标记给出的bean的id,以及scope,查找JSP引擎内置pageContent对象中是否含有这样的bean,如果这样的bean存在,JSP引擎就分配这样的bean给用户。

如果在pageContent中没有查找到JSP动作标记要求的bean,就根据class指定的字节码创建一个JSP动作标记要求的bean,并将所创建的bean添加到pageContent内置对象中。

bean的有效范围(生命周期)

scope取值范围给出了bean的存活时间(生命周期),即scope取值决定了JSP引擎分配给用户的bean的存活时间

  • page
    有效范围是当前页面.不同用户的scope取值是page的bean也是互不相同的.
  • request
    bean的有效范围是request期间。不同用户的scope取值是request的bean也是互不相同的
  • session
    有效范围是用户的session(会话)期间。不同用户(即不同浏览器)的scope取值是session的bean是互不相同的(占有不同的内存空间)
  • application
    bean的有效范围是application期间。JSP引擎为Web服务目录下所有的JSP页面分配一个共享的bean,不同用户的scope取值是application的bean也都是相同的一个.

举例

例子1中,负责创建bean的类是上述的Circle类,创建的bean的名字是circle, circle的scope取值是page。example4_1.jsp的效果如图4.3所示。

<%@ page contentType="text/html;charset=GB2312" %>
<HTML><body bgcolor=cyan><font size=3>
   <jsp:useBean id="circle" class="tom.jiafei.Circle" scope="page" />
   <%--通过上述JSP标记,用户获得了一个作用域是page,名字是circle的bean --%>
   <P>圆的初始半径是:<%=circle.getRadius()%>
   <% double newRadius =100;  
      circle.setRadius(newRadius);   //修改半径
   %>
   <P>修改半径为<%= newRadius %>
   <br><b>目前圆的半径是:<%=circle.getRadius()%>
   <br><b>圆的周长是:<%=circle.circlLength()%>
   <br><b>圆的面积是:<%=circle.circleArea()%>
</font></body></HTML>

javabean与pojo的区别 javabean和jsp的区别_jsp_03


例子2使用scope取值为session,id为girl的bean,创建该bean的类文件仍然是上述的Circle.class。

例子2的example4_2_a.jsp页面中,girl的半径radius的值是1(图4.4).

然后连接到example4_2_b.jsp页面,显示半径radius的值,然后将girl的半径radius的值更改为99(图4.5),那么以后再刷新example4_2_a.jsp或example4_2_b.jsp时看到的bean的radius的值就都是99了(图4.6)

example4_2_a.jsp

<%@ page contentType="text/html;charset=GB2312" %>
<HTML><body bgcolor=cyan><font size=3>
   <%--通过JSP标记,用户获得一个作用域是session,id是girl的bean: --%>
   <jsp:useBean id="girl" class="tom.jiafei.Circle" scope="session" />
 <br>这里是example4_2_a.jsp页面
 <br>圆的半径是: <%=girl.getRadius()%>
 <a href="example4_2_b.jsp"><br>example4_2_b.jsp </a>
</font></body></HTML> 


********************************************************************************
example4_2_b.jsp

<%@ page contentType="text/html;charset=GB2312" %>
<HTML><body ><font size=3>
 <%--通过JSP标记,用户获得一个作用域是session,id是girl的bean: --%>
 <jsp:useBean id="girl" class="tom.jiafei.Circle" scope="session" />
  <i><br>这里是example4_2_b.jsp页面
  <br>当前圆的半径是: <%=girl.getRadius()%>
  <% girl.setRadius(99);
  //修改radius值
  %>
  <br>修改后的圆的半径是:<%=girl.getRadius()%></i>
  <a href="example4_2_a.jsp"><BR>example4_2_a.jsp</a>
</font></body></HTML>

javabean与pojo的区别 javabean和jsp的区别_j2ee_04


javabean与pojo的区别 javabean和jsp的区别_java_05

javabean与pojo的区别 javabean和jsp的区别_javabean与pojo的区别_06


例子3中example4_3.jsp将bean的scope的值设为application。当第一个用户访问这个页面时,显示bean的radius的值,然后把radius的值修改为1000(图4.7)。当其他用户访问这个页面时,看到的radius的值都是1000(图4.8)。

<%@ page contentType="text/html;charset=gb2312" %>
<HTML><body bgcolor=yellow>
 <jsp:useBean id="boy" class="tom.jiafei.Circle" scope="application" />
  圆的初始半径是:<%=boy.getRadius()%>
  <% boy.setRadius(1000);
  %>
 <br><b>修改后的圆的半径是:<%=boy.getRadius()%>
</body></HTML>

javabean与pojo的区别 javabean和jsp的区别_j2ee_07

获取和修改beans的属性

JSP页面使用getProperty、setProperty标记获取或修改属性xxx时,必须保证bean有相应的getXxx和setXxx方法,

即对方法的名字的命名有特殊的要求,

而在程序片中直接用bean调用方法就不需要方法命名遵守getXxx和setXxx规则

getProperty动作标记

使用getProperty动作标记可以获得bean的属性值,并将这个值用串的形式发送给用户的浏览器。
使用getProperty动作标记之前,必须使用useBean动作标记获得相应的bean。

<jsp:getProperty  name="id" property="bean属性" />
或
<jsp:getProperty  name=“id"  property="bean属性"/>
......
</jsp:getProperty>

该指令相当于Java表达式:
<%= bean.getXxx() %>




setProperty动作标记

使用setProperty动作标记可以设置bean的属性值。使用这个标记之前,必须使用useBean标记得到一个相应的bean。

  • 将bean属性的值设置为一个表达式的值或字符串
  • 将bean属性的值设置为一个表达式的值的语法格式
  • <jsp:setProperty name=“id" property="bean的属性" value= "<%=expression%>"/>
  • 将bean属性的值设置为一个字符串语法格式
  • <jsp:setProperty name="id" property="bean的属性" value=字符串/>


  • 通过HTTP表单的参数的值来设置bean的相应属性的值
  • 用HTTP表单的所有参数的值设置bean相对应的属性的值
  • <jsp:setProperty name= "id" property="*" />
  • 用HTTP表单的某个参数的值设置bean的某个属性的值
  • <jsp:setProperty name= “bean的名字” property=“bean属性名” param= “表单中的参数名” />

Student.java

package tom.jiafei;
public class Student  {
   String name=null;
   double height;
   public String getName() {
      return name;
   }
   public void setName(String newName){
      name=newName;
   }
   public double getHeight() {
      return height;
   }
   public void setHeight(double newHeight) {
      height=newHeight;
   }
}

举例1

javabean与pojo的区别 javabean和jsp的区别_javabean与pojo的区别_08

<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="zhang" class="tom.jiafei.Student" scope="request"/>
<HTML><body bgcolor=pink><font size=3>
<jsp:setProperty name="zhang" property="name" value="张三"/>
<b> 学生姓名:<jsp:getProperty name="zhang" property="name"/></b>
<jsp:setProperty name="zhang" property="height" value="<%=1.78%>"/>
<br><b> 学生身高:<jsp:getProperty name="zhang" property="height"/>米</b>
</font></body></HTML>

javabean与pojo的区别 javabean和jsp的区别_java-ee_09

<%-- a--%>

<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="iPhone" class="tom.jiafei.Goods" scope="request"/>
<HTML><body bgcolor=yellow><font size=3>
  <form action="" Method="post" >
     手机名称:<input type=text name="name">
     <br>手机价格:<input type=text name="price">
     <br><input type=submit value="提交给本页面">
  </form>
    
<%-- 指向到b页面--%>
   <form action="example4_5_b.jsp" Method="post" >
     手机名称:<input type=text name="name">
     <br>手机价格:<input type=text name="price">
     <br><input type=submit value="提交给example4_5_b.jsp页面">
  </form>
<%-- 设置set的值,再get设置的值--%>
  <jsp:setProperty name="iPhone" property="name" param ="name" />
  <jsp:setProperty name="iPhone" property="price" param ="price"/>
  <br><b>名称:<jsp:getProperty name="iPhone" property="name"/>
  <br><b>价格:<jsp:getProperty name="iPhone" property="price"/>
</font></body></HTML>

***************************************************************
<%-- b--%>

<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="iPhone" class="tom.jiafei.Goods" scope="request"/>
<HTML><body bgcolor=cyan><font size=3>
  <jsp:setProperty name="iPhone" property="name" param ="name" />
  <jsp:setProperty name="iPhone" property="price" param ="price"/>
  <br><b>名称:<jsp:getProperty name="iPhone" property="name"/>
  <br><b>价格:<jsp:getProperty name="iPhone" property="price"/>
</font></body></HTML>

javabean与pojo的区别 javabean和jsp的区别_j2ee_10

beans的辅助类

有时在写一个bean的时候,除了需要用import语句引入JDK平台提供的类,可能还需要其它自己编写的一些类。

那么只要将这些类和创建bean的类写在一个java源文件中即可,但必须将源文件编译后产生的全部字节码文件复制到相应的目录中

javabean与pojo的区别 javabean和jsp的区别_java_11

package tom.jiafei;
import java.io.*;
class FileExtendName implements FilenameFilter {
   String str=null;
   FileExtendName (String s) {
      str="."+s;
   }
   public  boolean accept(File dir,String name) {
      return name.endsWith(str);
   }              
}
public class ListFile {
   String extendsName=null;
   String [] allFileName=null; 
   String dir=null;
   public void setDir(String dir) {
      this.dir =dir;
   }
   public String getDir() {
      return dir;
   }
   public void setExtendsName(String s) {
      extendsName=s;
   }
   public String getExtendsName() {
      return extendsName;
   }
   public String [] getAllFileName() {
      if(dir!=null) {
        File mulu=new File(dir);
        FileExtendName help=new FileExtendName(extendsName);
        allFileName=mulu.list(help);
      }
      return allFileName;
   }  
}



<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="file" class="tom.jiafei.ListFile" scope="request"/>
<HTML><body bgcolor=cyan><font size=2>
<form action="" Method="post">
  输入目录名,例如:D:/2000<input type=text name="dir" size=15><br>
  输入文件的扩展名,例如:java<input type=text name="extendsName" size=6>
  <input type=submit value="提交">
</form>
  <jsp:setProperty name="file" property="dir" param="dir"/>
  <jsp:setProperty name="file" property="extendsName" param="extendsName"/>
  <br><b>目录 <jsp:getProperty name="file" property="dir"/>中
   扩展名是 <jsp:getProperty name="file" property="extendsName"/> 的文件有:
  <% String [] fileName = file.getAllFileName();
     if(fileName!=null) {
       for(int i=0;i<fileName.length;i++) {
          out.print("<br>"+fileName[i]); 
       } 
     }
  %>
</font></body></HTML>