您的位置:首页 > 编程语言 > Java开发

在NetBeans中使用MySQL创建简单Web应用程序(二)

2007-07-31 21:51 781 查看

实现逻辑层

既然数据层已经准备就绪,我们开始在适当的位置放置Java类。逻辑层由三个类组成:SubjectName.java、SubjectCounselor.java和AccessDB.java。这几个类提供两种功能;它们通过响应数据请求(SubjectName.java和SubjectCounselor.java)连接JSP页面,并通过执行基于用户指定信息(AccessDB.java)的查询与数据库进行连接。我们介绍一下这两种功能:
1.连接JSP页面

2.连接数据库

连接JSP页面

SubjectName.java

SubjectName.java使index.jsp页面能够访问subjects表中列出的主题名称。它通过允许AccessDB.java使用setter方法设置实例变量id和name执行此操作,然后让index.jsp使用公共getter方法访问它们。要设置SubjectName.java,执行以下操作:

在Projects窗口中,右键单击该项目节点,并选择New>JavaClass...。打开NewJavaClass向导。

在ClassName文本字段中输入SubjectName。还应该创建一个新包,包含项目的所有Java类。对于Package,键入org。单击Finish。新类的模板在SourceEditor中打开。在Projects窗口中,新包和类的节点在SourcePackages中显示出来。

现在,在SourceEditor中新建的模板里,将以下内容添加到新的SubjectName类的主体部分,然后保存(Ctrl+S)文件:

privateStringid;

privateStringname;


//createsettermethods

publicvoidsetId(Stringid){

this.id=id;

}


publicvoidsetName(Stringname){

this.name=name;

}


//creategettermethods

publicStringgetId(){

returnid;

}


publicStringgetName(){

returnname;

}


SubjectCounselor.java

根据从index.jsp窗体接收到的subject_id值,SubjectCounselor.java能够使response.jsp页面访问数据库中的主题和顾问详细信息。像SubjectName.java一样,该类通过允许AccessDB.java使用公共setter方法设置所有实例变量来实现此操作,然后让response.jsp使用getter方法访问它们。要设置SubjectCounselor.java,执行以下操作:

在Projects窗口中,再次右键单击该项目节点,并选择New>JavaClass...。打开NewJavaClass向导。

在ClassName文本字段中输入SubjectCounselor。单击Finish。新类的模板在SourceEditor中打开。在Projects窗口中,新类节点显示在我们之前创建的org包下。

现在,在SourceEditor中新建的模板里,将以下内容添加到新的SubjectCounselor类中的主体部分,然后保存(Ctrl+S)文件:

privateStringsubjectName;

privateStringdescription;

privateStringcounselorID;

privateStringfirstName;

privateStringnickName;

privateStringlastName;

privateStringtelephone;

privateStringemail;

privateStringmemberSince;


//createsettermethods

publicvoidsetSubjectName(Stringsubject){

this.subjectName=subject;

}


publicvoidsetDescription(Stringdesc){

this.description=desc;

}


publicvoidsetCounselorID(StringconId){

this.counselorID=conId;

}


publicvoidsetFirstName(Stringfirst){

this.firstName=first;

}


publicvoidsetNickName(Stringnick){

this.nickName=nick;

}


publicvoidsetLastName(Stringlast){

this.lastName=last;

}


publicvoidsetTelephone(Stringphone){

this.telephone=phone;

}


publicvoidsetEmail(Stringemail){

this.email=email;

}


publicvoidsetMemberSince(Stringmem){

this.memberSince=mem;

}


//creategettermethods

publicStringgetSubjectName(){

returnsubjectName;

}


publicStringgetDescription(){

returndescription;

}


publicStringgetCounselorName(){

StringcounselorName=firstName+""

+nickName+""+lastName;

returncounselorName;

}


publicStringgetMemberSinceDate(){

returnmemberSince;

}


publicStringgetTelephone(){

returntelephone;

}


publicStringgetEmail(){

returnemail;

4.}


连接数据库

AccessDB.java

我们可以通过将任务各个击破的方式来编码AccessDB.java:它必须与数据库连接,发送用户指定的查询,然后存储从查询中接收的数据。因为我们以片段的方式处理AccessDB.java编码,所以您可以在此下载工作版本的AccessDB.java。这样,如果在某个点感到迷惑,可以将您的代码与保存的版本进行对比。
首先创建文件,然后准备代码。该代码能使类建立与上面定义的连接池的连接:

在Projects窗口中,右键单击该项目节点,并选择New>JavaClass...。打开NewJavaClass向导。

在ClassName文本字段中输入SubjectName。单击Finish。新类模板在SourceEditor中打开。在Projects窗口中,新类节点显示在我们之前创建的org包下。

现在,在SourceEditor中新建的模板里,右键单击画布并选择EnterpriseResources>UseDatabase在ChooseDatabase对话框中,选择我们之前从DataSource下拉列表中定义的数据源的JNDI名称。确保选择了GenerateInlineLookupCode单选按纽并单击Finish。在SourceEditor中生成以下代码:

privateDataSourcegetJdbcConnectionPool()throwsNamingException{

Contextc=newInitialContext();

return(DataSource)c.lookup("java:comp/env/jdbc/connectionPool");

}


这允许该类与使用之前在Web服务器上定义的连接池的数据库连接。另外,注意在创建getJdbcConnectionPool()方法时,IDE在SourceEditor中自动生成导入语句,用于javax.sql和javax.namingAPI的以下类:

现在可以开始编码该类对两个JSP页面执行的数据库查询了。我们首先查询index.jsp,它涉及检索列在subjects表中的所有主题的姓名和ID:

在AccessDB.java的SourceEditor中,将以下字符串变量输入到类声明下面的区域中:

privateStringsqlSubjectName="SELECTsubjects_id,nameFROMsubjects";



SQL查询允许我们指定想要从数据库中引出的数据。

现在,将以下getSubjectName()方法添加到类中。这基本上创建了与连接池的连接,然后与数据库连接并执行查询。它然后在数据库返回的结果集中循环,并创建SubjectName的实例,保留每个返回行的ID和姓名。每个实例都被添加到列表中,最后通过调用方法被返回至对象:

//getsubjectnamesfromdatabase

publicListgetSubjectName()throwsException{


//connectioninstance

Connectionconnection=null;


//instanceofSubjectNameusedtoretainretrieveddata

SubjectNamesubName=null;


//listtoholdallinstancesofSubjectName

Listlist=newArrayList();


try{

//connecttodatabase

DataSourcedataSource=getJdbcConnectionPool();

connection=dataSource.getConnection();


//preparetheSQLquerytogetsubjectnameandid

PreparedStatementstat=connection.prepareStatement(sqlSubjectName);


//setuptheresultsettoretainallquerieddata

ResultSetrs=stat.executeQuery();


//nowloopthroughtherowsfromthegeneratedresultset

while(rs.next()){

//declareaninstanceofSubjectNametomatch

//returneddatawithclass'instancevariables

subName=newSubjectName();

Stringsubject_id=rs.getString("subjects_id");

Stringname=rs.getString("name");

//setthedatatothevariables

subName.setId(subject_id);

subName.setName(name);

//finally,addthesubNameinstancetothelist

list.add(subName);

}


}catch(Exceptione){

System.out.println(e.getMessage());


//closetheconnectionsoitcanbereturnedto

//theconnectionpoolthenreturnthelist

}finally{

connection.close();

returnlist;

}

}


在为getSubjectName()方法添加以上代码时,注意出现在SourceEditor中的各种错误,加下划线的红色文本。将光标放在有下划线的文本中时,在该行最左边会显示一个灯泡图标。这表示IDE可以为错误提供可能的解决方案。

通过单击灯泡图标或按下Alt-Enter打开相应工具提示修正所有错误:

我们将探讨5种错误,并且它们都涉及将类(和接口)导入项目中:

m用作方法返回对象的List接口需要从java.util中定义。
mArrayList类被用于实现List,并且我们需要该类保存SubjectName的所有实例。
m与数据库通信需要来自java.sqlAPI的Connection、PreparedStatement和ResultSet。

为这些错误中的每一个从工具提示中选择AddImport,并且注意在SourceEditor中自动生成新的导入语句:

现在,可以为来自response.jsp的查询添加代码。这与之前演示的index.jsp方法相同,例如创建合适的SQL查询,然后创建一个查询数据库和保存数据的方法。然而,在这种情况下,需要创建两个查询:第一个访问subjects表并检索用户从index.jsp的下拉菜单中所选ID的相应行。然后通过使用返回的主体行中的counselors_idfk,第二个查询可以匹配counselors表中的counselorID:

在AccessDB.java的SourceEditor中,将以下两个字符串变量输入到类声明以下的区域中:

privateStringsqlSubject="SELECT*FROMsubjectsWHEREsubjects_id=?";

privateStringsqlCounselor="SELECT*FROMcounselorsWHEREcounselors_id=?";



现在,将以下getSubCounselor()方法添加到类中。这会创建与连接池的连接,然后如上所述,连接到数据库并执行两个查询。然后它创建一个SubjectCounselor实例来保留从这两个结果集中获得的所有数据:

//getsubjectdataandcounselordataforcorrespondingsubject

publicSubjectCounselorgetSubCounselor(StringsubjectID)throwsException{


//instanceofSubjectCounselorusedtoretaindata

SubjectCounselorsubCon=newSubjectCounselor();


//connectioninstance

Connectionconnection=null;


try{

//connecttodatabase

DataSourcedataSource=getJdbcConnectionPool();

connection=dataSource.getConnection();


//preparetheSQLquerytogetsubjectdata

PreparedStatementstat=connection.prepareStatement(sqlSubject);

stat.setString(1,subjectID);

ResultSetrs=stat.executeQuery();

//thisassumesthereisonlyonerowintheresultset

rs.next();

//matchallreturnedfieldswiththebelowvariables

StringsubjectName=rs.getString("name");

Stringdescription=rs.getString("description");

StringcounselorID=rs.getString("counselors_idfk");


//preparetheSQLquerytogetcounselordata

stat=connection.prepareStatement(sqlCounselor);

stat.setString(1,counselorID);

rs=stat.executeQuery();

//thisassumesthereisonlyonerowintheresultset

rs.next();

//matchallreturnedfieldswiththebelowvariables

StringfirstName=rs.getString("first_name");

StringnickName=rs.getString("nick_name");

StringlastName=rs.getString("last_name");

Stringtelephone=rs.getString("telephone");

Stringemail=rs.getString("email");

StringmemberSince=rs.getString("member_since");


//finallysetallvariablestotheir

//equivalentsintheSubjectCounselorinstance

subCon.setSubjectName(subjectName);

subCon.setDescription(description);

subCon.setCounselorID(counselorID);

subCon.setFirstName(firstName);

subCon.setNickName(nickName);

subCon.setLastName(lastName);

subCon.setTelephone(telephone);

subCon.setEmail(email);

subCon.setMemberSince(memberSince);

}catch(Exceptione){

System.out.println(e.getMessage());

}finally{

//closetheconnectionsoitcanbereturnedtothe

//connectionpoolthenreturntheSubjectCounselorinstance

connection.close();

returnsubCon;

}

}


现在AccessDB.java需要的代码已经添加完成,并且使用它,完成了实现逻辑层所需的所有步骤。可能在继续下一步之前,想要将您的AccessDB.java版本与可下载的版本相比较。剩下的唯一任务就是将JSP代码添加到Web页面中,使我们能够显示在SubjectName和SubjectCounselor实例中保留的数据。

实现演示层

现在我们返回到之前在本教程中创建的index.jsp和response.jsp占位符。添加JSP代码使我们的页面能动态地生成内容,如基于用户输入生成内容。要实现这个操作,需要采取以下3个步骤:
1.向项目的编译类路径中添加JSTLLibrary
2.将taglib指令添加到JSP页面
3.添加代码

向项目的编译类路径中添加JSTLLibrary

为了能让JSP资源更好地为我们所用,我们将使用JavaServerPagesStandardTagLibrary(JSTL)中的标记访问并显示从逻辑层所得的数据。该库与IDE捆绑在一起。因此,我们需要确保将JSTL库添加到了Web项目的编译类路径中,然后向每个JSP页面添加相关的taglib指令。这样,我们使用的服务器就能够在从JSP页面中读取标记时识别它们。根据您使用的是Tomcat还是SJSAS,执行以下操作:

捆绑的TomcatWebServer

在Projects窗口中,右键单击该项目Libraries节点,并选择AddLibrary。选择JSTL1.1库并单击AddLibrary。

现在展开Libraries节点,而且您应该看到两个新节点:一个是JSTL库的standard.jar文件,另一个是库的jstl.jar文件:

SunJavaSystemApplicationServer

不执行任何操作!我们不需要采取任何措施将JSTL库添加到项目的编译类路径中。这是因为JSTL库已经包含在应用程序服务器库中。您可以通过展开Libraries>SunJavaSystemApplicationServer节点验证这一点:appserv-jstl.jar节点在JSTL库中定义所有的标准标记。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: