admin 管理员组

文章数量: 887021


2024年1月16日发(作者:html基础教程制作服装推广)

优质文档

第5章 JSP中使用JavaBean

5.1 JavaBean的基本概念

5.2 在JSP中使用JavaBean

5.3 在JavaBean中连接数据库

5.4 使用SQL Server数据库的通用方法

5.1 JavaBean的基本概念

在90年代末期,基于组件的软件开发的思想开始得到了普遍的重视和应用。

软件组件就是指可以进行独立分离、易于重复使用的软件部分。JavaBean就是一种基于Java平台的软件组件思想。JavaBean也是一种独立于平台和结构的应用程序编程接口(API)。JavaBean保留了其他软件组件的技术精华,并增加了被其他软件组件技术忽略的技术特性,使得它成为完整的软件组件解决方案的基础,并在可移植的Java平台上方便地用于网络世界中。

其实你可以把组件理解成为童年时玩的积木,而把用组件搭起来的软件则可以理解成为你用积木搭的形状各异的作品。这种比喻也许可以让你理解为什么用组件搭建应用程序会比其他方法制作应用程序更加稳定和快速。因为软件的组件是可重用的,所以它肯定是经过了很多应用程序的测试,所以当你用它的时候出错的概率肯定比你自己重新写一个同样功能的模块的出错概率小。而用组件搭建应用程序同时也会更快速,这很容易理解,就像你用积木搭一座桥比你自己用木头做一座桥要快一样。

JavaBean也是一个很成功的组件模型,JBuilder提供许多方便的控件,而这些控件几乎都是JavaBean。

虽然JavaBean和Java之间已经有了明确的界限,但是在某些方面JavaBean和Java之间仍然存在很容易混淆的地方,比如说重用,Java语言也可以为用户创建可重用的对象,但它没有管理这些对象相互作用的规则或标准,用户可以使用在Java中预先建立好的对象,但这必须具有对象在代码层次上的接口的丰富知识。而对于JavaBean,用户可以在应用程序构造器工具中使用各种JavaBean组件,而不需要编写任何代码。这种同时使用多个组件而不考虑其初始化情况的功能是对当前Java模型的重要扩展,所以也可以说JavaBean是在组件技术上对Java语言的扩展。

如果真的要明确的定义,那么JavaBean的定义是:JavaBean是可复用的平台独立的软件组件,开发者可以在软件构造器工具中对其直接进行可视化操作。在上面的定义中,软件构造器可以是Web页面构造器、可视化应用程序构造器、GUI设计构造器或服务器应用程序构造器。而JavaBean可以是简单的GUI要素,如按钮和滚动条;也可以是复杂的可视化软件组件,如数据库视图。有些JavaBean是没有GUI表现形式的,但这些JavaBean仍然可以使用应用程序构造器可视化地进行组合,比如JBuilder上的很多控件其实也是没有GUI形式的,相信能就一定能

优质文档

但是你仍然可以拖放它们以在你的应用程序里生成相应的代码。一个JavaBean和一个Java Applet很相似,是一个非常简单的遵循某种严格协议的Java类。

JavaBean具有Java语言的所有优点,比如跨平台等等,但它又是Java在组件技术方面的扩展,所以说很多方面它和Applet很像,Applet也具有Java语言的所有优点,同时也是Java在浏览器端程序方面的扩展。其实它们都是严格遵循某种协议的Java类,它们的存在都离不开Java语言的强大支持。

从基本上来说,JavaBean可以看成是一个黑盒子,即只需要知道其功能而不必管其内部结构的软件设备。黑盒子只介绍和定义其外部特征和与其他部分的接口,如按钮、窗口、颜色、形状等。作为一个黑盒子的模型,以把JavaBean看成是用于接受事件和处理事件以便进行某个操作的组件建筑块。

5.1.1 JavaBean的属性

JavaBean提供了高层次的属性概念,属性在JavaBean中不只是传统的面向对象的概念里的属性,它同时还得到了属性读取和属性写入的API的支持。属性值可以通过调用适当的bean方法进行。比如,可能bean有一个名字属性,这个属性的值可能需要调用String getName()方法读取,而写入属性值可能要需要调用void setName(String str)的方法。

每个JavaBean属性通常都应该遵循简单的方法命名规则,这样应用程序构造器工具和最终用户才能找到JavaBean提供的属性,然后查询或修改属性值,对bean进行操作。JavaBean还可以对属性值的改变作出及时的反应。比如一个显示当前时间的JavaBean,如果改变时钟的时区属性,则时钟会立即重画,显示当前指定时区的时间。

Bean的属性描述其外观或者行为特征,如颜色、大小等。属性可以在运行时通过get/set方法取得和设置。最终用户可以通过特定属性的get/set方法对其进行改变。例如,对于Bean的颜色属性,最终用户可以通过Bean提供的属性对话框改变这个颜色属性。

属性可以分为以下四类:

Simple简单的

Index索引的

Bound绑定的

Constrained约束的

简单属性依赖于标准命名约定来定义getXXX()方法和setXXX()方法。索引属性则允许读取和设置整个数组,也允许使用数组索引单独地读取和设置数组相信能就一定能

优质文档

元素。绑定属性则是其值发生变化时要广播给属性变化监听器的属性。约束属性则是那些值发生改变及起作用之前,必须由约束属性变化监听器生效的属性。

1.简单属性

简单类型属性的设计模板

布尔型:

设置器:public void set<属性名> (boolean bl ){}

获取器:public boolean is<属性名>(){}

其它类型的属性的设计模板如下:

设置器:public void set<属性名>( <属性类型> x ){}

获取器:public <属性类型> get<属性名>( ){}

数组属性的设计模板

单个元素的设计模板:

设置器:public void set<属性名>( int i ,<属性元素类型> x ){}

获取器:public <属性元素类型> get<属性名>( int i ){}

整个数组的设计模板:

设置器:public void set<属性名>( <属性元素类型> [] x){}

获取器:public <属性元素类型>[] get<属性名>( ){}

对于简单属性,不需要另外的附加类或接口。

颜色的改变实际上是通过下面的方法实现的:

public Color getFillColor();

public void SetFillColor(Color c);

这种基本的get/set方法命名规则定义的属性叫做简单属性。简单属性中有一类用boolean值表示的属性叫布尔属性。

教材例程5-1,

package 5;

public class SimpleBean

{

相信能就一定能

优质文档

//type为属性的名字,类型是String

private String type;

//boolean的debug属性

private boolean debug=false;

//getXXX方法,返回这个属性的值

public String getType()

{

return ;

}

//setXXX方法,设置这个属性的值。

public void setType(String type)

{

=type;

}

//对于boolean类型的属性,可以使用isXXX方法来获得属性

public boolean isDebug()

{

return ;

}

//设置boolean类型的属性。

public void setDebug(boolean debug)

{

=debug;

}

}

2.索引属性

JavaBean API还支持索引属性,这种属性与传统Java编程中的数组非常类似。索引属性包括几个数据类型相同的元素,这些元素可以通过一个整数索引值来访问,因此称为索引属性。属性可以索引成支持一定范围的值,这种属性属于简单属性。索引用int指定。索引属性有4种访问方式,其数值数组可以一个元素访问,也可以整个数组访问:

public void setLabel(int index,String label);

public String getLabel(int index);

public void setLabel(String []labels);

public String []getLabels();

相信能就一定能

优质文档

与标准的Java数组类似索引值可能会在索引属性数组的范围之外。这时,用于操作索引属性的访问者方法一般是抛出一个ArrayIndexOutOfBoundsException运行环境异常,这个异常与标准Java数组索引超出范围时执行的行为相同。

教材例程5-2,

package 5;

public class IndexBean

{

//type为属性的名字,类型是String

private String[] type=new

String[]{"jsp","ejb","servlet","javamail","jca","jdbc"};

//getXXX方法,返回这个属性的值

public String[] getType()

{

return ;

}

//setXXX方法,设置这个属性的值。

public void setType(String[] type)

{

=type;

}

//另外的设置属性和获得属性值的方法。

public void setType(int index,String value)

{

type[index]=value;

}

public String getType(int index)

{

return type[index];

}

}

3.绑定属性

绑定属性是这样的一种属性,它的改变能以事件的形式通知给对它感兴趣的部分,即事件收听者或目标。很明显,这种属性的作用在于它能使收听者接到其改变事件后根据其中的信息产生一些行为,从而达到两者之间的默契。绑定属性的访问者方法遵循与简单属性相同的形式,就是说单从访问者方法是看不出其与简单属性的区别,但它要另外的附加类或接口以及事件的传播机制的支持(后面,我们会看到这同样适用于约束属性)。

相信能就一定能

优质文档

绑定属性提供一种机制,即通知监听器—个JavaBeans组件的属性发生了改变。监听器实现了PropertyChangeListenor接口并接收由JavaBean组件产生的PropertyChangeEvent对象,PropertyChangeEvent对象对象包括—个届性名字,旧的属性值以及每一个监听器可能要访问的新属性值。

JavaBean组件可以使用PropertyChangeSupport象辅助程序类激活监听器要接收的事件。PropertyChangeSupport对象使用一个指向JavaBean组件实例的引用进行构造,并基于以下事实:

JavaBean实现了addPropenyChangeListener()和removePropenyChangeListener()方法以便加入和删除属性变化监听器。PropertyChangeSupport,firePropertyChange方法可以被使用,并传递属性名、旧值以及新值等信息。如下例所示。

实现一个关联属性涉及到三方,源Bean,目标Bean和协调代码:

源Bean

源Bean必须提供属性变化事件监听器的注册和解册入口:

public void addpropertyChangeListener (propertyChangeListener

pcListener){}

public void removepropertyChangeListener (propertyChangeListener

pcListener){}

如只想通知目标Bean某个特定属性的变化,可用下面特定属性的注册和解册方法:

public void add<属性名>Listener (propertyChangeListener pcListener){}

public void remove<属性名>Listener (propertyChangeListener

pcListener){}

这样,目标Bean只会接到源Bean此属性的变化的事件通知,减少了不必要的信息通信。另外,为了实现关联属性的方便,系统提供了一个帮助者类propertyChangeSupport,源Bean可实例化这个帮助者类,让它来为我们管理和维护收听者列表以及属性变化事件的通知的触发等工作。

目标Bean

目标Bean除了要实现propertyChangeListener接口外,还要用源Bean提供的注册方法注册自己。这样,目标Bean的实现大体框架如下:

public class targetBean implements propertyChangeListener{

protected SourceBean source;

„„

相信能就一定能

优质文档

source=new SourceBean();

pertyChangeListener(this);

public void propertyChange(propertyChangeEvent e){

„„

}

}

协调代码

协调代码的工作职责分为以下几步:

负责创建源Bean和目标Bean;

利用源Bean的属性变化事件监听器的注册入口注册目标Bean;

改变源Bean的属性;

利用源Bean的属性变化事件监听器的解册入口解册目标Bean;

4.约束属性

约束属性也是一种关联属性,同时还加上了附加条件。对于约束属性来说,一个外部对象,无论是监听Bean还是源Bean自身,可以否决属性的变化。JavaBeans API提供了一个处理约束属性的事件机制,它类似于关联属性的事件机制。

约束属性是Beans所支持的最复杂最高级的属性,它允许收听者对属性的改变提出否定意见。

与绑定属性类似,其设计与实现也要涉及到源Bean、目标Bean和协调代码。只要把绑定属性设计中的property改成Vetoable(除了propertyChangeEvent外),不同的是为了能使目标Bean"反对"源Bean属性的变化。Beans提供了一种异常propertyVetoException,只要目标Bean收到属性改变的事件通知后,查看属性的新值,如果不满意,可抛出一个异常,让源Bean放弃改变属性到这个新值的念头,这就是约束属性中给目标Bean增加的"反对权利"。下面的简单源Bean和目标Bean的伪代码表述了约束属性的实现视图。

源Bean

public class SourceBean {

public void addVetoChangeListener (VetoChangeListener vpListener){}

public void removeVetoChangeListener (VetoChangeListener

vpListener){}

相信能就一定能

优质文档

/*由于属性设置器本身不想处理异常,所以我们抛出异常,当然你也可以在属性设置器处理异常,属性变化监听者对属性的变化作出同意还是反对就是通过抛出异常的实现的。*/

public void setName(String n) throws propertyVetoException{

/*从下面目标的代码可能抛出一个异常从而终止代码的执行*/

实例化一个propertyChangeEvent对象

执行属性变化监听者的vetoChange方法

/*如果上面的代码抛出异常,下面这行代码不会被执行,也就是说监听者阻止了属性的变化*/

name=n //修改属性的值

}

}

目标Bean

public class TargetBean implements VetoChangeListener{

public void vetoChange(propertyChangeEvent e) throws

propertyVetoException{

if e中的新值不满意 then

生成 并抛出一个propertyVetoException实例

else

„„

endif

}

}

协调代码

协调代码的工作职责分为以下几步:

负责创建源Bean和目标Bean;

利用源Bean的属性变化事件监听器的注册入口注册目标Bean;

改变源Bean的属性的属性,并捕获异常

利用源Bean的属性变化事件监听器的解册入口解册目标Bean;

相信能就一定能

优质文档

如上图所示,Java语言为Java Bean组件的属性机制提供了良好的基础,这些语言元素包括Java的面向对象技术,接口技术和异常技术等。Java Bean属性命名规则和Java Bean属性设计模板是Java Bean组件的属性机制的规范。遵行这些规范,Java Bean组件的属性可以分为三种:最基本的为简单属性,这种属性只涉及属性所在的Java Bean组件本身;绑定属性涉及到三方,包括源Bean、目标bean和协调代码,源Bean为属性的拥有者,目标bean为属性变化事件的监听者,协调代码负责组织双方,另外源Bean还可能实例化一个propertyChangeSupport对象来管理所有目标Bean,propertyChangeSupport对象的工作主要是保存所有目标Bean实例,并激发这些目标Bean的事件变化监听方法;约束属性在原理上和绑定属性一样,只是增加了目标Bean对源Bean属性变化的"反对权利"。

Java Bean组件技术是建立在Java基础上的组件技术,它继承了其的所有特点(如跨平台和面向对象),又引进了其它组件技术的思想,这两个方面恰好是其能成为后起之秀的主要原因。它所能支持的属性如相关属性和约束属性是其它组件技术所不能及的。

5.1.2 JavaBean的方法

JavaBean中的方法就是通常的Java方法,它可以从其他组件或在脚本环境中调用。默认情况下,所有bean的公有方法都可以被外部调用,但bean一般只会引出其公有方法的一个子集。

由于JavaBean本身是Java对象,调用这个对象的方法是与其交互作用的唯一途径。JavaBean严格遵守面向对象的类设计逻辑,不让外部世界访问其任何字段(没有public字段)。这样,方法调用是接触Bean的唯一途径。

相信能就一定能

优质文档

但是和普通类不同的是,对有些Bean来说,采用调用实例方法的低级机制并不是操作和使用Bean的主要途径。公开Bean方法在Bean操作中降为辅助地位,因为两个高级Bean特性--属性和事件是与Bean交互作用的更好方式。

因此Bean可以提供要让客户使用的public方法,但应当认识到,Bean设计人员希望看到绝大部分Bean的功能反映在属性和事件中,而不是在人工调用和各个方法中。

5.1.3 JavaBeand的事件

Bean与其他软件组件交流信息的主要方式是发送和接受事件。我们可以将bean的事件支持功能看作是集成电路中的输入输出引脚:工程师将引脚连接在一起组成系统,让组件进行通讯。有些引脚用于输入,有些引脚用于输出,相当于事件模型中的发送事件和接收事件。

事件为JavaBean组件提供了一种发送通知给其他组件的方法。在AWT事件模型中,一个事件源可以注册事件监听器对象。当事件源检测到发生了某种事件时,它将调用事件监听器对象中的一个适当的事件处理方法来处理这个事件。

由此可见,JavaBean确实也是普通的Java对象,只不过它遵循了一些特别的约定而已。

JavaBean通过传递事件在Bean之间通信。Bean用一个事件告诉另一个Bean采取一个动作或告诉其状态发生了改变。事件从源听众注册或发表并通过方法调用传递到一个或几个目标听众。

JavaBean的事件模型类似AWT的事件模型。JavaBean中的事件模型是用事件源和事件目标定义的。事件源就是事件的启动者,由它触发一个或多个事件目标。事件源和事件目标建立一组方法,用于事件源调动事件听众。

5.2 在JSP中使用JavaBean

教材例程5-3,

package 5;

public class SimpleCalculator

{

//属性声明

private String first;//第一个操作数

private String second;//第二个操作数

private double result;//操作结果

private String operator;//操作符

相信能就一定能

优质文档

/**

*以下是一些属性方法

*/

public void setFirst(String first)

{

=first;

}

public void setSecond(String second)

{

=second;

}

public void setOperator(String operator)

{

or=operator;

}

public String getFirst()

{

return ;

}

public String getSecond()

{

return ;

}

public String getOperator()

{

return or;

}

//获得计算结果

public double getResult()

{

return ;

}

/**

*根据不同的操作符进行计算

*/

public void calculate()

{

double one=ouble(first);

double two=ouble(second);

try

{

if(("+")) result=one+two;

相信能就一定能

优质文档

else

if(("-"))result=one-two;

else

if(("*"))result=one*two;

else

if(("/"))result=one/two;

}

catch(Exception e)

{

n(e);

}

}

}

调用上述JavaBean的JSP页面代码为:

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

import=".*" errorPage="" %>

class="Calculator">

Untitled Document


计算结果:<%

try{

ate();n(st()+rator()+ond()+"="+ult());

}(Exception e)

{n(sage());

}

%>


相信能就一定能

优质文档

简单的计数器
第一个参数
操作符

第二个参数

5.3 在JavaBean中连接数据库

教材各章使用的数据库有所不同,但都在SQL Server的jspdev库中,若想运行最后的程序,可将文件夹jspdevdatabase下的“新建 Microsoft

Access 应用程序 (2).mdb”在企业管理其中导入到jspdev库中。

本节使用的例子有以下几个:

教材例程5-5,表示用户信息的JavaBean,

// Java Document

package 5;

import ;

public class UserInfo

相信能就一定能

优质文档

{

//属性

private String userid;

private String password;

private String email;

private String name;

private String street;

private String city;

private String state;

private String phone;

private String zipCode;

private String cardNumber;

private int cardType;

private Date expireDate;

private int userLogCount;

private int userType ;

private Date userLastLogTime;

private String fanvcategory;

//getter方法

public String getUserid()

{

return ;

}

public String getEmail()

{

return ;

}

public String getPassword()

{

return rd;

}

public String getState()

{

return ;

}

public String getStreet()

{

return ;

}

public String getCity()

{

return ;

}

相信能就一定能

优质文档

public String getZipCode()

{

return e;

}

public String getPhone()

{

return ;

}

public String getCardNumber()

{

return mber;

}

public int getCardType()

{

return pe;

}

public Date getExpireDate()

{

return Date;

}

public int getUserType()

{

return pe;

}

public String getFanvcategory()

{

return tegory;

}

public String getName()

{

return ;

}

public int getUserLogCount()

{

return gCount;

}

//setter方法

public void setUserid(String c)

{

=c;

}

public void setName(String c)

{

相信能就一定能

优质文档

=c;

}

public void setEmail(String c)

{

=c;

}

public void setState(String c)

{

=c;

}

public void setStreet(String c)

{

=c;

}

public void setCity(String c)

{

=c;

}

public void setZipCode(String c)

{

e=c;

}

public void setPhone(String c)

{

=c;

}

public void setFanvcategory(String c)

{

tegory=c;

}

public void setUserType(int c)

{

pe=c;

}

public void setPassword(String c)

{

rd=c;

}

public void setCardNumber(String c)

{

mber=c;

相信能就一定能

优质文档

}

public void setCardType(int c)

{

pe=c;

}

}

教材例程5-6,执行数据库操作的JavaBean,

package 5;

import verDriver;

import .*;

public class UserRegist

{

private UserInfo userInfo;

private Connection con;

//获得数据库连接。

public UserRegist()

{

String

CLASSFORNAME="verDriver";

String

SERVANDDB="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev";

String USER="bn";

String PWD="bn";

try

{

e(CLASSFORNAME);

con =

nection(SERVANDDB,USER,PWD);

}

catch(Exception e)

{

tackTrace();

}

}

//设置待注册的用户信息。

public void setUserInfo(UserInfo userInfo)

{

fo=userInfo;

}

相信能就一定能

优质文档

//进行注册

public void regist()throws Exception

{

String reg="insert into user_Info

values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

try

{

PreparedStatement

pstmt=eStatement(reg);

ing(1,rid());

ing(2,e());

ing(3,ne());

ing(4,eet());

ing(5,te());

ing(7,y());

ing(6,Code());

ing(8,il());

ing(9,dNumber());

(10,dType());

(11,0);

e(12,new (new

().getTime()));

(13,1);

(14,neropt());

ing(15,vcategory());

ing(16,sword());

eUpdate();

}

catch(Exception e)

{

tackTrace();

throw e;

}

}

教材例程5-7,填写用户信息的JSP页面,

<%@ include file=""%>

<%@ include file=""%>

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

errorPage="" %>

Untitled Document

相信能就一定能

优质文档

href="" type=text/css rel=stylesheet>

用户注册

相信能就一定能

优质文档

相信能就一定能

优质文档

用户名:

width=1 border=0>

密码:
确认密码:

name="confirmpassword">

真实姓名:
电话:
email:
街道:
城市:
省:
邮编:
信息卡信息:
卡号:
开户银行:
个人定制信息:
喜欢的图类别:

是否需要在提供购物时的提示:

value="1">

onClick="return RgTest()">

相信能就一定能

优质文档

教材例程5-8,信息注册执行页面,

<%@ page language="java" errorPage=""

import="5.*"%>

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

scope="page">

scope="page"/>

用户信息注册页面

<%

rInfo(userInfo);

();

n("注册成功");

ribute("userid",rid());

%>

<%=rid()%>

修改用户信息

返回

教材例程5-8-1,信息修改JavaBean,

package 5;

import verDriver;

import .*;

public class UserModify

{

private UserInfo userInfo;

相信能就一定能

优质文档

private Connection con;

//获得数据库连接,构造函数。

public UserModify()

{

String

CLASSFORNAME="verDriver";

String

SERVANDDB="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev";

String USER="bn";

String PWD="bn";

try

{

e(CLASSFORNAME);

con =

nection(SERVANDDB,USER,PWD);

}

catch(Exception e)

{

tackTrace();

}

}

//设置用户信息。

public void setUserInfo(UserInfo userInfo)

{

fo=userInfo;

}

//进行修改

public void modify()throws Exception

{

String reg="update user_Info set

name=?,phone=?,street=?,state=?,city=?,zipcode=?,email=?,cardNumber=,cardType=,userLastLogTime=,userType=,banneropt=,fanvcategory=,password=? where userid='"+rid()+"'";

try

{

PreparedStatement

pstmt=eStatement(reg);

// ing(1,rid());

ing(1,e());

ing(2,ne());

ing(3,eet());

ing(4,te());

ing(6,y());

相信能就一定能

优质文档

ing(5,Code());

ing(7,il());

ing(8,dNumber());

(9,dType());

e(10,new (new

().getTime()));

(11,1);

(12,neropt());

ing(13,vcategory());

ing(14,sword());

eUpdate();

}

catch(Exception e)

{

tackTrace();

throw e;

}

}

}

教材例程5-8-2,信息修改页面,

<%@ include file=""%>

<%@ include file=""%>

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

errorPage="" %>

Untitled Document

href="" type=text/css rel=stylesheet>

信息修改

<%

String userid=ribute("userid").toString();

e(CLASSFORNAME);

Connection con = nection(SERVANDDB,USER,PWD);

Statement statement=Statement();

String sql="select * from user_info where userid='"+userid+"'";

ResultSet rs=eQuery(sql);

();

int cardType=("cardType");

int banneropt=("banneropt");

int fanvcategory=("fanvcategory");

%>

相信能就一定能

优质文档

相信能就一定能

优质文档

相信能就一定能

优质文档

用户名:

value=<%=ing("userid")%> readonly="true">

width=1 border=0>

密码:

value=<%=ing("password")%>>

确认密码:

value=<%=ing("password")%>>

真实姓名:

value=<%=ing("name")%>>

电话:

value=<%=ing("phone")%>>

email:

value=<%=ing("email")%>>

街道:

value=<%=ing("street")%>>

城市:

value=<%=ing("city")%>>

省:

value=<%=ing("state")%>>

邮编:

value=<%=ing("zipCode")%>>

信息卡信息:
卡号:

value=<%=ing("cardNumber")%>>

开户银行:

<%

String h1="",h2="",h3="",h4="",h5="";

if(cardType==1)

h1="selected";

if(cardType==2)

h2="selected";

if(cardType==3)

h3="selected";

if(cardType==4)

h4="selected";

if(cardType==5)

h5="selected";

%>

个人定制信息:
喜欢的图类别:

<%

String g[]={"","","","","","","","",""};

if(fanvcategory==1)

g[1]="selected";

if(fanvcategory==2)

g[2]="selected";

if(fanvcategory==3)

g[3]="selected";

if(fanvcategory==4)

g[4]="selected";

if(fanvcategory==5)

相信能就一定能

优质文档

g[5]="selected";

if(fanvcategory==6)

g[6]="selected";

if(fanvcategory==7)

g[7]="selected";

if(fanvcategory==8)

g[8]="selected";

%>

是否需要在提供购物时的提示:

<%

String ck="";

if(banneropt==1)

{

%>

checked>

<%

}

else

{

%>

<%

}

%>

name="submit" onClick="return RgTest()">

教材例程5-8-2,信息修改执行页面,jspdevmodi_

<%@ page language="java" errorPage=""

import="5.*"%>

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

scope="page">

scope="page"/>

用户信息修改页面

<%

rInfo(userInfo);

();

n("修改成功");

// ribute("userid",rid());

%>

再次修改用户信息

返回

相信能就一定能

优质文档

5.4 通过JDBC-ODBC桥访问数据库的方法

不同的web数据库应用程序,使用JDBC-ODBC连接数据库的JavaBean都基本相同,有连接、查询、删除、更新以及执行SQL语句等等,下面举出通用的类及其方法。

1.通用的JavaBean

//tchexa/WEB-INF/classes/

package useSQL_Server;

import .*;

public class DateConn

{

String sDBDriver = "bcDriver";//载入驱动程序

String sConn = "jdbc:odbc:stud";//其中stud是ODBC中的名称

String loginuser = "web"; //用户名

String loginpasswd = "prog"; //密码

Connection conn = null;

ResultSet rs = null;

//sql_data类的构造函数

public DateConn()

{

//载入数据库驱动程序

try

{

e(sDBDriver);

}

catch (otFoundException e)

{

n("DateConn():" + sage());

}

}

//执行插入操作的方法

public void executeInsert(String sql)

{

try

{

//建立数据库连接

conn = nection(sConn,loginuser,loginpasswd);

Statement stmt = Statement();

eUpdate(sql);

相信能就一定能

优质文档

}

catch (SQLException ex)

{

n("eUpdate:" + sage());

}

}

//执行查询操作的方法

public ResultSet executeQuery(String sql)

{

rs = null;

try

{

//建立数据库连接

conn = nection(sConn,loginuser,loginpasswd);

Statement stmt = Statement();

rs = eQuery(sql);

}

catch (SQLException ex)

{

n("eQuery:" + sage());

}

return rs;

}

//执行删除操作的方法

public void executeDelete(String sql)

{

try

{

//建立数据库连接

conn = nection(sConn,loginuser,loginpasswd);

Statement stmt = Statement();

eUpdate(sql);

}

catch (SQLException ex)

{

n("eDelete:" + sage());

}

}

}

//现在你就可以再JSP中调用这个JavaBean了,请看下一篇,在JSP中调用JavaBean。

相信能就一定能

优质文档

2.在JSP中调用JavaBean

如果你想在JSP页面中使用一个JavaBean,加入下面行代码:

class="useSQL_nn"/>

其中的id="sqlbean",定义的是这个Bean在以后的使用中所使用的名称。scope="application",定义的是Bean的有效作用域,其中的application也可以使用session或者其他。class="useSQL_nn",定义的是这个Bean所在的位置使用查询的例子:

// tchexa/ (数据源用教案中stud_admin下的stu_在ODBC中设置stud数据源)

ResultSet rs = null;

String name = null;

//需要执行的SQL语句

String sql = "select name from user_info";

//执行SQL查询语句

rs = eQuery(sql);

if (())

{

name = ing("name");

//循环打印结果

n(name);

}

完整的代码为:

<%@ page import=".*"%>

<%@ page import=".*"%>

<%@ page import=".*"%>

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

class="useSQL_nn"/>

<%

ResultSet rs = null;

String student_name = null;

//需要执行的SQL语句

String sql = "select student_name from student_info";

//执行SQL查询语句

rs = eQuery(sql);

while (())

{

相信能就一定能

优质文档

student_name = ing("student_name");

//循环打印结果

n(student_name+"

");

}

%>

使用删除的例子:

String sql = "delete from student_info where student_id='2005813005'";

eDelete(sql)

即可删除杨南南同学。

插入的使用和删除的例子差不多,请同学们自己做。

最后,关于汉子乱码的问题,对于html页面中的乱码,在 与之间插入:

charset=gb2312">

可以解决问题;

对于jsp页面<%%>中输出内容的乱码,用下面的语句插入到JSP文件的前几行:

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

可以解决问题;

而对于request请求中的乱码,可以用

<% racterEncoding("gb2312"); %>

解决;

再对于response响应中输出的乱码,用

<% tentType("text/html;charset=gb2312");%>

可以解决;

对于来自数据库中的汉字,必须用转换函数。在教材例程3-6,,在jspdev文件夹下的也是一样。把这个函数拷贝到需要转换字符集相信能就一定能

优质文档

的网页一起(同一文件夹),把这个文件包含进来,把打印内容调用trans函数转换一下即可。

文件为:

<%!

String trans(String chi)

{

String result = null;

byte temp [];

try

{

temp=es("gb2312");

result = new String(temp);

}

catch(ortedEncodingException e)

{

n (ng());

}

return result;

}

String trans(Object chi)

{

return trans(ng());

}

%>

上述函数和语句中的gb2312可以改为gbk,这样所处理的汉字更多一些,以免生僻字出现乱码。

相信能就一定能


本文标签: 属性 事件 组件