JSP 与Java bean

目录

前言

5.1 编写Javabean和使用Javabean 

5.1.1编写Javabean 

5.1.2 保存bean的字节码

5.1.3 创建与使用bean 

①使用bean 

②bean的加载原理 

③bean的有效范围和生命周期 

5.2 获取和修改bean的属性 

5.2.1 getProperty动作标记 

5.2.2 setProperty动作标记 

​编辑 ​编辑

5.3 bean的辅助类 

 5.4 JSP与bean结合的简单例子

总结:


前言

 JSP与Java Bean在Web开发中是非常重要的组件,它们可以实现数据的封装、变量的传递以及数据的持久化等功能。在本章中,我们将会介绍JSP页面中如何使用Java Bean,并讲解Java Bean的概念和基本原理

5.1 编写Javabean和使用Javabean 

5.1.1编写Javabean 

编写Javabean就是编写一个Java的类。bean的变量(成员变量),也称bean的属性。为了能让使用bean的应用程序构建工具(比如Tomcat服务器)使用JSP动作标记知道bean的属性和方法,只须在类的方法命名上遵守以下规则:

如果类的成员变量,也称bean的属性的名字是xxx,那么为了获取或更改bean的属性的值,类中必须提供两个方法:

(1)getXxx(),用来获取属性xxx。 setXxx(),用来修改属性xxx.。 也就是方法的名字用get或set为前缀,后缀是将属性(成员变量)名字的首字母大写的字符序列。

(2)类中定义的方法的访问权限都必须是public的。

(3)类中定义的构造方法必须是public、无参数的。 

5.1.2 保存bean的字节码

为了使JSP页面使用bean,tomcat服务器必须使用相应的字节码文件创建一个对象,及创建一个bean。为了让tomcat服务器能找到字节码文件,字节码文件必须保存在特定的目录中,"保存类型"选择为"所有文件",将"编码方式"选择为"ANSI"。

5.1.3 创建与使用bean 

①使用bean 

使用JSP动作标记useBean加载使用bean,语法格式是: 

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

需要特别注意的是,其中的“创建bean的类”要带有包名,比如 

class="tom.jiafei.Circle"

②bean的加载原理 

 Tomcat服务器首先在Tomcat服务器管理的pageContent内置对象中查找是否含有这样的bean。如果这样的bean存在,Tomcat服务器就分配这样的bean给用户,如果在pageContent中没有查找到JSP动作标记要求的bean,就根据class指定的类创建一个bean,并将所创建的bean添加到pageContent中。通过Tomcat服务器创建bean的过程可以看出,首次创建一个新的bean需要用相应类的字节码文件创建对象,当某些JSP页面再需要同样的bean时,Tomcat服务器直接将pageContent中已经有的bean分配给JSP页面,提高了JSP使用bean的效率。 

如果修改了字节码文件,必须重新启动Tomcat服务器才能使用新的字节码文件。 

③bean的有效范围和生命周期 

scope的取值范围给出了bean的生命周期(存活时间),即scope取值决定了tomcat服务器分配给用户的bean的有效范围和生命周期。

(1)page bean scope取值为page的bean称为page bean. page bean的有效范围是用户访问的当前页面,存活时间直到当前页面执行完毕。不同用户(浏览器)的page bean是互不相同的。也就是说,当两个用户同时访问一个JSP页面时,一个用户对自己page bean的属性的改变,不会影响到另一个用户。 

 (2)session bean。session bean的有效范围是用户访问的Web服务目录下的各个页面,存活时间是用户的会话期(session)间。如果用户访问Web服务目录多个页面,那么每个页面id相同的session bean是同一个bean。不同用户(浏览器)的session bean是互不相同的.

(3) request bean bean的有效范围是用户请求的当前页面,存活时间是从用户的请求到请求结束。request bean存活时间略长于page bean的存活时间,原因是Tomcat服务器认为页面执行完毕后,响应才算结束。 不同用户的request bean的也是互不相同的。也就是说,当两个用户同时请求一个JSP页面时,一个用户对自己request bean的属性的改变,不会影响到另一个用户。

(4)application bean。 application bean的有效范围是当前Web服务目录下的各个页面,存活时间直到Tomcat服务器关闭。 Tomcat服务器为访问Web服务目录的所有用户分配一个共享的bean,即不同用户的application bean也都是相同的一个。也就是说,任何一个用户对自己application bean的属性的改变,都会影响到其他的用户(不同Web服务目录的application bean互不相同)。

下面是有效范围示意图:

注意:使用session bean时,要保证用户端支持Cookie。 

 下列例子中负责创建page bean的类是Circle类,page bean的名字是circle:

 example5_1.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<style>
   #textStyle{
      font-family:宋体;font-size:36;color:blue 
   }
</style>
<HTML><body bgcolor = #ffccff>
<p id = "textStyle">
<jsp:useBean id="circle" class="tom.jiafei.Circle" scope="page" />
<%--通过useBean标记,获得有效期限是page,名字是circle的bean --%>
圆的初始半径是:<%=circle.getRadius()%>
<%  double newRadius =100;  
    circle.setRadius(newRadius);   //修改半径。
%>
<br>修改半径为<%= newRadius %>
<br><b>圆的半径是:<%=circle.getRadius()%>
<br><b>圆的周长是:<%=circle.circleLength()%>
<br><b>圆的面积是:<%=circle.circleArea()%>
</p></body></HTML>

 Circle.java

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 circleLength() {
       return 2.0*Math.PI*radius;
    }
}

 结果:

 

5.2 获取和修改bean的属性 

使用useBean动作标记获得一个bean后,在Java程序片或表达式中bean就可以调用方法产生行为,这种情况下,不要求创建bean的类准守setXxx和getXxx等规则。 获取和修改bean的属性还可以使用JSP动作标记getProperty、setProperty。当页面使用getProperty、setProperty标记获取或修改属性xxx时,必须保证bean 中有相应的getXxx和setXxx方法,即对方法名字的命名有特殊的要求。

5.2.1 getProperty动作标记 

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

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

其中,name取值是bean的id,用来指定要获取哪个bean的属性的值,property取值是该bean的一个属性的名字。

注意:让request调用setCharacterEncoding方法设置编码为utf-8,以避免显示bean的属性值出现乱码现象。

5.2.2 setProperty动作标记 

使用 setProperty动作标记 可以设置bean的属性值。setProperty动作标记可以通过两种方式来设置bean属性值:

(1)将bean属性的值设置为一个表达式的值或字符序列。

<jsp:setProperty name="bean的id " property="bean的属性" 
                                                                  value= "<%=expression%>"/>

<jsp:setProperty name="bean的id " property="bean的属性" 
                                                                  value= "字符序列" />

value给出的值的类型要和bean的属性的类型一致。 

(2)通过HTTP表单的参数的值来设置bean的相应属性的值。

用form表单的所有参数的值设置bean相对应的属性值的使用格式如下:

<jsp:setProperty  name= "bean的id的名字"  property="*" />

在setProperty标记的上述用法中不具体指定bean属性的值将对应form表单中哪个参数指定的值,系统会自动根据名字进行匹配对应,但要求bean属性的名字必须在form表单中有名称相同的参数名字相对应。 

用form表单的某个参数的值设置bean的某个属性值的使用格式如下: 

<jsp:setProperty  name= "bean的名字"  property="属性名"  param= "参数名" />

setProperty标记的上述用法具体指定了bean属性的值将对应表单中哪个参数名(param)指定的值,这种设置bean的属性值的方法,不要求property给出的bean属性的名字和param给出的参数名一致,即不要求bean属性的名字必须和表单中某个参数。 

 注 用form表单设置bean的属性值时,只有提交了表单,对应的setProperty标记才会被执行。

例子:使用Goods类创建request bean。example4_5_a.jsp通过form表单指定example4_5_a.jsp和example4_5_b.jsp中的request bean的name和price属性的值。example4_5_a.jsp和example4_5_b.jsp使用getProperty动作标记以及bean调用方法两种方式显示request bean的name和price属性的值。 

example5_4_a.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<% request.setCharacterEncoding("utf-8");
%>
<jsp:useBean id="phone" class="tom.jiafei.Goods" scope="request"/>
<HTML><body bgcolor = #ffccff>
<style>
   #textStyle{
      font-family:宋体;font-size:20;color:blue 
   }
</style>
<p id = "textStyle">
<form action="" Method="post" >
手机名称:<input type=text id=textStyle name="name">
<br>手机价格:<input type=text id=textStyle name="price"/>
<br><input type=submit id=textStyle value="提交给本页面"/>
</form>
<form action="example5_4_b.jsp" Method="post" >
手机名称:<input type= text name="name" id=textStyle>
<br>手机价格:<input type=text name="price" id=textStyle>
<br><input type=submit id=textStyle value="提交给example5_4_b.jsp页面">
</form>
<jsp:setProperty name="phone" property="name" param ="name" />
<jsp:setProperty name="phone" property="price" param ="price"/>
<br><b>名称:<jsp:getProperty name="phone" property="name"/>
<br><b>名称:<%= phone.getName()%><br>
<br><b>价格:<jsp:getProperty name="phone" property="price"/>
<br><b>价格:<%=phone.getPrice()%>
</p></body></HTML>

 example5_4_b.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<% request.setCharacterEncoding("utf-8");
%>
<jsp:useBean id="phone" class="tom.jiafei.Goods" scope="page"/>
<HTML><body bgcolor= cyan>
<p style="font-family:黑体;font-size:20;color:red"> 
<jsp:setProperty name="phone" property="name" param ="name" />
<jsp:setProperty name="phone" property="price" param ="price"/>
<br><b>名称:<jsp:getProperty name="phone" property="name"/>
<br><b>名称:<%= phone.getName()%><br>
<br><b>价格:<jsp:getProperty name="phone" property="price"/>
<br><b>价格:<%=phone.getPrice()%>
</p></body></HTML>

 Goods.java

package tom.jiafei;
public class Goods  {
   String name="无名";
   double price=0;
   public String getName() {
      return name;
   }
   public void setName(String newName){
      name = newName;
   }
   public double getPrice() {
      return price;
   }
   public void setPrice(double newPrice) {
      price = newPrice;
   }
}

结果:

 

5.3 bean的辅助类 

 写一个创建bean的类时,除了需要用import语句引入JDK提供的类,可能还需要自己编写一些其他的类,只要将这样类的包名和bean类的包名一致即可(也可以和创建bean的类写在一个Java源文件中)。

例子5_5中,使用一个bean列出Tomcat服务器驻留的计算机上某目录中特定扩展名的文件。创建bean的ListFile类,需要一个实现FilenameFilter接口的辅助类FileExtendName,该类可以帮助bean列出指定扩展名的文件。

 Javabean:ListFile.java(负责创建bean)用命令行进入tom\jiafei的父目录classes,编译ListFile.java:

 classes>javac  tom\jiafei\ListFile.java

 

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;
   }  
}

JSP页面:example5_5.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %> 
<% request.setCharacterEncoding("utf-8");
%>
<style>
   #textStyle{
      font-family:宋体;font-size:36;color:blue 
   }
</style>
<jsp:useBean id="file" class="tom.jiafei.ListFile" scope="request"/>
<HTML><body id=textStyle bgcolor = #ffccff>
<form action="" Method="post">
输入目录名(例如D:/2000)<input type=text name="dir" id=textStyle size=15/><br>
输入文件的扩展名(例如java)<input type=text name="extendsName" id=textStyle size=6>
<input type=submit id=textStyle 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]); 
       } 
     }
%>
</body></HTML>

结果:

 5.4 JSP与bean结合的简单例子

          JSP页面中调用bean可以将数据的处理从页面中分离出来,实现代码复用,以便更有效地维护一个Web应用。 

由于本小节都是例子,就不在此过多赘述 。

总结:

通过本章的学习,能够掌握在JSP开发中如何使用Java Bean来对数据进行封装和操作,以及如何使用Java Bean来处理表单数据和自定义标签库等操作。

以上就是JSP 与Java bean的全部内容。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值