第七章

第七章
第七章

第七章 JSP与JavaBean

198

第七章 JSP与JavaBean

[本章导读]

目前,JSP作为一个流行的动态网站开发语言,得到了越来越广泛的应用。在各类

JSP应用程序中,JSP + JavaBean的组合成为了一种事实上最常见的JSP程序的标准。本章首先简要介绍JavaBean的概念,然后重点讲述JavaBean的应用,并通过实例来加以说明。

7.1 JavaBean概述

7.1.1 JavaBean简介

JavaBean 是一种Java语言写成的可重用组件。JavaBean中的类必须是具体的和公共的,并且是具有无参数的构造器。JavaBeans 通过提供符合一致性设计模式的公共方法,将内部域暴露称为属性。众所周知,属性符合这种模式,其他Java 类可以通过自省机制发现和操作这些JavaBean 属性。

用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码构造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。

JavaBean组件能够通过定义好的标准属性改进性能。总体而言,JavaBean充分发展了Java applet的功能,并结合了Java AWT组件的紧凑性和可重用性。

JavaBean是一个面向对象的编程接口,它是可以建立重用应用程序或在网络中任何主流操作系统平台上配置的程序块或组件。从用户的观点来看,一个组件可以是一个交互的按钮或是一个按下按钮便开始的小计算程序。要想用JavaBeans建一个组件,必须用Java编程语言来写程序,并且在程序中包括描述组件特性的JavaBeans语句,这些组件特性例如:用户接口的特性,以及触发一个bean和在同一个容器中或网络其他地方的其他的bean交流的事件。它在内部有接口或有与其相关的属性,以便不同人在不同时间开发的 bean 可以询问和集成。

JavaBean通过Java虚拟机(Java Virtual Machine)可以得到正确的执行,运行JavaBean最小的需求是JDK1.1或者以上的版本。JavaBean传统的应用在于可视化的领域,如AWT下的应用。

自从JSP诞生后,JavaBean更多的应用在非可视化领域,在服务器端应用方面表现出

7.1 JavaBean 概述

199

来了越来越强的生命力。在这里我们主要讨论的是非可视化的JavaBean ,可视化的JavaBean 在市面上有很多Java 书籍都有详细的阐述,在这里就不作为重点了。

非可视化的JavaBean ,顾名思义就是没有GUI 界面的JavaBean 。在JSP 程序中常用来封装事务逻辑、数据库操作等等,可以很好地实现业务逻辑和前台程序(如JSP 文件)的分离,使得系统具有更好的健壮性和灵活性。

Java 应用程序在运行时,最终用户也可以通过JavaBeans 组件设计者或应用程序开发者所建立的属性存取方法setXXX 方法和getXXX 方法修改JavaBeans 组件的属性。

JavaBean 和 Server Bean (通常称为 Enterprise JavaBean )有一些相同之处。它们都是用一组特性创建,以执行其特定任务的对象或组件。还有从当前所驻留服务器上的容器获得其他特性的能力。这使得 bean 的行为根据特定任务和所在环境的不同而有所不同。

JavaBean 与EJB 的主要区别:

(1)JavaBean 与EJB 规范在以下方面有共同的目标:通过标准的设计模式推广Java 程序代码,提升开发过程和开发工具之间的重复运用性、可携性.但是这两种规格的原始问题却是为了解决不同的问题。

定义于JavaBean 组件模型中的标准规范,被设计来产生可重复运用的组件,而这些组件通常被用于IDE 开发工具,而且通常是可视化组件,当然并不一定是可视化组件。

(2)EJB 规范所定义的组件模型是用来开发服务端的Java 程序,因为EJB 可能执行在不同的服务器平台上,包括无图形的大型主机上,所以EJB 无法使用类似AWT 或SWING 之类的图形化程序库。

JavaBean 体系结构是第一个全面的基于组件的标准模型之一。在集成的IDE 中使JavaBean 在设计时可以操作,组件模型如图

图7.1 JavaBean 组件模型

JavaBean 的组件模型为开发人员提供了一种标准的方式,定义Java 类以便其组件在JavaBean 容器环境操作,JavaBean 组件根据各种属性定义模型对外提供其属性、事件及内视信息,它允许设计工具的定制,达到在设计时Bean 自身定制的目的。

7.1 JavaBean概述

200 7.1.2 JavaBean的任务

JavaBean的任务就是:“Write once, run anywhere, reuse everywhere”,即“一次

性编写,任何地方执行,任何地方重用”。这个任何实际上就是要解决困扰软件工业的日益增加的复杂性,提供一个简单的、紧凑的和优秀的问题解决方案。

一个开发良好的软件组件应该是一次性地编写,而不需要再重新编写代码以增强或完善功能。因此,JavaBean应该提供一个实际的方法来增强现有代码的利用率,而不再需要在原有代码上重新进行编程。

除了在节约开发资源方面的意义外,一次性地编写JavaBean组件也可以在版本控制方面起到非常好的作用。开发者可以不断地对组件进行改进,而不必从头开始编写代码。这样就可以在原有基础上不断提高组件功能,而不会犯相同的错误。

因为JavaBean 与平台无关,所以对于将来的解决方案,供应商可以轻易向不同用户推出其客户机方的JavaBean,而不必创建或维护不同的版本。这些JavaBean 可以与执行商业功能(例如订购、信用卡处理、电子汇款、存货分配、运输等)的EJB 配合使用。这里有巨大潜力,而这正是组件代理(WebSphere Application Server 企业版)设计提供的那种潜力。

一个简单的例子,比如说一个购物车程序,要实现购物车中添加一件商品这样的功能,就可以写一个购物车操作的JavaBean,建立一个public的AddItem成员方法,前台JSP文件里面直接调用这个方法来实现。如果后来又考虑添加商品的时候需要判断库存是否有货物,没有货物不得购买,在这个时候我们就可以直接修改JavaBean的AddItem方法,加入处理语句来实现,这样就完全不用修改前台JSP页面了。

当然,也可以把这些处理操作完全写在JSP页面中,不过这样的JSP页面可能就有成百上千行,光看代码就是一个头疼的事情,更不用说修改了。所以使得维护修改等极为不方便。由此可见,通过JavaBean可以很好地实现逻辑的封装、程序的易于维护等等。

以下是实现JavaBean的一些具体的主要设计目标:

(1)紧凑而方便的创建和使用

JavaBean紧凑性的需求是基于JavaBean组件常常用于分布式计算环境中,这使得JavaBean组件常常需要在有限的带宽连接环境下进行传输。显然,为了适应传送的效率和速度,JavaBean组件必须是越紧凑越好。另外,为了更好地创建和使用组件,就应该使其越简单越好。通常为了提高组件的简易性和紧凑性,设计过程需要投入相对较大的功夫。

(2)完全的可移植性

JavaBean API与操作基础的独立于平台的Java系统相结合,提供了独立于平台的组件解决方案。因此,组件开发者就可以不必再为带有Java applet平台特有的类库而担心了。最终的结果都将是计算机界共享可重复使用的组件,并在任何支持Java的系统中无需修改地执行。

(3)继承Java的强大功能

7.2 JavaBean应用

现有的Java结构已经提供了多种易于应用于组件的功能。其中一个比较重要的是Java本身的内置类发现功能,它可以使得对象在运行时彼此动态地交互作用,这样对象就可以从开发系统或其开发历史中独立出来。

对于JavaBean而言,由于它是基于Java语言的,所以它就自然地继承了这个对于组件技术而言非常重要的功能,而不再需要任何额外开销来支持它。

JavaBean继承在现有Java功能中还有一个重要的方面,就是持久性,它保存对象并获得对象的内部状态。通过Java提供的序列化(serialization)机制,持久性可以由JavaBean自动进行处理。当然,在需要的时候,开发者也可以自己建立定制的持久性方案。

(4)应用程序构造器支持

JavaBean的另一个设计目标是设计环境的问题和开发者如何使用JavaBean创建应用程序。JavaBean体系结构支持指定设计环境属性和编辑机制以便于JavaBean组件的可视化编辑。这样开发者可以使用可视化应用程序构造器无缝地组装和修改JavaBean组件。就像Windows平台上的可视化开发工具VBX或OCX控件处理组件一样。通过这种方法,组件开发者可以指定在开发环境中使用和操作组件的方法。

(5)分布式计算支持

支持分布式计算虽然不是JavaBean体系结构中的核心元素,但也是JavaBean中的一个主要问题。

7.2 JavaBean应用

7.2.1 如何创建JavaBean

一个JavaBean和一个Javaapplet相似,是一个非常简单的遵循某种严格协议的Java 类。从基本上说,JavaBean可以看成是一个黑盒子,即只需要知道其功能而不必理会其内部结构的软件设备。黑盒子只介绍和定义其外部特征和与其他部分的接口,如按钮、窗口、颜色、形状、句柄等。

通过将系统看成使用黑盒子关联起来的通讯网络,开发者可以忽略黑盒子内部的系统细节,从而有效地控制系统的整体性能。作为一个黑盒子的模型,JavaBean有3个接口面,可以独立进行开发。

(1)JavaBean可以调用的方法。

(2)JavaBean提供的可读写的属性。

(3)JavaBean向外部发送的或从外部接收的事件。

JavaBean是类文件的一种,JavaBean保存很多公用的属性和方法,可以方便地被其他程序应用,其创建语法如下:

public class className{

201

7.2 JavaBean应用

202 }

其中public 标识的作用是使JavaBean可以被其他类访问。className的作用是定义

JavaBean的名字。

一个最简单的例子如下:

Package a

Public class OneBean{}

注意保存文件名应该是OneBean.java,注意大小写。然后编译成.class文件就可以让JSP文件调用。

7.2.2 如何调用JavaBean

为了在JSP页面中使用JavaBean,必须使用JSP动作标签useBean。

useBean的格式如下:

当服务器上某个含有usebean动作标签的JSP页面被加载执行时,JSP引擎将首先根据id的名字,在一个同步块中,查找JSP引擎内置对象中是否含有名字id和作用域scope 的对象,如果这个对象存在,JSP引擎就分配一个这样的对象给用户。如果没有查找到指定作用域和名字为id的对象,就根据class指定的类创建一个名字为id的对象,同时JSP 引擎分配给用户一个作用域为scope和名字为id的beans。

设置属性格式如下:

获取属性格式如下:

有了Bean以后,就可以使用jsp:setProperty语句来设置Bean的属性,设置时,可以明确给定值来设置,也可以通过request对象的参数隐含给定。当我们说“某个Bean具有类型X的属性abc”时实际表示的是在Bean中有这样两个方法:一个方法为getAbc(),其返回值的类型为X;另一个方法为setAbc(X para),它以类型为X的对象作为参数。

7.2.3 JavaBean的存放目录

JavaBean被组织成为package(包)进行管理,实际上就是把一组属于同一个包的JavaBean一起放在某个目录中,目录名即为包名。每个Bean文件都可以加上包定义语句。存放JavaBean(class文件)的目录必须包含在系统环境CLASSPATH中,系统才能找到其中的JavaBean。

如果想让任何WEB服务目录中的JSP页面都可以使用某个JavaBean,那么这个beans的字节码文件需存放在Tomcat安装目录的classes目录中。如果只让当前JSP页面调用,则在该目录下新建文件夹,命名为WEB-INF,注意不能使用其他名称。同时在创

7.2 JavaBean应用

建好的文件夹下再建立一个文件夹,命名为classes。把beans的字节码文件存放在该文件夹下,这样在JSP页面就可以用useBean调用了。

【例7.1】以下是一个简单的程序实例,可以设置和获取Bean的属性。

JavaBean程序:SimpleBean.java代码如下:

package com;

public class SimpleBean {

private String message = "No message specified";

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

}

JSP程序:beanTest.jsp 代码如下:

Reusing JavaBeans in JSP

Reusing JavaBeans in JSP

property="message"

value="Hello WWW" />

Message:

运行效果界面如图7.2所示。

203

7.3 JavaBean 应用实例

204

图7.2 获取Bean 页面

7.3 JavaBean 应用实例

7.3.1 使用JavaBean 连接数据库

在第六章我们已经学过了数据库的使用,用户管理系统实现的例程中,我们直接在JSP 页面进行数据库的连接,如果我们不希望使用Access 数据库,而想更改使用其他数据库,这个时候,我们几乎需要更改所有的页面。

有了本章关于JavaBean 应用的学习,我们只要把用户管理系统稍做修改,就可以使维护升级变得简单和轻松。下面以listUser.jsp 页面为例,使用JavaBean 替换代码中的数据库连接部分。

首先我们需要专门建立一个JavaBean ,作为数据库连接的工具类。

DataBaseConnection.java 代码如下所示:

package com;

import java.sql.*;

import java.io.*;

import java.util.*;

//连接数据库的工具类。

public class DataBaseConnection

{

/**

*一个静态方法,返回一个数据库的连接。

*这样达到了对数据库连接统一控制的目的。

*/ public static Connection getConnection()

{

Connection con=null; String CLASSFORNAME="sun.jdbc.odbc.JdbcOdbcDriver";

7.3 JavaBean应用实例

String SERVANDDB="jdbc:odbc:userManage";

String USER="";

String PWD="";

try

{

Class.forName(CLASSFORNAME);

con = DriverManager.getConnection(SERVANDDB,USER,PWD);

}

catch(Exception e){

e.printStackTrace();

}

return con;

}

}

然后在listUser_02.jsp页面使用useBean动作标签来调用该类中的getConnection()方法。这样即可获取数据库的连接,页面效果与listUser.jsp完全一致。

listUser_02.jsp代码如下:

<%@ page contentType="text/html;charset=gb2312" import="com.*,java.io.*,java.sql.*" %>

显示用户信息



用户资料列表


205

7.3 JavaBean应用实例

206

<%

Connection con=users.getConnection();

Statement stmt=con.createStatement();

//user是数据库中的表名

ResultSet rs=stmt.executeQuery("select * from user");

while(rs.next()){String a=rs.getString("id");

%>

<%

}

rs.close();

stmt.close();

con.close();

%>

姓名性别年龄学历联系电话删除
<%=rs.getString("name")%><%=rs.getString("sex")%><%=rs.getString("age")%><%=rs.getString("diploma")%><%=rs.getString("tel")%>

删除


添加用户资料

请同学们自己完成deleteUser.jsp和queryUser.jsp页面的修改。修改后整个系统与数

据库的连接都只需调用上面DataBaseConnection类,不需要重新再写任何类。

完成这些后,如果我们再需要升级或是更改数据库种类,只需要把数据库连接工具类DataBaseConnection里的驱动方式稍作修改,就完成了整个系统的更改,这样工作就变得异常轻松了。

7.3.2 进程条的实现

多线程的概念我们在第二章已经简单介绍过了,对于一般的应用程序,一般不会同时运行一个类的两个进程,但是有时是需要的。许多Web应用、企业应用涉及到长时间的操作,例如复杂的数据库查询或繁重的XML处理等,虽然这些任务主要由数据库系统或中间件完成,但任务执行的结果仍旧要借助JSP才能发送给用户。

当JSP调用一个必须长时间运行的操作,且该操作的结果不能(在服务器端)缓冲,

7.3 JavaBean应用实例

用户每次请求该页面时都必须长时间等待。很多时候,用户会失去耐心,接着尝试单击浏览器的刷新按钮,最终失望地离开。进度条显示功能提供了一种通过改进前端表现层来改善用户感觉、减轻服务器负载的办法。

如何控制多线程之间的同步?有两种实现方法,一种是方法同步,另一种是语法块同步。注意语法块同步的参数一般都是synchronized(this){},this是指向当前对象的句柄。

以下是一个简单的进度条系统。

1.模拟任务

首先我们设计一个TaskBean类,它实现了https://www.360docs.net/doc/3d17725152.html,ng.Runnable接口,其run()方法在JSP页面(start.jsp)启动的独立线程中运行。终止run()方法的执行由另一个JSP页面stop.jsp负责。TaskBean类还实现了java.io.Serializable接口,这样JSP页面就可以将它作为JavaBean调用。

TaskBean包含的“繁重任务”是计算1+2+…+100的值,通过累加的方式计算,由run()方法调用work()方法100次完成。work()方法调用Thread.sleep()是为了确保任务总耗时约10秒。

status.jsp页面通过调用下面的getPercent()方法获得任务的完成状况:

public synchronized int getPercent() {

return counter;

}

如果任务已经启动,isStarted()方法将返回true:

public synchronized boolean isStarted() {

return started;

}

如果任务已经完成,isCompleted()方法将返回true:

public synchronized boolean isCompleted() {

return counter == 100;

}

如果任务正在运行,isRunning()方法将返回true:

public synchronized boolean isRunning() {

return running;

}

SetRunning()方法由start.jsp或stop.jsp调用,当running参数是true时。SetRunning()方法还要将任务标记为“已经启动”。调用setRunning(false)表示要求run()方法停止执行。

public synchronized void setRunning(boolean running) {

this.running = running;

if (running)

started = true;

207

7.3 JavaBean应用实例

208

}

任务执行完毕后,调用getResult()方法返回计算结果;如果任务尚未执行完毕,它返

回null。

public synchronized Object getResult() {

if (isCompleted())

return new Integer(sum);

else

return null;

}

当running标记为true、completed标记为false时,run()方法调用work()。在实际应用中,run()方法也许要执行复杂的SQL查询、解析大型XML文档,或者调用消耗大量CPU时间的EJB方法。注意“繁重的任务”可能要在远程服务器上执行。报告结果的JSP页面有两种选择:或者等待任务结束,或者使用一个进度条。

public void run() {

try {

setRunning(true);

while (isRunning() && !isCompleted())

work();

} finally {

setRunning(false);

}

}

TaskBean.java代码如下:

package test.barBean;

import java.io.Serializable;

public class TaskBean implements Runnable, Serializable {

private int counter;

private int sum;

private boolean started;

private boolean running;

private int sleep;

public TaskBean() {

counter = 0;

sum = 0;

started = false;

running = false;

sleep = 100;

}

protected void work(){

7.3 JavaBean应用实例

try {

Thread.sleep(sleep);

counter++;

sum += counter;

} catch (InterruptedException e) {

setRunning(false);

}

}

public synchronized int getPercent() {

return counter;

}

public synchronized boolean isStarted() {

return started;

}

public synchronized boolean isCompleted() {

return counter == 100;

}

public synchronized boolean isRunning() {

return running;

}

public synchronized void setRunning(boolean running) {

this.running = running;

if (running)

started = true;

}

public synchronized Object getResult() {

if (isCompleted())

return new Integer(sum);

else

return null;

}

public void run() {

try {

setRunning(true);

while (isRunning() && !isCompleted())

work();

} finally {

setRunning(false);

}

}

209

7.3 JavaBean应用实例

210

}

2.启动任务

start.jsp启动一个专用的线程来运行“繁重的任务”,然后把HTTP请求传递给

status.jsp。start.jsp页面利用标记创建一个TaskBean的实例,将scope属性定义为session,使得对于来自同一浏览器的HTTP请求,其他页面也能提取到同一个Bean对象。start.jsp通过调用session.removeAttribute("task")确保创建了一个新的Bean对象,而不是提取一个旧对象(例如,同一个用户会话中更早的JSP页面所创建的Bean对象)。

下面是start.jsp页面的代码:

<%@ page contentType="text/html; charset=gb2312" import="java.sql.*" errorPage="" %>

<% session.removeAttribute("task");%>

<% task.setRunning(true);%>

<% new Thread(task).start();%>

start.jsp创建并设置好TaskBean对象之后,接着创建一个Thread,并将Bean对象作为一个Runnable实例传入。调用start()方法时新创建的线程将执行TaskBean对象的run()方法。

于是有两个线程在并发执行:执行JSP页面的线程(称之为“JSP线程”),由JSP 页面创建的线程(称之为“任务线程”)。接下来,start.jsp调用status.jsp,status.jsp显示出进度条以及任务的执行情况。注意status.jsp和start.jsp在同一个JSP线程中运行。

start.jsp在创建线程之前就把TaskBean的running标记设置成了true,这样,即使当JSP线程已开始执行status.jsp而任务线程的run()方法尚未启动,也能够确保用户会得到“任务已开始运行”的状态报告。

将running标记设置成true、启动任务线程这两行代码可以移入TaskBean构成一个新的方法,然后由JSP页面调用这个新方法。一般而言,JSP页面应当尽量少用Java代码,即我们应当尽可能地把Java代码放入Java类。不过本例中我们不遵从这一规则,把new Thread(task).start()直接放入start.jsp突出表明JSP线程创建并启动了任务线程。

在JSP页面中操作多线程必须谨慎,注意JSP线程和其它线程实际上是并发执行的,就像在桌面应用程序中,我们用一个线程来处理GUI事件,另外再用一个或多个线程来处理后台任务。不过在JSP环境中,考虑到多个用户同时请求某一个页面的情况,同一个JSP页面可能会在多个线程中同时运行;另外,有时同一个用户可能会向同一个页面发出多个请求,虽然这些请求来自同一个用户,它们也会导致服务器同时运行一个JSP页面的多个线程。

3.任务进度

status.jsp页面利用一个HTML进度条向用户显示任务的执行情况。首先,status.jsp 利用标记获得start.jsp页面创建的Bean对象:

7.3 JavaBean应用实例

class="test.barBean.TaskBean"/>

为了及时反映任务执行进度,status.jsp会自动刷新。JavaScript代码setTimeout("location='status.jsp'", 1000)将每隔1000毫秒刷新页面,重新请求status.jsp,不需要用户干预。

if (task.isRunning()) {

}

进度条实际上是一个HTML表格,包含10个单元——即每个单元代表任务总体的10%进度。任务执行情况分下面几种状态:正在执行、已完成、尚未开始、已停止。页面底部提供了一个按钮,用户可以用它来停止或重新启动任务。只要不停止任务,约10秒后浏览器将显示出计算结果5050。

status.jsp代码如下:

<%@ page contentType="text/html; charset=gb2312" import="java.sql.*" errorPage="" %>

class="test.barBean.TaskBean"/>

JSP进度条

<% //

if (task.isRunning()) { %>

<% } %>

JSP进度条

结果: <%= task.getResult()%>

<% int percent = task.getPercent(); %>

211

7.3 JavaBean应用实例

212 <%= percent %>%

BORDER=0 CELLPADDING=0 CELLSPACING=2>

<% for (int i = 2; i <= percent; i += 2) { %>

<% } %>

<% for (int i = 100; i > percent; i -= 2) { %>

<% } %>

  

<% if (task.isRunning()) { %>

正在执行

<% } else { %>

<% if (task.isCompleted()) { %>

完成

<% } else if (!task.isStarted()) { %>

尚未开始

<% } else { %>

已停止

<% } %>

<% } %>


<% if (task.isRunning()) { %>

<% } else { %>

7.3 JavaBean 应用实例

213

<% } %>

4.停止任务

stop.jsp 页面把running 标记设置成false ,从而停止当前的计算任务:

class="test.barBean.TaskBean"/>

<% task.setRunning(false); %>

注意最早的Java 版本提供了Thread.stop 方法,但JDK 从1.2版开始已经不赞成使用Thread.stop 方法,所以我们不能直接调用Thread.stop()。

第一次运行本文程序的时候,你会看到任务的启动有点延迟;同样地,第一次单击“停止”按钮时也可以看到任务并没有立即停止运行(特别是如果机器配置较低的话,延迟的感觉更加明显),这些延迟都是由于编译JSP 页面导致的。编译好JSP 页面之后,应答速度就要快多了。

运行效果如图7.3所示。

图7.3 进度条显示效果

5.实际应用

进度条不仅使得用户界面更加友好,而且对服务器的性能也有好处,因为进度条会不断地告诉用户当前的执行进度,用户不会再频繁地停止并重新启动(刷新)当前的任务。另一方面,创建单独的线程来执行后台任务也会消耗不少资源,必要时可考虑通过一个线程池来实现Thread 对象的重用。另外,频繁地刷新进度页面也增加了网络通信开销,所以务必保持进度页面简洁短小。

本章小结

214 在实际应用中,后台执行的繁重任务可能不允许停止,或者它不能提供详细的执行

进度数据。例如,查找或更新关系数据库时,SQL命令执行期间不允许中途停止,不过如果用户表示他想要停止或中止任务,程序可以在SQL命令执行完毕后回退事务。

估计一个任务需要多少执行时间通常是很困难的,因为它涉及到许多因素,即使用实际测试的办法也无法得到可靠的结论,因为服务器的负载随时都在变化之中。一种简单的办法是测量任务每次执行所需时间,然后根据最后几次执行的平均时间估算。如果要提高估计时间的精确度,应当考虑实现一种针对应用特点的算法,综合考虑多种因素,例如要执行的SQL语句类型等。

本章小结

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

进度条实例表明用JSP、Java、HTML和JavaScript构造进度条是相当容易的,真正困难的是如何将它用到实际应用之中,特别是获得后台任务的进度信息,但这个问题没有通用的答案,每一种后台执行的任务都有它自己的特点,必须按照具体情况具体分析。

课后习题

一.填空题

1.JavaBean 是一种语言写成的可重用组件

2. EJB的全称是。

3.setXXX 方法和getXXX 方法的作用是。

4.JavaBean有3个接口面分别是、、

5.如果只让当前JSP页面调用,则在该目录下新建文件夹,命名为,注意不能使用其他名称。同时在创建好的文件夹下再建立一个文件夹,命名为。二.选择题

1.JavaBean就是()

A Java类文件

B JSP文件

C Servlet文件

D HTML文件

2.为了在JSP页面中使用JavaBean,我们必须使用的JSP动作标签是()

课后习题

A param

B useBean

C plugin

D forword

3. 为了使JavaBean可以被其他类访问,类的属性一般定义为()

A public

B private

C protected

D static

三.简答题

1.什么是JavaBean?什么叫非可视化的JavaBean?

2.简述JavaBean与EJB的主要区别?

3.JavaBean要完成的任务是什么,有哪些作用?

四.操作题

1.设计一个帐户登录系统,要求在前页(login.jsp)输入帐户信息,然后在验证页(login_confirm.jsp)通过调用JavaBean来获取前页表单提交的参数,并查询数据库进行验证。

2.请把第六章分页显示实例中的listUser_01.jsp页面改成使用JavaBean与数据库连接。

215

第七章------管理沟通

第七章管理沟通 第七章管理沟通 ?7.1组织沟通原理 ?7.2群体决策 ?7.3改善管理沟通 7.1组织沟通原理 阿维安卡52航班的悲剧 ?仅仅几句话就能决定生与死的命运?1990年1月25日恰恰发生了这种事件。那一天,由于阿维安卡52航班飞行员与纽约肯尼迪机场航空交通管理员之间的沟通障碍,导致了一场空难事故,机上73名人员全部遇难。 ?1月25日晚7点40分,阿维安卡52航班飞行在南新泽西海岸上空11,277.7米的高空。机上的油量可以维持近两个小时的航程,在正常情况下飞机降落至纽约肯尼迪机场仅需不到半小时的时间,可以说飞机上的油量足够维持飞机的飞行直至降落。然而,此后发生了一系列耽搁。晚上8点整,机场管理人员通知52航班,由于严重的交通问题,他们必须在机场上空盘旋待命。晚上8点45分,52航班的副驾驶员向肯尼迪机场报告他们的“燃料快用完了”。管理员收到了这一信息,但在晚上9点24分之前,没有批准飞机降落。在此之前,阿维安卡机组成员再没有向肯尼迪机场传递任何情况十分危急的信息。 晚上9点24分,由于飞行高度太低以及能见度太差,飞机第一次试降失败。当机场指示飞机进行第二次试降时,机组成员再次提醒燃料将要用尽,但飞行员却告诉管理员新分配的跑道“可行”。晚上9点32分,飞机的两个引擎失灵,1分钟后,另两个也停止工作,耗尽燃料的飞机于晚上9点34分坠毁于长岛。 调查人员找到了失事飞机的黑匣子,并与当事的管理员进行了交谈,他们发现导致这场悲剧的原因是沟通的障碍。 ?首先,飞行员一直说他们“燃料不足”,交通管理员告诉调查者这是飞行员们经常使用的一句话。当时间延误时,管理员认为每架飞机都存在燃料问题。但是,如果飞行员发出“燃料危急”的呼声,管理员有义务优先为其导航,并尽可能迅速地允许其着陆。遗憾的是,52航班的飞行员从未说过“情况紧急”,所以肯尼迪机场的管理员一直未能理解到飞行员所面对的是真正的困境。 其次,飞行员的语调也并未向管理员传递燃料紧急的严重信息。许多管理员接受过专门的训练,可以在各种情境下捕捉到飞行员声音中极细微的语调变化。尽管机组成员相互之间表现出对燃料问题的极大忧虑,但他们向机场传达信息的语调却是冷静而职业化的。 最后,飞行员的文化、传统以及职业习惯也使飞行员不愿意声明情况紧急。如正式报告紧急情况之后,飞行员需要写出大量的书面汇报;同时,如果发现飞行员在计算飞行油量方面疏忽大意,联邦飞行管理局就会吊销其驾驶执照。这些消极措施极大地阻碍了飞行员发出紧急呼救的信息。在这种情况下,飞行员的专业技能和荣誉感不必要地变成了决定生死命运的赌注。 3.沟通的层次 ?沟通是信息交换的过程。通常意义的层次: ?个人内部沟通:自我对话、自己与自己交流的过程 ?人际沟通:发生在两个人或熟人之间的信息传递与相互理解过程。 ?群体沟通:群体成员之间的意义分享和目标整合过程。

第七章 作业管理与接口习题及答案

第七章作业管理与接口习题及答案 一、填空题 1.作业是由① 、② 和③ 组成的。 【答案】①程序、②数据、③作业说明书 【解析】从用户的角度看,作业是在一次应用业务处理过程中,从输入开始到输出结束,用户要求计算机所作的有关该次业务处理的全部工作。从系统的角度看,作业是一个比程序更广泛的概念,它由程序、数据和作业说明书组成。系统通过作业说明书控制文件形式的程序和数据,使之执行和操作。 2.批处理系统中,是以① 为单位把程序和数据调入② 以便执行。 【答案】①作业,②内存 【解析】从系统的角度看,作业是批处理系统抢占内存的单位,而分时系统不存在作业的概念。 3.处理机调度算法中:“相应比高者优先”其相应比是采用公式: 相应比=确定的。 【答案】响应比=(等待时间+计算时间)/计算时间 【解析】本算法的思想是对“计算时间”短的小作业优先处理;对“等待时间”长的作业,即使该作业“计算时间”不是很短,也可得到较高的响应比,获得运行的机会。 二、单项选择题 1.在一个以批处理为主的系统中,为了保证系统的吞吐率,总是要力争缩短用户作业的。 (A)周转时间(B)运行时间 (C)提交时间(D)完成时间 【答案】(A) 【解析】周转时间是衡量批处理系统的重要指标。 2.作业在系统中存在与否的唯一标志是。 (A)源程序(B)作业说明书 (C)作业控制块(D)目的程序 【答案】(C) 【解析】系统是根据作业控制块 JCB来感知作业的存在的。 3.作业调度从处于① 状态的队列中选取适当的作业投入运行。从作业提交给系统到作业完成的时间间隔叫做② 。③ 是指作业从进入后备队列到被调度程序选中时的时间间隔。 (A)运行(B)提交 (C)后备(D)完成 (E)停止(F)周转时间 (G)响应时间(H)运行时间 (I)等待时间(J)触发时间 【答案】①(C),②(F),③(I) 4.在批处理系统中,周转时间是。 (A)作业运行时间(B)作业等待时间和运行时间之和

高中物理必修二第七章知识点总结

高中物理必修二第七章 知识点总结 -CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN

2 第七章机械能知识点总结 一、功 1概念:一个物体受到力的作用,并在力的方向上发生了一段位移,这个力就对 物体做了功。功是能量转化的量度。 2条件:. 力和力的方向上位移的乘积 3公式:W=F S cos θ W ——某力功,单位为焦耳(J ) F ——某力(要为恒力),单位为牛顿(N ) S ——物体运动的位移,一般为对地位移,单位为米(m ) θ——力与位移的夹角 4功是标量,但它有正功、负功。 某力对物体做负功,也可说成“物体克服某力做功”。 当)2 ,0[πθ∈时,即力与位移成锐角,功为正;动力做功; 当2π θ=时,即力与位移垂直功为零,力不做功; 当],2 (ππ θ∈时,即力与位移成钝角,功为负,阻力做功; 5功是一个过程所对应的量,因此功是过程量。 6功仅与F 、S 、θ有关,与物体所受的其它外力、速度、加速度无关。 7几个力对一个物体做功的代数和等于这几个力的合力对物体所做的功。 即W 总=W 1+W 2+…+Wn 或W 总= F 合Scos θ 8 合外力的功的求法: 方法1:先求出合外力,再利用W =Fl cos α求出合外力的功。

3 方法2:先求出各个分力的功,合外力的功等于物体所受各力功的代数和。 二、功率 1概念:功跟完成功所用时间的比值,表示力(或物体)做功的快慢。 2公式:t W P =(平均功率) θυcos F P =(平均功率或瞬时功率) 3单位:瓦特W 4分类: 额定功率:指发动机正常工作时最大输出功率 实际功率:指发动机实际输出的功率即发动机产生牵引力的功率,P 实≤P 额。 5分析汽车沿水平面行驶时各物理量的变化,采用的基本公式是P =Fv 和F-f = ma 6 应用: (1)机车以恒定功率启动时,由υF P =(P 为机车输出功率,F 为机车牵引力,υ为机车前进速度)机车速度不断增加则牵引力不断减小,当牵引力f F =时,速度不再增大达到最大值m ax υ,则f P /max =υ。 (2)机车以恒定加速度启动时,在匀加速阶段汽车牵引力F 恒定为f ma +,速度不断增加汽车输出功率υF P =随之增加,当额定P P =时,F 开始减小但仍大于f

《离散数学》第七章 图的基本概念 讲稿

7.1 无向图及有向图 一、本节主要内容 无向图与有向图 顶点的度数 握手定理 简单图 完全图 子图 补图 二、教学内容 无序对: 两个元素组成的二元组(没有顺序),即 无论a,b是否相同,(a,b )=(b, a )无序积: A与B 为两个集合,A&B={(x,y) | x∈A∧y∈B} 例A={a1, a2}, B={b1, b2} A&B={(a1 , b1 ), (a1 , b2 ) ,(a2 , b1 ) ,(a2 , b2 )} A&A={(a1 , a1 ), (a1 , a2 ) ,(a2 , a2 )} 多重集合: 元素可以重复出现的集合 无向图与有向图 定义无向图G=, 其中 (1) V?≠为顶点集,元素称为顶点 (2) E为V&V的多重子集,其元素 称为无向边,简称边. 例如, G=如图所示, 其中V={v1, v2, …,v5}, E={(v1,v1), (v1,v2), (v2,v3), (v2,v3), (v2,v5), (v1,v5), (v4,v5)} 定义无向图G=, 其中 (1) V≠?为顶点集,元素称为顶点 (2) E为V&V的多重子集,其元素 称为无向边,简称边. 例如, G=如图所示, 其中V={v1, v2, …,v5}, E={(v1,v1), (v1,v2), (v2,v3), (v2,v3), (v2,v5), (v1,v5), (v4,v5)} 无向图与有向图(续) 定义有向图D=, 其中 (1) V同无向图的顶点集, 元素也称 为顶点 (2) E为V?V的多重子集,其元素

病因病机试题教案资料

病因病机试题

第六章病因与发病 一、单项选择题:1、提出“三因学说”的是:() A、内经 B、难经 C、陈无择 D、张仲景 2、具有发病迅速,传变也较快的病邪是:() A、寒邪 B、风邪 C、火邪 D、暑邪 3、寒邪引起肢体屈伸不利的病机是:() A、寒易伤阳,肢体不温 B、寒主凝滞,气血阻滞 C、寒主收引,筋脉收缩挛急 D、寒伤脾阳,肌肉失养 4、“中寒”是指:() A、内寒 B、感受外寒 C、寒伤肌表,郁遏卫阳 D、寒邪直中于里,伤及脏腑阳气 5、病程缠绵,反复发作的病邪是:() A、暑邪 B、湿邪 C、寒邪 D、燥邪 6、火邪致病易:() A、伤肺耗津 B、生风动血 C、阻遏气机 D、收引疼痛 7、其性粘滞,趋下的病邪是:() A、湿邪 B、火邪 C、寒邪 D、风邪 8、有明显季节性的病邪为:() A、风邪 B、火邪 C、湿邪 D、暑邪 9、燥邪致病特点有:() A、生风动血 B、病程缠绵 C、伤肺耗津 D、易致肿疡 10、其性炎上,燔灼的病邪是:() A、风邪 B、寒邪 C、火邪 D、燥邪 11、多挟湿邪为患的病邪是:() A、寒邪 B、风邪 C、火邪 D、暑邪 12、出现各种秽浊症状,为何邪致病特点:() A、火邪 B、暑邪 C、湿邪 D、寒邪 13、易致各种出血的病邪为:() A、风邪 B、火邪 C、暑邪 D、燥邪 14、疫疠多通过什么途径感染:() A、侵犯肌表 B、空气传染,从口鼻入 C、经络 D、脏腑 15、恐伤:() A、心 B、肝 C、脾 D、肾 16、思伤:() A、心 B、肝 C、脾 D、肾 17、忧伤:()

A、心 B、肝 C、肺 D、脾 18、喜伤:() A、心 B、肝 C、肺 D、脾 19、怒伤:() A、心 B、肝 C、肺 D、脾 20、导致“气乱”的情志因素是:() A、喜 B、怒 C、惊 D、恐 21、耗伤心神,损伤脾气的情志因素为:() A、喜 B、怒 C、忧 D、思 22、劳则:() A、气结 B、气耗 C、气乱 D、气消 23、痰饮的形成,多与何脏腑有关:() A、心肺脾肾 B、肺脾肾三焦 C、心肝脾肾 D、心肺肝脾 24、肌肤甲错,为何证的临床表现:() A、痰 B、饮 C、瘀血 D、疫疠 25、什么是发病的内在根据:() A、正气不足 B、邪气 C、阴阳失调 D、脏腑紊乱 26、什么是发病的重要条件:() A、正气不足 B、邪气 C、阴阳失调 D、脏腑紊乱 27、瘰疠属何病邪的病证特点:() A、饮 B、痰 C、瘀血 D、饮食不节 28、怒则:() A、气下 B、气乱 C、气结 D、气上 29、恐则:() A、气下 B、气乱 C、气结 D、气上 30、思虑过度,劳伤:() A、心肝 B、肝脾 C、心脾 D、心肾 二、多项选择题:1、以下哪些属六淫致病的特点:() A、与居住环境有关 B、直接影响脏腑所机 C、从口鼻而入 D、与季节有关 E、多侵犯肌表 2、属阴邪的病邪有:() A、风邪 B、寒邪 C、燥邪 D、暑邪 E、湿邪 3、疫疠的致病特点有:() A、易于流行 B、传染性强 C、症状相似 D、发病急骤 E、易致肿疡 4、“内生五邪”即:() A、内风 B、内暑 C、内寒 D、内火 E、内湿 5、疫疠的发生与流行,多与何因素有关:()

第七章作业-详细解答

7.4 7.5 哇!开始振荡了...... 7.6 D 触发器的特征方程:Q* = D 带使能端的T 触发器的特征方程:Q* = Q ⊕EN 为了将其转化为D 触发器的特征方程,需要使 Q ⊕EN = D ,可利用等式 A ⊕A ⊕B = B 于是,令T 触发器的EN = Q ⊕D , 代入T 触发器的特征方程得:Q* = Q ⊕EN = Q ⊕(Q ⊕D) = D 逻辑电路图如下: 7.7 J-K 触发器的特征方程:Q* = J·Q ’ + K ’·Q 带使能端的T 触发器的特征方程:Q* = Q ⊕EN 为了将其转化为J-K 触发器的特征方程,需要使 Q ⊕EN = J·Q ’ + K ’·Q ,可利用等式 A ⊕A ⊕B = B Q QN Q QN

于是,令T触发器的EN = Q⊕(J·Q’ + K’·Q) 代入T触发器的特征方程:Q* = Q⊕EN = Q⊕(Q⊕(J·Q’ + K’·Q)) = J·Q’ + K’·Q 现在来化简EN = Q⊕(J·Q’ + K’·Q) = Q · (J·Q’ + K’·Q)’ + Q’· (J·Q’ + K’·Q) = Q · (J’+Q) · (K+Q’) + J·Q’ = K·Q + J·Q’ 逻辑电路图如下: 7.12 激励方程:D1 = Q1’ + Q2 D2 = X · Q2’输出方程:Z = Q1 + Q2’ 状态/输出表 【说明:黑色表示当前状态,绿色表示当前输入,蓝色表示当前输出,红色表示下一状态】 7.13 【说明:此题中文版翻译有误,正确说法是:将题7.12中的与门改成与非门,或门改成或非门,并且交换每个触发器的Q和QN输出端。】 替换后的逻辑电路图如下所示:

高中物理必修二第七章知识点总结资料

第七章机械能知识点总结 一、功 1概念:一个物体受到力的作用,并在力的方向上发生了一段位移,这个力就对物体做了功。功是能量转化的量度。 2条件:. 力和力的方向上位移的乘积 3公式:W=F S cos θ --某力功,单位为焦耳() --某力(要为恒力),单位为牛顿() S--物体运动的位移,一般为对地位移,单位为米(m) --力与位移的夹角 4功是标量,但它有正功、负功。 某力对物体做负功,也可说成"物体克服某力做功"。 当时,即力与位移成锐角,功为正;动力做功; 当时,即力与位移垂直功为零,力不做功; 当时,即力与位移成钝角,功为负,阻力做功; 5功是一个过程所对应的量,因此功是过程量。 6功仅与F、S 、θ有关,与物体所受的其它外力、速度、加速度无关。 7几个力对一个物体做功的代数和等于这几个力的合力对物体所做的功。 即W总=W1+W2+...+Wn 或W总= F合Scos θ 8 合外力的功的求法: 方法1:先求出合外力,再利用W=Flcosα求出合外力的功。 方法2:先求出各个分力的功,合外力的功等于物体所受各力功的代数和。 二、功率 1概念:功跟完成功所用时间的比值,表示力(或物体)做功的快慢。 2公式:(平均功率) (平均功率或瞬时功率) 3单位:瓦特W 4分类: 额定功率:指发动机正常工作时最大输出功率 实际功率:指发动机实际输出的功率即发动机产生牵引力的功率,P实≤P额。 5分析汽车沿水平面行驶时各物理量的变化,采用的基本公式是P=Fv和F-f = ma 6 应用: (1)机车以恒定功率启动时,由(为机车输出功率,为机车牵引力,为机车前进速度)机车速度不断增加则牵引力不断减小,当牵引力时,速度不再增大达到最大值,则。 (2)机车以恒定加速度启动时,在匀加速阶段汽车牵引力恒定为,速度不断增加汽车输出功率随之增加,当时,开始减小但仍大于因此机车速度继续增大,直至时,汽车便达到最大速度,则。 三、重力势能

第7章作业参考答案

第7章:面向对象分析 学号______________ 姓名_________________ 一、综合题 王大夫在小镇上开了一家牙科诊所。他有一个牙科助手,一个牙科保健员和一个接待员。王大夫需要一个软件系统来管理预约。 当病人打电话预约时,接待员将查阅预约登记表,如果病人申请的就诊时间与已定下预约时间冲突,则接待员建议一个就诊时间以安排病人尽早得到诊治。如果病人同意建议的就诊时间,接待员交输入预约时间和病人的名字。系统将核实病人的名字并提供记录的病人数据,数据包括病人的病历号等。在每次治疗或清洗后,助手或保健员将标记相应的预约诊治已经完成,如果必要的话会安排病人下一次再来。 系统将能够按病人姓名和按日期进行查询,能够显示记录的病人数据和预约信息。接待员可以取消预约,可以打印前两天预约尚未接诊的病人清单。系统可以从病人记录中获知病人的电话号码。接待员还可以打印出关于所有病人的每天和每周的工作安排。 要求: 1、建立牙科诊所管理系统的对象模型; 从对牙科诊所问题的陈述中,可以找出下列名词作为对象的候选者: 王大夫、小镇、牙科诊所、牙科助手、牙科保健员、接待员、软件系统、预约、病人、预约登记表、就诊时间、预约时间、约定时间、系统、名字、记录的病人数据、病历号、姓名、日期、预约信息、病人清单、病人记录、电话号码、每天工作安排、每周工作安排。 其中许多并非问题域中真正的有意义的对象。 王大夫只是牙医的实例,本系统主要功能是管理病人的预约,并不具体处理诊所中具体的工作人员的分工。因此,“牙医、牙科助手、牙科保健员和接待员”都不问题域中的对象。 “小镇”是牙科诊所的地址属性,不是独立的对象; “软件系统”和“系统”是同义词,是将要开发的软件产品,不

第7章习题解答

习 题 7-1为什么一般矩形波导测量线的槽开在波导宽壁的中线上? 答:因为矩形波导一般工作于10TE 模,由10TE 模的管壁电流知,在矩形波导宽壁中线处只有纵向电流,因此沿波导宽壁的中线开槽不会切断高频电流的通路,不会破坏波导内的场结构,也不会引起波导内的电磁波向外辐射能量。 7-2 推导矩形波导中mn TE 波的场量表达式。 7-3 已知空气填充的矩形波导截面尺寸为2 1023mm b a ?=?,求工作波长mm 20=λ时, 波导中能传输哪些模式?mm 30=λ时呢? 解:矩形波导的截止波长2 2 c 2?? ? ??+??? ??= b n a m πππλ 当0,1==n m 时,mm a C 462==λ, 1,0==n m 时,mm b C 202==λ, 0,2==n m 时,mm a C 23==λ, 1,1==n m 时,mm b a 34.181******** 2 2 2 c =?? ? ??+??? ??= ?? ? ??+??? ??= πππλ 满足电磁波在波导中传播条件c λλ<的模式有10TE 、01TE ;当mm 30=λ时,只能传输10TE 模。 7-4 已知空气填充的矩形波导截面尺寸为248cm b a ?=?,当工作频率GHz 5=f 时,求波 导中能传输哪些模式?若波导中填充介质,传输模式有无变化?为什么? 解: cm f C 610 5103910 =??==λ, 矩形波导的截止波长2 2 c 2?? ? ??+??? ??= b n a m πππλ, 当0,1==n m 时,cm a C 162==λ,

1,0==n m 时,cm b C 82==λ, 0,2==n m 时,cm a C 8==λ, 2,0==n m 时,cm b C 4==λ 1,1==n m 时,mm b a 15.74181222 2 2 2 c =?? ? ??+??? ??= ?? ? ??+??? ??= πππλ 满足电磁波在波导中传播条件c λλ<的模式有10TE 、01TE 、20TE 、11TE 、11TM ; 若波导中填充介质,工作波长变短,所以传输模式增多。 7-5 已知矩形波导的尺寸为 b a ?,若在0≥z 区域中填充相对介电常数为r ε的理想介质, 在0