admin 管理员组

文章数量: 887053


2024年1月16日发(作者:安卓stream抓包工具下载)

第1章 JSP技术概述

第2章 JSP语法基础

第3章 JSP的内置对象

第4章 JSP中的文件操作

第5章 JSP数据库连接技术

第6章 JavaBean技术

Javabean是Java程序设计应用中的一种组件技术。本章从JavaBean的基本概念讲起,阐述了JavaBean的编译方法及工作原理,接着将阐述JavaBean在JSP下的特定语法,重点放在Web开发中JavaBean的开发、编译和部署;后面用几Java Web开发中常见的JavaBean为例,来学习并学会在Web开发中应用JavaBean技术。

学习完本章,应够能够编写JSP开发中需要的JavaBean,并能在Tomcat平台上部署。

6.1 什么是JavaBean

6.1.1 JavaBean的概念

JavaBean是描述Java的软件组件模型,有点类似于Microsoft的COM组件概念。在Java模型中,通过JavaBean可以无限扩充Java程序的功能,通过JavaBean的组合可以快速的生成新的应用程序。对于程序员来说,最好的一点就是JavaBean可以实现代码的重复利用,另外对于程序的易维护性等等也有很重大的意义。

JavaBean通过Java虚拟机(Java Virtual Machine)可以得到正确的执行,运行JavaBean最小的需求是JDK1.1或者以上的版本。

JavaBean传统的应用在于可视化的领域,如AWT下的应用。自从Jsp诞生后,JavaBean更多的应用在了非可视化领域,在服务器端应用方面表现出来了越来越强的生命力。在这里我们主要讨论的是非可视化的JavaBean,可视化的JavaBean有很多Java书籍都有详细的阐述,在这里就不作为重点了。

6.1.2 JavaBean的优点

在JSP中调用JavaBean,有如下两个优点。

1)提高代码的可复用性。

对于通常使用的业务逻辑代码,如数据运算和处理、数据库操作等,可以封装到JavaBean中。在JSP文件中可以多次调用JavaBean中的方法来实现快速的程序开发。

2)将HTML代码和Java代码进行分离,程序利于开发维护。

将业务逻辑进行封装,使得业务逻辑代码和显示代码相分离,不会互相干扰,避免了代码又多又复杂的问题,方便了日后的维护。

要想在JSP中调用JavaBean,就需要使用到动作指令,该动作指令主要用于创建和查找JavaBean的示例对象。其语法格式如下。

其中id属性表示该JavaBean实例化后的对象名称。scope属性用来指定该JavaBean的范围,也就是指JavaBean实例化后的对象存储范围。范围的取值分别是page、request、session和application。class属性用来指定JavaBean的类名,这里所指的类名包括包名和类名。

6.1.3 编写第一个JavaBean

编写javabeans就是编写一个java的类,所以你只要会写类就能编写一个beans,这个类创建的一个对象称做一个beans。为了能让使用这个beans的应用程序构建工具(比如JSP引擎)知道这个beans的属性和方法,只需在类的方法命名上遵守以下规则:

(1)如果类的成员变量的名字是xxx,那么为了更改或获取成员变量的值,即更改或获取属性,在类中就需要有两个方法:

public datatype getXxx():用来获取某个属性的值。

Public void setXxx(datatype data):用来设置某个属性,datatype为属性的类型,data为属性的值。

(2)对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用“is”代替上面的“get”和“set”。

(3)类中方法的访问属性都必须是public的。

(4)类中如果有构造方法,那么这个构造方法也是public的并且是无参数的。

下面我们编写一个简单的beans,并在后面的例子中说明在JSP中怎样使用这个beans。

例6-1 简单的JavaBean示例。

public class Box {

double length;//长方体的长

double width;//长方体的宽

double height;//长方体的高

public Box()

{//构造方法

length=0;

width=0;

height=0;

}

public void setLength(double length){

=length;//设置长

}

public double getLength(){

return length;//返回长

}

public void setWidth(double width){

=width;//设置宽

}

public double getWidth(){

return width;//返回宽

}

public void setHeight(double height){

=height;//设置高

}

public double getHeight(){

return height;//返回高

}

public double volumn(){

//求长方体的体积

double volumnValue;

volumnValue=length*width*height;

return volumnValue;

}

public double surefaceArea(){

//求长方体的表面积

double surfaceAreaValue;

surfaceAreaValue=length*width*2+length*height*2+width*height*2;

return surfaceAreaValue;

}

}

这是一个很典型的JavaBean的代表,简单地解释一下,上面构造了一个Box类,length、width、height是它的三个属性,通过getXXX()和setXXX()方法可以每一个属性进行操作。构造方法完成属性的初始化操作,volumn()和surefaceArea()方法分别用来求长方体的体积和表面积。

6.2 编译和部署JavaBean

6.2.1 编译JavaBean

上面构造了一个的类,编译JavaBean实际是就是编译Java类。启动cmd命令窗口并切换到所在的目录,输入如下命令:

Javac

如果编译成功,就会生成字节码文件。

注意:在编译前正正确配置Java_home、path、pathclass这三个系统环境变量的路径。

编译生成了字节码文件以后,字节码文件的运行限制很多比较多。比如从其他文件用路径定位到.class的调用就会有找不到class的错误,所以如果要发布执行最好还是打成jar包。

JAR文件的全称是Java Archive File。即Java档案文件。通常JAR文件是一种压缩文件,与ZIP压缩文件兼容。JAR文件与ZIP文件的区别是JAR文件中默认包含了一个名为META-INF/的清单文件,这个文件在生成JAR包时由系统自动生成。当开发出一个应用程序后,该应用程序包含了很多类,发布该应用程序时,通常打包成JAR文件。

JAR文件作为内嵌在Java平台内部处理的标准,故具有可移植性,能够在各种平台上直接使用。把一个JAR文件添加到系统CLASSPATH环境变量中,Java将会把这个JAR文件当成一个路径来处理。JAR文件通常使用jar命令压缩而成。

有了JAR文件以后,其中包含的类就无需一个一个进行部署,可以作为一个JAR文件一次性部署,也可以方便网上下载,因为下载一个JAR文件要比下载多个class文件要方便得多。

jar命令用法:

jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...

选项:

-c 创建新的存档

-t 列出存档内容的列表

-x 展开存档中的命名的(或所有的〕文件

-u 更新已存在的存档

-v 生成详细输出到标准输出上

-f 指定存档文件名

-m 包含来自标明文件的标明信息

-0 只存储方式;未用ZIP压缩格式

-M 不产生所有项的清单(manifest〕文件

-i 为指定的jar文件产生索引信息

-C 改变到指定的目录,并且包含下列文件:

如果一个文件名是一个目录,它将被递归处理。

清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。

示例1:将两个class文件存档到一个名为 '' 的存档文件中:

jar cvf

示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有文件存档到一个名为 '' 的存档文件中:

jar cvfm mymanifest -C foo/ 。

示例3:

1) 打包,启动cmd命令窗口,并切换到所在目录。输入:jar cvf

,回车后去查看当前目录,发现多了文件 。

基本的步骤我们现在都知道了,你可以自己去尝试一下随着jar后面的参数的不同,结果有什么变化。

2)运行jar包。在进入正题之前,你要先打开我们刚刚做好的jar包看看,多了一个META-INF目录,META-INF目录下还有一个文件,用文本编辑器打开后的内容为(注意文件未尾有两空行):

Manifest-Version: 1.0

Created-By: 1.7.0_05 (Oracle Corporation)

6.2.2 关于文件:

打 Java 包的时候可以有一个清单文件:,它是打包的关键性文件,主要是设置执行入口类和支持库的路径,在运行 Java 应用程序时会根据此文件中给出的信息来查找入口类和支持库。

它的内容一般包括:

Manifest-Version: 1.0

Created-By: 1.6.0 (Sun Microsystems Inc.)

Main-Class: HelloWorld

其中比较容易忽略的是还可以有一个Class-Path属性的设置,Class-Path:用来指定支持库的路径,程序运行时依据 Class-Path 项的设置路径来查找支持库,每一个支持库之间用空格分开。比如这样写清单文件:

Manifest-Version: 1.0

Class-Path: ./lib/ ./lib/ ./lib/

Created-By: 1.6.0 (Sun Microsystems Inc.)

Main-Class:

这样当前目录的 lib 目录下的几个包都可以在运行时被找到,我们制作可自运行的

Java 程序时,就不用写一个批处理文件来写明 CLASSPATH ,直接在这里指定就可以了。

例6-2 JavaBean 打包示例。

1) 在D:/ myclass目录下写一个测试数据库连接的类:

package ;

import .*;

public class TestDB{

public static void main(String[] args){

String url ="jdbc:odbc:mydb";

try{

e("bcDriver");

Connection conn = nection(url, "","");

n(conn);

}catch(Exception e){

tackTrace();

}

}

}

2) 用如下命令编译此文件:

javac -d .

就会在当前目录生成带包结构的文件。目录结构如图6-1所示:

图6-1 编译带包结构的Java类

3) 在当前文件下创建一jar清单文件:(注意每行的”:”后有一空格,文件未尾有两空行)

Manifest-Version: 1.0

Main-Class:

4) 用如下命令打jar包:

jar -cmvf org

此命令的含义是:指定打包的清单文件为当前目录下的,打当前目录下和当前目录下的org目录打到包中。此时在当前目录下就会生成一个包。

5) 测试打包是否成功:

在命令行用如下命令:java -jar 。如果出现如下信息:

说明我们打的包成功运行并成功连上数据库。

6.2.3 部署JavaBean

部署javabean有两种方法,一种是对web服务器中的所有jsp页面都有效;另一种仅对当前应用有效。

如果要让web服务器中所有的jsp页面都可以使用要部署的javabean,则可以把编译后得到的class文件打包成jar文件拷贝至$TOMCAT_HOMElib目录下部署完成后要重启tomcat服务器才能生效。

如果只对当前的应用有效,如果部署class类文件,则需要在当前应用下建立WEB-INF子目录,在这个子目录下创建classes子目录,然后把类文件拷贝到当前目录即可。

如果部署的是jar包,同样有两种方法,一种是对Web服务器中的JSP页面都有效;另一种仅对当前应用有效。

如果要让Web服务器中所有的JSP页面都可以使用要部署的jar文件,可以把打包后的jar文件拷贝到tomcat安装目录的lib子目录下即可,但要重启服务器。

如果只对当前应用有效,则须在当前应用的WEB-INF子目录中建立一个新的子目录lib,并把jar文件拷贝到当前目录即可。

6.3 在JSP中应用JavaBean

在tomcat中部署好相应的类和包之后,下面来看如何在JSP页面中应用JavaBean。为了在JSP页面中使用benas,我们必须使用JSP动作标签:useBean。

6.3.1 useBean动作指令标签

useBean动作指令标签的格式有下面两种形式:

当服务器上某个含有useBean动作标签的JSP页面被加载执行时,JSP引擎将首先根据id的名字,在一个同步块中,查找JSP引擎内置pageContent对象中是否含有名字id和作用域scope的对象,如果这个对象存在,JSP引擎就分配一个这样的对象给客户,这样,客户就获得了一个作用域是scope、名字是id的beans(就像我们组装电视机时获得了一个有一定功能和使用范围的电子元件)。如果在pageContent中没有查找到指定作用域、名字是id的对象,就根据class指定的类创建一个名字是id对象,即创建了一个名字是id的beans,并添加到pageContent内置对象中,并指定该beans的作用域是scope,同时JSP引擎分配给客户一个作用域是scope、名字是id的beans。

6.3.2 JavaBean的作用范围

下面就useBean标签中scope取值的不同情况阐述如下:

 scope取值page

JSP引擎分配给每个客户的beans是互不相同的,也就是说,尽管每个客户的beans的功能相同,但它们占有不同的内存空间。该beans的有效范围是当前页面,当客户离开这个页面时,JSP引擎取消分配给该客户的beans。

 scope取值session

JSP引擎分配给每个客户的beans是互不相同的,该beans的有效范围是客户的会话期间,也就是说,如果客户在多个页面中相互连接,每个页面都含有一个useBeans标签,这些useBean标签中id的值相同,并且scope的值都是session,那么,该客户在这些页面得到的beans是相同的一个。如果客户在某个页面更改了这个beans的属性,其它页面的这个beans的属性也将发生同样的变化。当客户关闭浏览器时,JSP引擎取消分配给客户的beans。

 scope取值request

JSP引擎分配给每个客户的beans是互不相同的,该beans的有效范围是request期间。客户在网站的访问期间可能请求过多个页面,如果这些页面含有socope取值是request的useBeans标签,那么pageCotent对象在每个页面分配给客户的beans也是互不相同的。JSP引擎对请求作出响应之后,取消分配给客户的这个beans。

 scope取值application

JSP引擎为每个客户分配一个共享的beans,也就是说,所有客户共享这个beans,如果一个客户改变这个beans的某个属性的值,那么所有客户的这个beans的属性值都发生了变化。这个beans直到服务器关闭才被取消.。

注:当使用作用域是session的beans时,要保证客户端支持Cooker。

为了使服务器的所有web服务目录下的JSP页面文件都能使用我们的beans,我们必须将上面编译通过生成的字节码类文件:拷贝到你的项目文件夹下的子目录WEB-INF/classes中,如图6-2所示。

图6-2 编译类的部署

另外,在使用beans的JSP页面中,必须有如下的import指令:

<@page import= “Box”>

6.3.3 Jsp与JavaBean结合的简单例子

在下面的例子中,负责创建beans的类是前面构造的Box类,假设Box类经过编译后以按上节的部署class文件或部署jar文件的方法部署好,创建的beans的名字是box1,box1的scope取值page。

例6-3 JavaBean示例。

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

<%@ page import=""%>

<%--通过上述JSP标签,客户获得了一个作用域是page,名字是box1的beans --%>

<% //设置长方体的长、宽、高:

gth(3);

th(4);

ght(5);

%>

长方体的长是:

<%=gth()%>

长方体的宽是:

<%=th()%>

长方体的高是:

<%=ght()%>

长方体的体积是:

<%=()%>

长方体的表面积是:

<%=ceArea()%>

程序中,创建了一个id为box1的JavaBean,起作用范围为page。先用import语句导入Box类,再用setXxx()方法来设定类实例box1的长宽高,再用getXxx()方法得到实例box1的长宽高并输出,接着计算并输出了长方体的体积和表面积。页面的运行结果如下:

图6-3 JavaBean示例

6.3.4 设置JavaBean属性

前面介绍的JavaBean属性都是通过调用实例化对象名从而获得的,即使用了setXxx()和getXxx()方法来设置和获取JavaBean的属性值,下面来介绍一种更加简便的方法。

JSP中提供了一个动作指令来设置JavaBean属性,其有如下4种语法格式。

其中name属性使用设置实例化对象名,和中的id属性保持一致。property属性用来指定JavaBean属性名称。param属性用来指定接收参数名称,value属性用来指定属性值。

下面将分别介绍这4种动作指令的作用。

1)根据所有参数设置JavaBean属性

第一种动作指令用来根据所有参数设置JavaBean属性,其语法格式如下。

其中"*"表示根据表单传递的所有参数来设置JavaBean的属性。比如通过表单传递了两个参数,如username和password,这时就可以自动地对JavaBean中的username属性及password属性进行赋值。这里必须注意的是,表单的参数值必须和JavaBean中的属性名称保持大小写一致,否则无法进行赋值操作。

2)根据指定参数设置JavaBean属性

第二种动作指令用来根据指定参数设置JavaBean属性,其语法格式如下。

与第一种动作指令相比,第二种动作指令具有更好的弹性。第一种动作指令要求设置所有的参数,而第二种动作指令可以用来设置指定的参数。比如通过表单传递了两个参数,如username和password,这时就可以指定只为JavaBean的username属性赋值,也可以指定只为JavaBean的password属性赋值。

3)根据指定参数设置指定JavaBean属性

第三种动作指令用来根据指定参数设置指定JavaBean属性,其语法格式如下。

与前两种动作指令相比,第三种动作指令更加具有弹性。前面两种动作指令都需要设置参数和JavaBean属性必须相同,而且必须保证大小写一致。而第三种动作指令没有此限制,因为可以通过其指定需要设置的JavaBean属性。

4) 设置指定JavaBean属性为指定值

第四种动作指令用来设置指定JavaBean属性为指定值,其语法格式如下。

第四种动作指令相比前三种动作指令更加具有弹性。前面三种动作指令都需要接收表单参数,而第四种可以根据需要动态地设置JavaBean属性值。

6.3.5 获得JavaBean属性

前面介绍的JavaBean属性都是通过调用实例化对象名从而获得的,下面来介绍一种更加简便的方法。

JSP提供了一个动作指令,用来很方便地获得JavaBean属性,其语法格式如下。

其中name属性用来设置实例化对象名,同样必须和中的id属性保持一致。property属性用来指定需要获得的JavaBean属性名称。

6.4 数据库操作JavaBean

数据库操作的JavaBean是将JSP的数据库操作代码封装在JavaBean中,然后再JSP页面中进行引用。封装数据库操作,目的就是为了隐藏包内的类,在编码中去掉核心

的数据库操作代码。以杜绝直接数据库操作容易带来的资源未释放问题。同时也减少了数据库操作的编码量。

如果在进行数据库查询操作封装时,返回的是结果集(ResultSet对象),那么这个封装就没有意义了。这是因为:

(1) 在JSP页面中又得直接操作核心数据库类,跟封装前几乎没什么变化。

(2) 结果集总是依赖于它使用的连接(Connection)对象。因此当连接对象在方法内被关闭后,返回的ResultSet就没有用了。

如果真的要获得查询数据库的结果集,就把结果集对象内的所有数据,转储到以Map为元素的List对象内或者ArrayList对象内。当然,这种方式不能适应大数据量的查询,如果碰到大数据量的查询,那用什么封装都不好,还是得直接在JSP页面中进行数据库操作。

下面的例子是一个典型的数据库操作JavaBean的例子。在这个例子中构造了三个JavaBean:、、UserManager。用来连接具体的数据库,构造了一个普通的用户类,里面封装了用户的各属性及属性的设置操作和获取操作。UserManager类主要构造了以下几个方法:getuserbyid()、islogin()、adduser()、updateuser()、deluser()这样几个方法。getuserbyid()方法用来

例6-4 数据库操作JavaBean示例。

import .*;

import .*;

public class DbManager

{

// 定义连接池对象为静态变量,将一直存在,直到工作目录关闭。

private static DataSource ds = null;

// 1.用连接池的方式获得连接

// 如果不是做多数据库程序,推荐使用此方法

// 相关内容:在tomcat管理界面配置连接池

public static Connection openConnection() throws Exception

{

// 只需要初始化1次

if ( ds == null )

{

Context initContext = new InitialContext();

Context envContext = (Context) ("java:/comp/env");

DataSource ds = (DataSource) ("jdbc/MyDataSource");

}

return nection();

}

// 2.用jdbc驱动获得连接

// 相关内容:JSP数据库连接大全

public static Connection openConnection(

String driver,

String url,

String username,

String password)

throws Exception

{

e(driver).newInstance();

return nection(url, username, password);

}

public static void closeConnection(Connection conn) throws Exception

{

if ( conn != null )

{

();

}

}

public static int executeUpdate(String sql) throws Exception

{

int count = 0;

Connection conn = null;

Statement stmt = null;

try

{

conn = openConnection();

stmt = Statement();

count = eUpdate(sql);

}

catch ( Exception e )

{

throw e;

}

finally

{

closeConnection(conn);

}

return count;

}

public static List executeQuery(String sql) throws Exception

{

List list = new ArrayList();

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

try

{

conn = openConnection();

stmt = Statement();

rs = eQuery(sql);

ResultSetMetaData rsmd = aData();

while ( () )

{

Map map = new HashMap();

for ( int i = 1; i <= umnCount(); i++ )

{

(umnName(i), ect(i));

}

(map);

} }

catch ( Exception e )

{

tackTrace();

}

finally

{

if ( rs != null ) ();

closeConnection(conn);

}

return list; }

}

下面给出在JSP页面中的应用示例代码。在页面中先通过下面的代码创建JavaBean实例对象dbmanager:

如果要进行insert, update, delete操作,则执行下面的语句:

int count = eUpdate(sql);

如果要进行查询操作,则执行下面的语句:

list = eQuery(sql);

返回的是一个List列表,可通过下面两种方式来获取列表中的记录:

方法一:按名字取值,注意大小写是严格区分的。代码如下:

for ( int i = 0; i < (); i++ )

{

map = ()(i);

n(("column_name").toString());

}

方法二:通过对list遍历取值。代码如下:

for ( int i = 0; i < (); i++ )

{

map = ()(i);

for (or it = ().iterator(); t();)

{

String column_name = ().toString()); // 取值时注意null判断

n(column_name + " = " + (column_name) == null ? "" :

(column_name).toString());

}

}

6.5 小结

本章学习了JSP开发中JavaBean的开发和应用,通过JavaBean可以很好的实现页面的逻辑控制结构和静态的html代码相分离,便于控制和维护页面,同时JavaBean的开发有利于提高JSP开发的效率和程序代码的可重复性使用。Java中的JavaBean有两种,即可视化的和非可视化的,JSP中一般使用非可视化的JavaBean。

大多数读者学习完本章,可能会有这样一个疑惑,JavaBean能做什么?为什么要使用JavaBean?这里笔者建议大家熟记这句话:"JavaBean是一个可重复使用的软件组件模型"。从这句话中就体现了JavaBean的最大的作用,那就是可重复性,至于如何很好地利用它,就需要在以后的学习和实践中不断深入了。


本文标签: 文件 属性 指定 对象 操作