软件体系结构

课程实验报告

软件系统结构

专业 软件工程 张韬 B 软件121 1210701132 孙莉

学生姓名 班学

级 号

指导老师

实验一 C/S结构应用设计(1)

一、 实验目的

设计并实现一个基于多层C/S结构的数据库应用,熟悉多层C/S体系结构及其基本处理流程,了解多层结构表现层、业务逻辑层(功能层) 、数据访问层所完成的功能,掌握多层C/S结构的数据库应用设计方法,对这三层进行明确分割,并在逻辑上使其独立。学生通过本实验的训练能够熟练掌握对小型数据库应用系统三层结构层次划分方法及系统实现技术。

二实验环境

奔腾以上计算机,装有SQL Server 2000数据库系统和Visual Studio 2000软件。

三、实验内容

1、分别采用二层C/S结构和多层C/S结构实现个人通讯录系统。该系统的设计目标是能够轻松地管理个人的联系人信息,包括添加、修改和删除操作。联系人信息包括姓名、住址、电话。整个系统的功能图如下图所示:

分析系统需求,完成软件体系结构设计及模块划分、数据库设计,采用Visual C#实现系统功能

四、实验操作过程

在电脑上安装好Microsoft Visual Studio 2010 用于系统的开发

需要实际设计开发出一个简单的基于两层C/S结构的应用系统——个人通讯录管理系统,主要步骤和内容如下:

1、在 SQL Server 2000中建立数据库Contact ,建立表friend 。

(1)建立数据库Contact : Create database contact (2)建立数据库表friend

//使用contact 数据库 USE contact

GO

//是否存在数据库表friend ,如果存在则删除

If exists(select*from dbo.sysobjects where id=object id(N’[dbo].[friend]’)and

OBJECTPROPERTY (id,N’isusertable ’)=1)

Drop table [dbo].[friend] GO

//建立表friend

Create table [dbo].[friend]

([fid] [int] identity(1,1) not null,

[fname] [varchar] (8) collate Chinese prc ci as not null, [fphone] [varchar] (12) collate Chinese prc ci as null, [faddress] [varchar] (100) collate Chinese prc ci as null )on [primary]

表1 friend的结构

新建完friend 表之后向表中插入1条记录。以便程序调试时使用。 2、在Visual Studio 2000中用C#语言建立用户界面层(UI )程序:Contact 项目,主要呈现用户操作界面。 用户的主要操作界面如下:

其中txtAddress 控件的Multilane 属性为True. 最后我们要设置性设置为

True ,View

listView 属性,将其FullRowSelect 属性设置为true,Gridlines 属

Details ,并点开Columns

属性设置为属性,添加一列,设置其

Name 为fContactID ,Text 属性为编号,以此方式再为其添加姓名、电话、联系方式。

到此,用户图形界面就设计完成了。

3、编写应用程序层代码,用于实现数据访问、添加、删除和修改等控制,关键代码如下:

(1)数据连接

数据库连接的代码如下:

string connstr = "Data Source=(local);Initial Catalog=contact;user id=sa;password=";

本代码的意思是以用户名为sa 登录到本地数据库,密码为空。

(2)数据添加、删除和修改等控制的主要代码

①显示联系人信息

显示联系人信息由主界面的listview 显示,其思路是读取数据库中所有的联系人信息,然后通过Lisview 显示。

private void getInfo() {

string sql = "select Fid,Fname,Fphone,Faddress from friend"; SqlConnection conn = new SqlConnection(connstr); conn.Open ();

SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader

cmd.ExecuteReader(CommandBehavior.CloseConnection);

reader

=

try {

this.listView.Items.Clear(); while (reader.Read()) {

string[] subItems = new string[]{

reader.GetInt32(0).ToString(), reader.GetString(1), reader.GetString(2), reader.GetString(3)};

this.listView.Items.Add(new ListViewItem(subItems)); }

reader.Close(); }

catch (Exception ex) {

MessageBox.Show(ex.ToString()); } }

②添加联系人信息

对联系人信息进行添加的操作并录入数据库

public void addInfo(string name, string phone, string address)

{ string

sql="insert

into

friend(Fname,Fphone,Faddress)values('"+name+"','"+phone+"','"+address+"')";

SqlConnection conn=new SqlConnection(connstr); SqlCommand cmd=new SqlCommand(sql,conn); conn.Open();

cmd.ExecuteNonQuery(); conn.Close();}

③修改联系人信息

对联系人信息进行修改的操作并录入数据库

private void btnEdit_Click(object sender, EventArgs e) {

if (this.listView.SelectedItems.Count == 0) {

MessageBox.Show("请单击选择需要修改的联系人!"); return; }

this.enableInfo();

ListViewItem lvi = this.listView.SelectedItems

[this.listView.SelectedItems.Count - 1];

this.txtName.Text = lvi.SubItems[1].Text; this.txtPhone.Text = lvi.SubItems[2].Text; this.txtAddress.Text = lvi.SubItems[3].Text; Fid = Convert.ToInt32(lvi.SubItems[0].Text); this.isAdd = false;

this.btnDel.Enabled = false; this.btnAdd.Enabled = false; }

④删除联系人

对联系人信息进行删除的操作并录入数据库

private void button5_Click(object sender, EventArgs e) {

int infoID = this.getselectid(); if (infoID == 0) {

MessageBox.Show("请选中信息先!"); return; } try {

string sql = "delete friend where fid=" + infoID; SqlConnection conn = new SqlConnection(connstr); conn.Open();

SqlCommand cmd = new SqlCommand(sql, conn); cmd.ExecuteNonQuery(); conn.Close(); this.getInfo(); }

catch (Exception ex) {

MessageBox.Show(ex.Message); } }

五、实验结果及结论。

当我们运行程序时可以看到之前在数据库中插入的数据已经显示在了联系人列表中,我们点击添加联系人信息之后再次插入信息,点击确定后,我们可以看到,新插入的数据已经在联系人列表中了,如下图所示。

单击确定按钮之后显示通讯上去了:

六、心得体会

本次实验完成了实验要求里的内容,遇到一些问题,都得到很好的解决。

实验二 C/S结构应用设计(2)

一、实验目的

设计并实现一个基于多层C/S结构的数据库应用,熟悉多层C/S体系结构及其基本处理流程,了解多层结构表现层、业务逻辑层(功能层) 、数据访问层所完成的功能,掌握多层C/S结构的数据库应用设计方法,对这三层进行明确分割,并在逻辑上使其独立。学生通过本实验的训练能够熟练掌握对小型数据库应用系统三层结构层次划分方法及系统实现技术。

二、实验环境

奔腾以上计算机,装有SQL Server 2000数据库系统和Visual Studio 2000软件。

三、实验内容

1、分别采用二层C/S结构和多层C/S结构实现个人通讯录系统。该系统的设计目标是能够轻松地管理个人的联系人信息,包括添加、修改和删除操作。联系人信息包括姓名、住址、电话。整个系统的功能图如下图所示:

分析系统需求,完成软件体系结构设计及模块划分、数据库设计,采用Visual C#实现系统功能

四、 实验操作过程

需要实际设计开发出一个简单的基于多层C/S结构的应用系统——个人通讯录管理系统,主要步骤和内容如下:

1、在 SQL Server 2000中建立数据库Contact ,建立表friend 。 在创建二层C/S时,我们已经创建了contact 数据库,并建立了friend 表,这次我们可以直接引用。

2、在Visual Studio 2000中用C#语言建立用户界面层(UI )程序:Contact 项目,主要呈现用户操作界面。

在创建二层C/S架构中,我们已经创建过此用户图形界面,三层架构的用户图形层(UI )与两层架构一致,所以在此就不再重复。

3、在Contact 中增加新类ContactDb.cs 作为业务逻辑层(BLL )程序。 在业务逻辑层中需要为其添加头文件

using System;

using System.Collections.Generic; using System.Text; using System.Data; 并创建contactDB 类

using System.Data.SqlClient; namespace Contact {

class ContactDB{ }

4、编写类文件ContactDb.cs 代码,用于实现数据访问控制,关键代码如下: (1)数据连接

数据库的访问是由contactDB 类中的getReader 方法实现的,在MainForm 中,只需要如下代码:

SqlDataReader reader = cdb.getReader();

getReader 方法定义了一个String 类型的变量sql ,用于保存访问数据库的SQL 命令:

string sql = "select Fid,Fname,Fphone,Faddress FROM friend";

接着新建数据库连接对象conn 并打开数据连接:

SqlConnection conn = new SqlConnection(connStr); conn.Open();

其中连接字符窜connStr 是contactDB 类的域:

string connStr = "Data source=(local);Initial Catalog=contact;user id=sa;password=''";

然后建立数据命令对象:

SqlCommand cmd = new SqlCommand(sql, conn);

数据命令对象cmd 使用的数据库连接是conn ,而参数sql 表示数据命令的数据文本为sql ,即数据命令的CommandText 属性为sql 。 (2)数据获取

SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); return reader;

在MainForm 的getInfo 方法中,获取了由ContactDB 类的getReader 方法返回的数据阅读器后,接下来要执行的是循环读取阅读器中的信息,然后依次添加到listView 中;

try

{

SqlDataReader reader = cdb.getReader();

this.listView.Items.Clear(); //清除listView 中所有的item while (reader.Read()) {

string[] subItems = new string[]{ reader.GetInt32(0).ToString(), reader.GetString(1), reader.GetString(2), reader.GetString(3)};

this.listView.Items.Add(new ListViewItem(subItems)); }

reader.Close(); }

catch (Exception ex) {

MessageBox.Show(ex.ToString()); } while (reader.Read()) {

每次读取一条记录都将记录中的每个字段的信息封装到string 类型的数组中:

string[] subItems = new string[]{ reader.GetInt32(0).ToString(), reader.GetString(1), reader.GetString(2), reader.GetString(3)

接下来将subItems 中的数据封装为listView 的一个节点(listViewItem )并添加到listView 中:

this.listView.Items.Add(new ListViewItem(subItems)); reader.Close();

至此显示联系人的功能就完成了,其他模块的代码编写与此类似,就不再重复。

五、 实验结果及结论。

(1)数据库中原有两个数据,分别为彭振东与张三的信息,我们选择修改联

系人,修改张三的名字为王麻子,电话为8890,, 联系地址为中国,可以看到listView 中张三的信息修改了,如下图所示:

(2)思考题:与二层C/S体系结构比较,三层(多层) 体系结构有什么特点?采用三层体系结构在设计时应该注意哪些问题? 答:三层体系结构的优点:

①允许合理地划分三层结构的功能,使之在逻辑上保持相对独立性 ②允许更灵活有效地选用相应的平台和硬件系统

③三层C/S结构中,应用的各层可以并行开发,各层也可以选择各自最合适的开发语言。

④允许充分利用功能层有效地隔离层表示层与数据层。

⑤三层C/S结构各层间的通信效率若不高,即使分配给各层的硬件能力很强,其作为整体来说也达不到所要求的性能。

六、心得体会

本次实验很顺利,完成了要求。

实验三 B/S结构应用设计(1)

一、实验目的

设计并实现一个基于B/S结构的数据库应用,熟悉B/S体系结构及其基本处理流程,了解B/S结构系统各部分所完成的功能,掌握B/S结构的数据库应用设计方法。学生通过本实验的训练能够熟练掌握对小型数据库应用系统B/S结构设计及系统实现技术。

二、实验环境

MyEclips 10、Tomcat 、SQL Server 2010

三、实验内容

1、采用B/S结构实现个人通讯录系统。该系统的设计目标是能够轻松地管理个人的联系人信息,包括添加、修改和删除操作。联系人信息包括姓名、住址、电话。整个系统的功能图如下图所示:

分析系统需求,完成软件体系结构设计及模块划分、数据库设计,采用ASP.Net(使用C#语言) 实现系统功能

四、实验操作过程

在MyEclips 中新建项目:Structure_Contact。生成项目之后在src 下新建包org.action, 在org.action 包中建立action 类,包括:addAction 、deleteAction 、editAction 、mainAction 、modifyAction 、registerAction 类主要步骤如下:

(1)建立addAction 类继承ActionSupport 类,主要是同于添加用户,主要

代码如下:

public String execute() throws Exception{

HttpServletRequest request = ServletActionContext.getRequest (); //mark HttpSession session = request.getSession(); userfriend = new UserFriend(); userfriendid = new UserFriendId();

}

}

name = request.getParameter("name"); address = request.getParameter("address"); phone = request.getParameter("phone"); user = (User)session.getAttribute("user"); userfriendid.setUser(user.getUsername()); userfriend.setId(userfriendid); userfriend.setName(name); userfriend.setAddress(address); userfriend.setPhone(phone);

if (userfrienddaoimp.insert(userfriend)){ } else { }

return "error";

session.setAttribute("al", al); return "success";

//account and password //account_name

//id auto-increase

(2)建立deleteAction 类继承ActionSupport 类用于删除用户,代码如下:

public class deleteAction extends ActionSupport{

private UserFriend userfriend; private String user; private int id;

private UserFriendId userfriendid;

private UserFriendDaoImp userfrienddaoimp;

public String execute() throws Exception{

userfriend = new UserFriend(); userfriendid = new UserFriendId();

userfrienddaoimp = new UserFriendDaoImp();

HttpServletRequest request = ServletActionContext.getRequest(); //mark HttpSession session = request.getSession(); //mark user = request.getParameter("username"); System.out.println(request.getParameter("id")); id = Integer.parseInt(request.getParameter("id")); userfriendid.setUser(user); userfriendid.setId(id);

userfriend.setId(userfriendid);

}

}

} else{ }

return "error";

ArrayList al = userfrienddaoimp.getAll(user); session.setAttribute("al", al); return "success";

(3)建立editAction 类继承ActionSupport 类,用于编辑用户,代码如下:

public class editAction extends ActionSupport{

private String user ; private int id; private String name; private String address; private String phone;

private UserFriend userfriend; private UserFriendId userfriendid;

private UserFriendDaoImp userfrienddaoimp; public String execute() throws Exception{

HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); userfriendid = new UserFriendId(); userfriend = new UserFriend();

userfrienddaoimp = new UserFriendDaoImp();

System.out.println(request.getParameter("username")); //null System.out.println(request.getParameter("id")); user = request.getParameter("username");

id = Integer.parseInt(request.getParameter("id")); name = request.getParameter("name"); address = request.getParameter("address"); phone = request.getParameter("phone"); userfriendid.setId(id); userfriendid.setUser(user); userfriend.setId(userfriendid); userfriend.setName(name); userfriend.setAddress(address); userfriend.setPhone(phone);

if(userfrienddaoimp.update(userfriend)){

ArrayList al = userfrienddaoimp.getAll(user); session.setAttribute("al", al);

//null

}

}

}

else{ }

return "error";

(4)建立org.model 包,在包中创建User 、UserFriend 和UserFriendId 类,创建User.hbm.xml 和UserFriend.hbm.xml 文档。

public class User implements java.io.Serializable { }

public class UserFriend implements java.io.Serializable {

private UserFriendId id; private String name; private String address; private String phone; public UserFriend() { }

public UserFriend(UserFriendId id) { }

this.id = id; private String username; private String password; public User() { }

public User(String username) { }

public User(String username, String password) { }

public String getUsername() { }

public void setUsername(String username) { }

public String getPassword() { }

public void setPassword(String password) { }

this.password = password; return this.password; this.username = username; return this.username; this.username = username; this.password = password; this.username = username;

}

public UserFriendId getId() { }

public void setId(UserFriendId id) {

return this.id; this.id = id; this.name = name; this.address = address; this.phone = phone;

}

}

this.id = id;

public String getName() { }

public void setName(String name) { }

public String getAddress() { }

public void setAddress(String address) { }

public String getPhone() { }

public void setPhone(String phone) { }

this.phone = phone; return this.phone; this.address = address; return this.address; this.name = name; return this.name;

public class UserFriendId implements java.io.Serializable {

private Integer id; private String user; public UserFriendId() { }

public UserFriendId(Integer id, String user) { }

public Integer getId() { }

public void setId(Integer id) {

return this.id; this.id = id; this.user = user;

}

}

public String getUser() { }

public void setUser(String user) { }

public boolean equals(Object other) { }

public int hashCode() { }

int result = 17;

result = 37 * result + (getId() == null ? 0 : this.getId().hashCode()); result = 37 * result

+ (getUser() == null ? 0 : this.getUser().hashCode());

if ((this == other))

return true; this.user = user; return this.user;

if ((other == null))

return false;

if (!(other instanceof UserFriendId))

return false;

UserFriendId castOther = (UserFriendId) other;

return ((this.getId() == castOther.getId()) || (this.getId() != null

&& castOther.getId() != null && this.getId().equals( castOther.getId())))

&& ((this.getUser() == castOther.getUser()) || (this.getUser() != null

&& castOther.getUser() != null && this.getUser() .equals(castOther.getUser())));

return result;

(5)User.hbm.xml ,用于数据库中的表User 和定义的属性相对应,代码如下:

(6)UserFriend.hbm.xml用于数据库中的表UserFriend 和定义的属性相对应,代码如下:

五、实验结果及结论

(1)用户登录界面显示:

(2)用户主界面:

(3)编辑界面:

(4)思考题:与C/S体系结构比较,B/S体系结构有什么优点?采用B/S与C/S混合体系结构在设计时应该注意哪些问题?

答:基于B/S体系结构的软件,系统安装、修改和维护全在服务器端解决。用户在使用系统时,仅需要一个浏览器就可以运行全部的模块,真正达到了“零客户端”的功能,很容易在运行时自动升级。B/S体系结构还提供了异种机、异种网、异种应用服务的联机、联网、统一服务的最现实的开发性基础。

六、心得体会

本次实验学到了很多东西,对于要求的内容,也都得到很好的解决。

实验四 B/S结构应用设计(1)

一、实验目的

设计并实现一个基于B/S结构的数据库应用,熟悉B/S体系结构及其基本处理流程,了解B/S结构系统各部分所完成的功能,掌握B/S结构的数据库应用设计方法。学生通过本实验的训练能够熟练掌握对小型数据库应用系统B/S结构设计及系统实现技术。

二、实验环境

MyEclips 10、Tomcat 、SQL Server 2010

三、实验内容

1、采用B/S结构实现个人通讯录系统。该系统的设计目标是能够轻松地管理个人的联系人信息,包括添加、修改和删除操作。联系人信息包括姓名、住址、电话。整个系统的功能图如下图所示:

分析系统需求,完成软件体系结构设计及模块划分、数据库设计,采用ASP.Net(使用C#语言) 实现系统功能

四、实验操作过程

接着上次的项目中建立的Structure_Contact项目,生成项目之后在src 下新建包org.action, 在org.action 包中建立action 类,包括:addAction 、deleteAction 、editAction 、mainAction 、modifyAction 、registerAction 类主要步骤如下:

(1)建立mainServlet 继承ActionSupport 类:

public class mainAction extends ActionSupport{

private String account_name; private String password; private User user;

public String getAccount_name() {

// // }

}

public void setAccount_name(String account_name) { }

public String getPassword() { }

public void setPassword(String password) { }

public String execute() throws Exception{ }

user = new User();

HttpServletRequest request = ServletActionContext.getRequest(); //mark HttpSession session = request.getSession(); //mark account_name = request.getParameter("account_name"); password = request.getParameter("password"); user.setPassword(password); user.setUsername(account_name); UserDaoImp userDao = new UserDaoImp(); System.out.println(account_name); System.out.println(password);

UserFriendDaoImp ufdi = new UserFriendDaoImp(); ArrayList al = ufdi.getAll(account_name); session.setAttribute("al", al);

if(session.getAttribute("user")==null){ } else{ }

return "success";

if(userDao.Check(account_name, password)){ }

return "error";

session.setAttribute("user", user); return "success";

this.password = password; return password;

this.account_name = account_name;

(2)建立registerAction 继承ActionSupport 类:

public class registerAction extends ActionSupport{

private String username; private String password; private UserDaoImp userdaoimp;

public String execute() throws Exception{

}

}

username = request.getParameter("username"); password = request.getParameter("password"); userdaoimp = new UserDaoImp();

if(userdaoimp.addAccount(username, password)){ } else{ }

return "error"; return "success";

(3)建立org.Dao 包,包中创建UserDao 和UserFriendDao 类

(4)建立org.DaoImp 包,包中创建UserDaoImp 和UserFriendDaoImp 类 (5)在WebRoot 文件夹下建立add.jsp 、edit.jsp 、error.jsp 、login.jsp 、main.jsp 、register.jsp: 下面是main.jsp 代码:

phone_category welcome!

ArrayList list = (ArrayList)session.getAttribute("al"); Iterator iter = list.iterator(); while(iter.hasNext()){

UserFriend userfriend = (UserFriend)iter.next();

String temp_id = String.valueOf(userfriend.getId().getId()); //can't let int

to string in href ,so add the java code to complete it and then send.

}

name address phone
"add.jsp">add


%>

String temp_name = userfriend.getId().getUser();

etPhone() %>

&id=">edit&nbsp

"deleteAction.action?username=&id=">delete

下面是login.jsp 代码:

register

if you don't have account ,please click here to register.

五、实验结果及结论

(1)添加界面:

(2)出错界面:

(3)register界面:

六、心得体会

本次实验学到了很多,完成了要求。


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn