【JSP】JSP与JavaBean || 含举例实战

分类: beat365下载唯一官方网 时间: 2025-11-03 17:30:16 作者: admin

目 录

概述编写JavaBean保存bean的字节码创建与使用bean使用beanbean的加载原理bean的有效范围(生命周期)

获取和修改beans的属性getProperty动作标记setProperty动作标记

beans的辅助类

代码和PPT见github,感谢star

概述

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

具有以下特点:

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

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

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

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

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

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

编写JavaBean

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

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

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”中

创建与使用bean

使用bean

使用JSP动作标记:useBean 加载使用Bean 语法格式: 或者

...

...

例如:

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" %>

<%--通过上述JSP标记,用户获得了一个作用域是page,名字是circle的bean --%>

圆的初始半径是:<%=circle.getRadius()%>

<% double newRadius =100;

circle.setRadius(newRadius); //修改半径

%>

修改半径为<%= newRadius %>


目前圆的半径是:<%=circle.getRadius()%>


圆的周长是:<%=circle.circlLength()%>


圆的面积是:<%=circle.circleArea()%>

例子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" %>

<%--通过JSP标记,用户获得一个作用域是session,id是girl的bean: --%>


这里是example4_2_a.jsp页面


圆的半径是: <%=girl.getRadius()%>


example4_2_b.jsp

********************************************************************************

example4_2_b.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%--通过JSP标记,用户获得一个作用域是session,id是girl的bean: --%>


这里是example4_2_b.jsp页面


当前圆的半径是: <%=girl.getRadius()%>

<% girl.setRadius(99);

//修改radius值

%>


修改后的圆的半径是:<%=girl.getRadius()%>


example4_2_a.jsp

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

<%@ page contentType="text/html;charset=gb2312" %>

圆的初始半径是:<%=boy.getRadius()%>

<% boy.setRadius(1000);

%>


修改后的圆的半径是:<%=boy.getRadius()%>

获取和修改beans的属性

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

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

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

getProperty动作标记

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

......

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

setProperty动作标记

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

将bean属性的值设置为一个表达式的值或字符串

将bean属性的值设置为一个表达式的值的语法格式

将bean属性的值设置为一个字符串语法格式

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

用HTTP表单的所有参数的值设置bean相对应的属性的值

用HTTP表单的某个参数的值设置bean的某个属性的值

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

<%@ page contentType="text/html;charset=gb2312" %>

学生姓名:


学生身高:

<%-- a--%>

<%@ page contentType="text/html;charset=gb2312" %>

手机名称:


手机价格:


<%-- 指向到b页面--%>

手机名称:


手机价格:


<%-- 设置set的值,再get设置的值--%>


名称:


价格:

***************************************************************

<%-- b--%>

<%@ page contentType="text/html;charset=gb2312" %>


名称:


价格:

beans的辅助类

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

那么只要将这些类和创建bean的类写在一个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;

}

}

<%@ page contentType="text/html;charset=gb2312" %>

输入目录名,例如:D:/2000

输入文件的扩展名,例如:java


目录

扩展名是 的文件有:

<% String [] fileName = file.getAllFileName();

if(fileName!=null) {

for(int i=0;i

out.print("
"+fileName[i]);

}

}

%>