在NetBeans中使用MySQL创建简单Web应用程序(二)
2007-07-31 21:51
781 查看
实现逻辑层
既然数据层已经准备就绪,我们开始在适当的位置放置Java类。逻辑层由三个类组成:SubjectName.java、SubjectCounselor.java和AccessDB.java。这几个类提供两种功能;它们通过响应数据请求(SubjectName.java和SubjectCounselor.java)连接JSP页面,并通过执行基于用户指定信息(AccessDB.java)的查询与数据库进行连接。我们介绍一下这两种功能:1.
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编码,所以您可以首先创建文件,然后准备代码。该代码能使类建立与上面定义的连接池的连接:
在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版本与
实现演示层
现在我们返回到之前在本教程中创建的index.jsp和response.jsp占位符。添加JSP代码使我们的页面能动态地生成内容,如基于用户输入生成内容。要实现这个操作,需要采取以下3个步骤:1.
2.
3.
向项目的编译类路径中添加JSTLLibrary
为了能让JSP资源更好地为我们所用,我们将使用捆绑的TomcatWebServer
在Projects窗口中,右键单击该项目Libraries节点,并选择AddLibrary。选择JSTL1.1库并单击AddLibrary。现在展开Libraries节点,而且您应该看到两个新节点:一个是JSTL库的standard.jar文件,另一个是库的jstl.jar文件:
SunJavaSystemApplicationServer
不执行任何操作!我们不需要采取任何措施将JSTL库添加到项目的编译类路径中。这是因为JSTL库已经包含在应用程序服务器库中。您可以通过展开Libraries>SunJavaSystemApplicationServer节点验证这一点:appserv-jstl.jar节点在JSTL库中定义所有的标准标记。相关文章推荐
- 在NetBeans中使用MySQL创建简单Web应用程序(0)
- 在NetBeans中使用MySQL创建简单Web应用程序(二)
- 在NetBeans中使用MySQL创建简单Web应用程序(二)
- 在NetBeans中使用MySQL创建简单Web应用程序(一)
- 在NetBeans中使用MySQL创建简单Web应用程序(一)
- 在NetBeans中使用MySQL创建简单Web应用程序(一)
- 在NetBeans中使用MySQL创建简单Web应用程序(二)
- 在NetBeans中使用MySQL创建简单Web应用程序(二)
- 在NetBeans中使用MySQL创建简单Web应用程序(二)
- 在NetBeans中使用MySQL创建简单Web应用程序(二)
- 在NetBeans中使用MySQL创建简单Web应用程序(二)
- 在NetBeans中使用MySQL创建简单Web应用程序(一)
- 在NetBeans中使用MySQL创建简单Web应用程序(一)
- 在NetBeans中使用MySQL创建简单Web应用程序(一) (http://blog.csdn.net/java060515/archive/2007/06/19/1658316.aspx)
- 在NetBeans中使用MySQL创建简单Web应用程序(一)
- 在NetBeans中使用MySQL创建简单Web应用程序(一)
- 在NetBeans中使用MySQL创建简单Web应用程序
- 使用hibernate自动在MYSQL中创建表,极其简单,改下配置文件。
- 使用VS2008创建发布一个简单的WCF服务,并引入到web应用程序
- 使用 MySQL 数据库创建简单的 JSP 应用程序(1)