Web系统三层结构详解:DAL、BLL与UI层

需积分: 5 2 下载量 49 浏览量 更新于2024-07-27 收藏 6.99MB DOC 举报
"这篇文档详细介绍了基于ASP.NET 2.0的Web系统开发中的三层架构,包括数据库访问层(DAL)、业务逻辑层(BLL)和用户接口层(UI)。文档作者通过实例代码和功能解释,阐述了如何设计和实现这三层结构,以提升Web应用的可维护性和扩展性。" 在Web系统的三层结构中,每一层都有其特定的职责: 1. 数据访问层(DAL,Data Access Layer): DAL是系统与数据库交互的核心部分,负责执行SQL语句,进行数据的读取、插入、更新和删除操作。例如,`Database.cs`文件中包含了各种方法,如构造函数、Open和Close方法用于连接和断开数据库,`ExecuteSQL`、`GetDataSet`、`GetDataTable`等方法用于执行SQL并返回数据集或数据表。此外,文档还讨论了如何安全地处理数据,如处理可能的null值和空字符。 2. 业务逻辑层(BLL,Business Logic Layer): BLL层是应用的核心,它封装了业务规则和逻辑,与DAL和UI层进行交互。在示例中,BLL包含了如`LoadData`、`Add`、`Update`、`Delete`等方法,用于处理业务逻辑,如加载合同详情、添加新合同、更新和删除合同。`QueryHT0`方法则展示了如何根据哈希表构建SQL查询条件。 3. 用户接口层(UI): UI层主要负责与用户的交互,展示数据和接收用户输入。在文档中,UI层被展示为一个名为`JXXH_HT.aspx`的合同管理表单,其中包括各种按钮(如翻页按钮和“保存”按钮)以及处理用户操作的事件,如清空文本框、判断用户角色、更新界面内容等。这些功能反映了UI层如何响应用户操作并调用BLL层的方法来处理业务。 通过这种三层架构,开发者可以将复杂的应用程序分解为更小、更易于管理的部分,提高代码的可重用性和可测试性。此外,由于各层之间松耦合,修改某一层不会对其他层造成大的影响,这有利于系统的维护和升级。在ASP.NET 2.0框架下,这样的结构特别有利于构建大型、复杂的Web应用程序。

运行以下Python代码:import torchimport torch.nn as nnimport torch.optim as optimfrom torchvision import datasets, transformsfrom torch.utils.data import DataLoaderfrom torch.autograd import Variableclass Generator(nn.Module): def __init__(self, input_dim, output_dim, num_filters): super(Generator, self).__init__() self.input_dim = input_dim self.output_dim = output_dim self.num_filters = num_filters self.net = nn.Sequential( nn.Linear(input_dim, num_filters), nn.ReLU(), nn.Linear(num_filters, num_filters*2), nn.ReLU(), nn.Linear(num_filters*2, num_filters*4), nn.ReLU(), nn.Linear(num_filters*4, output_dim), nn.Tanh() ) def forward(self, x): x = self.net(x) return xclass Discriminator(nn.Module): def __init__(self, input_dim, num_filters): super(Discriminator, self).__init__() self.input_dim = input_dim self.num_filters = num_filters self.net = nn.Sequential( nn.Linear(input_dim, num_filters*4), nn.LeakyReLU(0.2), nn.Linear(num_filters*4, num_filters*2), nn.LeakyReLU(0.2), nn.Linear(num_filters*2, num_filters), nn.LeakyReLU(0.2), nn.Linear(num_filters, 1), nn.Sigmoid() ) def forward(self, x): x = self.net(x) return xclass ConditionalGAN(object): def __init__(self, input_dim, output_dim, num_filters, learning_rate): self.generator = Generator(input_dim, output_dim, num_filters) self.discriminator = Discriminator(input_dim+1, num_filters) self.optimizer_G = optim.Adam(self.generator.parameters(), lr=learning_rate) self.optimizer_D = optim.Adam(self.discriminator.parameters(), lr=learning_rate) def train(self, data_loader, num_epochs): for epoch in range(num_epochs): for i, (inputs, labels) in enumerate(data_loader): # Train discriminator with real data real_inputs = Variable(inputs) real_labels = Variable(labels) real_labels = real_labels.view(real_labels.size(0), 1) real_inputs = torch.cat((real_inputs, real_labels), 1) real_outputs = self.discriminator(real_inputs) real_loss = nn.BCELoss()(real_outputs, torch.ones(real_outputs.size())) # Train discriminator with fake data noise = Variable(torch.randn(inputs.size(0), self.generator.input_dim)) fake_labels = Variable(torch.LongTensor(inputs.size(0)).random_(0, 10)) fake_labels = fake_labels.view(fake_labels.size(0), 1) fake_inputs = self.generator(torch.cat((noise, fake_labels.float()), 1)) fake_inputs = torch.cat((fake_inputs, fake_labels), 1) fake_outputs = self.discriminator(fake_inputs) fake_loss = nn.BCELoss()(fake_outputs, torch.zeros(fake_outputs.size())) # Backpropagate and update weights for discriminator discriminator_loss = real_loss + fake_loss self.discriminator.zero_grad() discriminator_loss.backward() self.optimizer_D.step() # Train generator noise = Variable(torch.randn(inputs.size(0), self.generator.input_dim)) fake_labels = Variable(torch.LongTensor(inputs.size(0)).random_(0,

2023-02-17 上传