在线商店配置与网页聊天系统开发
在线商店配置
配置概述
在完成各个组件的编码后,需要通过一系列配置将它们整合起来。具体步骤包括创建数据库表、定义存储配置和持久化通用对象、在 SMI 定义文件中关联在线商店命令和 Bean,最后在 Servlet 引擎中注册应用程序。
存储配置
创建数据库表
首先要创建在线商店所需的数据库表,包括
OnlineShop
、
OnlineProdukt
、
OnlineKunde
、
OnlineBestellung
和
OnlineBestellposition
表。以下是创建这些表的 SQL 语句:
// Shop
CREATE TABLE OnlineShop (
ObjectIdentifier CHAR(16) NOT NULL ,
ObjectVersion INTEGER,
Nummer VARCHAR(30),
Name VARCHAR,
Beschreibung VARCHAR,
Inhaber VARCHAR,
InhaberEMail VARCHAR,
InfoURL VARCHAR,
InfoEMail VARCHAR,
BestellEMail VARCHAR,
PRIMARY KEY (ObjectIdentifier)
);
INSERT INTO TypeNumber VALUES ( 'OnlineShop' , 151 );
// Produkt
CREATE TABLE OnlineProdukt (
ObjectIdentifier CHAR(16) NOT NULL,
ObjectVersion INTEGER,
Nummer VARCHAR (30),
Stichworte VARCHAR (50),
Beschreibung VARCHAR,
VKMenge INTEGER,
VKPreis DECIMAL,
InfoURL VARCHAR,
BildURL VARCHAR,
ShopID CHAR(16) NOT NULL,
PRIMARY KEY (ObjectIdentifier),
FOREIGN KEY (ShopID) REFERENCES OnlineShop (ObjectIdentifier)
);
INSERT INTO TypeNumber VALUES ( 'OnlineProdukt' , 152 );
// Kunde
CREATE TABLE OnlineKunde (
ObjectIdentifier CHAR(16) NOT NULL,
ObjectVersion INTEGER,
Name VARCHAR (50),
Email VARCHAR,
Password VARCHAR (8),
PLZ CHAR(5),
Ort VARCHAR (50),
Strasse VARCHAR (50),
Bank VARCHAR,
Bankleitzahl VARCHAR (20),
Kontonummer VARCHAR (20),
ShopID CHAR(16) NOT NULL,
PRIMARY KEY (ObjectIdentifier),
FOREIGN KEY (ShopID) REFERENCES OnlineShop (ObjectIdentifier)
);
INSERT INTO TypeNumber VALUES ( 'OnlineKunde' , 153 );
// Bestellung
CREATE TABLE OnlineBestellung (
ObjectIdentifier CHAR(16) NOT NULL,
ObjectVersion INTEGER,
Bestelldatum TIMESTAMP,
Bank VARCHAR,
Bankleitzahl VARCHAR (20),
Kontonummer VARCHAR (20),
PLZ CHAR(5),
Ort VARCHAR (50),
Strasse VARCHAR (50),
Bemerkung VARCHAR,
KundeID CHAR(16) NOT NULL,
ShopID CHAR(16) NOT NULL,
PRIMARY KEY (ObjectIdentifier),
FOREIGN KEY (KundeID) REFERENCES OnlineKunde (ObjectIdentifier),
FOREIGN KEY (ShopID) REFERENCES OnlineShop (ObjectIdentifier)
);
INSERT INTO TypeNumber VALUES ( 'OnlineBestellung' , 154);
// Bestellposition
CREATE TABLE OnlineBestellposition (
ObjectIdentifier CHAR(16) NOT NULL,
ObjectVersion INTEGER,
Menge INTEGER,
Betrag DECIMAL,
ProduktID CHAR(16) NOT NULL,
BestellungID CHAR(16) NOT NULL,
PRIMARY KEY (ObjectIdentifier),
FOREIGN KEY (BestellungID) REFERENCES OnlineBestellung (ObjectIdentifier),
FOREIGN KEY (ProduktID) REFERENCES OnlineProdukt (ObjectIdentifier)
);
INSERT INTO TypeNumber VALUES ( 'OnlineBestellposition' , 155);
创建存储配置文件
创建
OnlineShop.store
文件来定义与数据库的连接,并引入业务对象的定义。以下是该文件的内容:
{
StoreClass = "de.webapp.Framework.SMICommandListener.SMIStore" ;
JDBCConnection = {
// 示例配置
DriverClass = "solid.jdbc.SolidDriver" ;
URLConnect = "jdbc:solid://localhost:1313" ;
Properties = {
user = "web" ;
password = "app" ;
}
} ;
Types =
{
Shop = #include("Shop.persistence");
Kunde = #include("Kunde.persistence");
Produkt = #include("Produkt.persistence");
Bestellung = #include("Bestellung.persistence");
Bestellposition = #include("Bestellposition.persistence");
}
}
业务对象定义文件
不同业务对象的定义分别存放在不同的文件中,以下是部分示例:
-
Shop.persistence
:
{
Type ={
Name = "OnlineShop" ;
Class = "de.webapp.Framework.SMICommandListener.SMIPersistenceGeneric";
Entity = "OnlineShop";
EntityAlias = "t0" ;
Attributes = (
"ObjectIdentifier",
"ObjectVersion",
{ Name = "Nummer" ; Generic = "YES" ; Key = "YES" ;},
{ Name = "Name" ; Generic = "YES" ; },
{ Name = "Beschreibung" ; Generic = "YES" ; },
{ Name = "Inhaber" ; Generic = "YES" ; },
{ Name = "InhaberEMail" ; Generic = "YES" ; },
{ Name = "InfoURL" ; Generic = "YES" ; },
{ Name = "BestellEMail" ; Generic = "YES" ; }
) ;
Associations = (
{ Name = "Produkt" ; Type = "ToMany" ; Generic = "YES" ;
Modified = "YES" ;
ResultType = "OnlineProdukt" ; Key = "ShopID" ;
QualifierExtension = " ORDER BY t0.Nummer " ; },
{ Name = "Kunde" ; Type = "ToMany" ; Generic = "YES" ;
Modified = "YES" ;
ResultType = "OnlineKunde" ; Key = "ShopID" ; }
) ;
} ;
}
-
Produkt.persistence:
{
Type = {
Name = "OnlineProdukt" ;
Class = "de.webapp.Framework.SMICommandListener.SMIPersistenceGeneric";
Entity = "OnlineProdukt";
EntityAlias = "t0" ;
Attributes =
(
"ObjectIdentifier" ,
"ObjectVersion",
{ Name = "Nummer" ; Generic = "YES" ; },
{ Name = "Stichworte" , Generic = "YES" ; },
{ Name = "Beschreibung" ; Generic = "YES" ; },
{ Name = "VKMenge" ; Generic = "YES" ;
TypeClass = "java.lang.Integer" ; },
{ Name = "VKPreis" ; Generic = "YES" ;
TypeClass = "java.math.BigDecimal" ; },
{ Name = "InfoURL" ; Generic = "YES" ; },
{ Name = "BildURL" ; Generic = "YES" ; },
{ Name = "ShopID" ; Generic = "YES" ; }
) ;
Associations = (
{ Name = "Shop" ; Type = "ToOne" ; Generic = "YES" ;
ResultType = "OnlineShop" ;
}
) ;
} ;
}
SMI 配置
创建 SMI 定义文件
创建
OnlineShop.smi
文件,该文件用于指定命令要调用的方法和监听器,还可以为每个命令定义标准参数。以下是该文件的内容:
{
DefaultCommand = "display";
Values = {
_FollowUpCommand = "display";
_TemplateName = "index.html";
}
Listener = {
OnlineShopBean = {
Class = "de.webapp.OnlineShop.OnlineShopBean" ;
},
OnlineShopProductBean = {
Class = "de.webapp.OnlineShop.OnlineShopProductBean" ;
},
OnlineShopOrderBean = {
Class = "de.webapp.OnlineShop.OnlineShopOrderBean" ;
},
OnlineShopCustomerBean = {
Class = "de.webapp.OnlineShop.OnlineShopCustomerBean" ;
},
DisplayBean = {
Class = "de.webapp.Framework.SMICommandListener.DisplayBean";
}
};
Commands = {
// 显示
display = {
MethodName = "display";
Listener = "DisplayBean" ;
} ;
// 显示商店
startShop = {
MethodName = "display";
Listener = "DisplayBean" ;
Values = {
_TemplateName = "index.html" ;
} ;
} ;
// 显示菜单
showMenu= {
MethodName = "display";
Listener = "DisplayBean" ;
Values = {
_TemplateName = "Menue/Uebersicht.html" ;
} ;
} ;
// 显示商店信息
showShop= {
MethodName = "executeContextFollowUp";
Listener = "OnlineShopBean" ;
Values = {
_TemplateName = "ShowShop.jsp" ;
} ;
} ;
// 显示产品目录
showProducts= {
MethodName = "showProducts";
Listener = "OnlineShopProductBean" ;
Values = {
_TemplateName = "ShowProduct.jsp" ;
} ;
} ;
// 新订单
newOrder= {
MethodName = "newOrder";
Listener = "OnlineShopOrderBean" ;
Values = {
_TemplateName = "orderOneProdukt.html" ;
} ;
} ;
// 显示当前订单
showOrder= {
MethodName = "executeContextFollowUp";
Listener = "OnlineShopOrderBean" ;
Values = {
_TemplateName = "ShowOrder.jsp" ;
} ;
} ;
// 更改订单位置
changeOrder= {
MethodName = "changeOrder";
Listener = "OnlineShopOrderBean" ;
Values = {
_TemplateName = "ShowOrder.jsp" ;
} ;
} ;
// 提交订单
sendOrder= {
MethodName = "sendOrder";
Listener = "OnlineShopOrderBean" ;
Values = {
_TemplateName = "sendOrder.html" ;
} ;
} ;
// 显示客户信息
showCustomer= {
MethodName = "executeContextFollowUp";
Listener = "OnlineShopCustomerBean" ;
Values = {
_TemplateName = "ShowCustomer.jsp" ;
} ;
} ;
// 更改客户信息
changeCustomer= {
MethodName = "changeCustomer";
Listener = "OnlineShopCustomerBean" ;
Values = {
_TemplateName = "index.html" ;
} ;
} ;
// 显示客户登录界面
showLoginCustomer= {
MethodName = "display";
Listener = "DisplayBean" ;
Values = {
_TemplateName = "loginCustomer.html" ;
} ;
} ;
// 客户登录
setCustomer= {
MethodName = "setCustomer";
Listener = "OnlineShopCustomerBean" ;
Values = {
_TemplateName = "ShowShop.jsp" ;
} ;
} ;
// 客户注销
logoutCustomer= {
MethodName = "refreshShop";
Listener = "OnlineShopBean" ;
Values = {
_TemplateName = "index.html" ;
} ;
};
}
}
配置上下文
创建
OnlineShop.con
文件,用于在应用程序启动时将存储和商店信息添加到上下文中:
{
Class = "de.webapp.OnlineShop.OnlineShopContext";
Values = {
_Storename = "OnlineShop.store";
_Shopnummer = "1";
_PageSize = "3";
}
}
在 Servlet 引擎中注册
在
servlet.properties
文件中添加以下内容,将应用程序注册到 Servlet 引擎
jo!
中:
# 在线商店
servlet.OnlineShop.code=de.webapp.OnlineShop.OnlineShopServlet
servlet.OnlineShop.initArgs=EventSwitch=OnlineShop,Context=OnlineShop
servlet.OnlineShop.aliases=/OnlineShop/OnlineShop
启动
jo!
后,在线商店应可通过
http://<hostname>:<port>/OnlineShop/OnlineShop
访问。
在线商店配置流程
graph LR
A[创建数据库表] --> B[创建存储配置文件]
B --> C[创建 SMI 定义文件]
C --> D[配置上下文]
D --> E[在 Servlet 引擎中注册]
网页聊天系统开发
需求与流程定义
功能需求
开发一个简单的基于网页的聊天系统,用户应具备以下操作能力:
- 注册以保护自己的用户名
- 进入和离开聊天房间
- 向选定的参与者发送消息
- 向所有参与者发送消息
- 修改个人数据(姓名、密码和发送颜色)
该聊天系统的特点是用户只需使用支持 JavaScript 和框架的浏览器,无需在客户端使用 Java Applet。为简化示例,不考虑开设多个聊天房间。
流程概述
- 聊天系统启动后,首先显示登录对话框,用户可选择登录或注册,同时显示当前房间内的人员列表。
- 若用户选择注册,需输入姓名、密码和发送颜色。若所选用户名已被占用或出现其他错误,将显示错误消息。注册成功后,用户进入菜单对话框,可选择进入房间、注销或修改用户数据。登录成功后也会进入此菜单对话框。
- 用户进入房间后,会打开一个包含两个框架的框架集。右侧框架持续显示发送的消息,左侧框架包含一个发送对话框,包括输入框、颜色选择下拉列表、用户列表(带复选框)和发送按钮,同时还有离开房间的链接。
- 发送消息后,消息将以所选颜色显示在右侧框架中,仅显示给勾选复选框的用户。
- 用户离开房间后,将再次显示菜单对话框。若选择修改数据,将显示类似注册对话框的界面。修改成功后,返回菜单对话框,用户可选择注销,注销后将显示登录对话框。
命令说明
| 命令 | 参数 | 说明 |
|---|---|---|
| showLogin | - | 显示登录对话框,可触发 enterRoom 和 showRegistration 命令 |
| showRegistration | - | 显示输入个人数据的对话框,可能的后续命令是 createUser |
| createUser | 个人数据(姓名、密码、发送颜色) | 创建用户。若出现错误,将显示错误消息并允许重新输入数据;若成功,显示菜单对话框,用户已认证,可能的命令有 showUpdateDialog、logout 和 enterRoom |
| login | 姓名和密码 | 认证用户。若姓名和密码匹配且对应一个用户对象,显示菜单对话框;否则显示错误消息,允许用户重新输入姓名和密码 |
| enterRoom | - | 注册用户进入房间,然后调用一个框架集,左侧框架使用 showSendDialog 命令,右侧框架使用 showMessages 命令 |
| showMessages | - | 显示用户的消息 |
| showSendDialog | - | 显示发送消息的表单,可调用 sendMessage 和 leaveRoom 命令 |
| sendMessage | 最后一条消息发送的用户 | 显示如 showSendDialog 描述的发送表单,同时勾选最后一条消息发送的用户的复选框,可能的后续命令与 showSendDialog 相同 |
| showUpdateDialog | - | 显示修改用户数据的对话框,只能触发 updateUser 命令 |
| updateUser | 个人数据(姓名、密码、发送颜色) | 修改用户数据。若出现错误,重新显示输入对话框并允许输入数据;若成功,显示菜单对话框 |
| leaveRoom | - | 删除用户在房间的注册信息,返回菜单对话框,可能的操作有 showUpdateDialog、logout 和 enterRoom |
| logout | - | 使认证失效,返回登录对话框 |
类设计
涉及对象
在开始编码之前,需要确定参与聊天系统的对象。主要包括用户(用
User
对象表示,存储在存储中),以及用于控制聊天的一些对象,如
ChatRoom
用于封装聊天的流程控制(登录、注销和认证),
ChatDispatcher
用于实现消息发送机制,
ChatRegistration
用于创建和修改用户对象。
类图说明
classDiagram
class SMIServlet
class ChatRegistration {
create()
update()
setAttributes()
}
class ChatDispatcher {
send()
updateColor()
}
class ChatContext {
init()
}
class ChatRoom {
enter()
leave()
register()
unregister()
logout()
login()
showMessages()
getUserForName()
}
class SMIStore {
valueBound()
valueUnbound()
}
class ChatBean {
executeSMIEvent()
noop()
getUser()
setUser()
removeUser()
getUserlist()
getStore()
}
class C_Chat {
<<Interface>>
}
class I_MessageWriter {
<<Interface>>
write()
canWrite()
}
class HTMLMessageWriter {
mySentBytes : int
HTMLMessageWriter()
write()
canWrite()
}
class ChatSwitch {
init()
}
class User {
myLastMessage : long
stopped : boolean
User()
init()
bind()
getName()
setName()
getPassword()
setPassword()
getColor()
setColor()
getAttribute()
isNameFree()
canCreate()
canUpdate()
touch()
getInactiveTime()
setChat()
removeChat()
handleMessage()
writeMessages()
valueBound()
valueUnbound()
toString()
}
SMIServlet --> ChatRegistration
SMIServlet --> ChatDispatcher
SMIServlet --> ChatContext
SMIServlet --> ChatRoom
SMIServlet --> SMIStore
SMIServlet --> ChatBean
ChatRegistration --> C_Chat
ChatDispatcher --> C_Chat
ChatContext --> C_Chat
ChatRoom --> C_Chat
ChatBean --> C_Chat
HTMLMessageWriter --> I_MessageWriter
User --> C_Chat
常量接口
定义
C_Chat
接口来存储常量,这些常量在后续的类中会被使用:
package de.webapp.Chat ;
public interface C_Chat {
/** 常量用于用户 */
public static final String C_User = "_User";
/** 常量用于存储 */
public static final String C_Store = "_Store";
/** 常量用于存储名称 */
public static final String C_StoreName = "_StoreName";
/** 常量用于默认存储名称 */
public static final String C_DefaultStoreName = "Chat.store";
/** 常量用于用户列表 */
public static final String C_Userlist = "_Userlist";
/** 常量用于用户名 */
public static final String C_Username = "_Username";
/** 常量用于密码 */
public static final String C_Password = "_Password";
/** 常量用于密码 */
public static final String C_Password2 = "_Password2";
/** 常量用于颜色 */
public static final String C_Color = "_Color";
/** 常量用于接收者 */
public static final String C_To = "_To";
/** 常量用于消息 */
public static final String C_Message = "_Message";
/** 常量用于 "所有人" */
public static final String C_All = "_All";
/** 后续命令的参数 */
public static final String C_FollowUpCommand = "_FollowUpCommand";
/** JSP 和 HTML 显示的模板参数 */
public static final String C_Template = "_TemplateName";
/** 错误消息的参数 */
public static final String C_ErrorMessage = "_ErrorMessage";
/** HTMLMessageWriter 允许写入的最大字节数 */
public static final int C_MaxBytes = 4096;
/** 用户自动注销前的最大空闲时间 */
public static final long C_MaxInactiveTime = 1000 * 60 * 15;
/** 颜色常量 */
public static final String C_Colors[] = new String[] {
"#000000", "#ff0000", "#0000ff",
"#ffff00", "#008080", "#800000",
"#ff00ff"
};
public static final String C_ColorNames[] = new String[] {
"schwarz", "rot", "blau",
"gelb", "teal", "maroon",
"fuchsia"
};
}
聊天上下文类
创建
ChatContext
类,继承自
SMIContext
,用于在初始化时打开存储并将其存储在上下文中。当存储与
HttpSession
、
I_SMIEventSwitch
或
I_SMIContext
解绑时,会自动关闭。
package de.webapp.Chat ;
import de.webapp.Framework.ConfigManager.*;
import de.webapp.Framework.SMI.*;
import de.webapp.Framework.StoreFactory.StoreFactory;
import de.webapp.Framework.Persistence.*;
import java.util.Hashtable;
public class ChatContext extends SMIContext implements C_Chat {
/** 打开聊天存储 */
public void init(String aContextName, Hashtable aValues) throws SMIException {
super.init(aContextName, aValues);
// 读取存储名称
String theStorename = (String)getValue(C_StoreName);
// 必要时使用默认名称
if(theStorename == null) {
theStorename = C_DefaultStoreName;
}
I_Store theStore = null;
}
}
网页聊天系统流程
graph LR
A[启动聊天系统] --> B[显示登录对话框]
B --> C{选择操作}
C -- 注册 --> D[显示注册对话框]
D --> E{注册结果}
E -- 成功 --> F[显示菜单对话框]
E -- 失败 --> D
C -- 登录 --> G{登录结果}
G -- 成功 --> F
G -- 失败 --> B
F --> H{选择操作}
H -- 进入房间 --> I[打开框架集]
I --> J[发送消息]
J --> K[显示消息]
I --> L[离开房间]
L --> F
H -- 修改数据 --> M[显示修改数据对话框]
M --> N{修改结果}
N -- 成功 --> F
N -- 失败 --> M
H -- 注销 --> B
聊天系统类设计详细解析
各主要类的功能说明
| 类名 | 功能描述 |
|---|---|
ChatRegistration
|
负责用户的创建和更新操作,包含
create()
、
update()
和
setAttributes()
等方法。
|
ChatDispatcher
|
实现消息的发送和颜色更新功能,有
send()
和
updateColor()
方法。
|
ChatContext
|
继承自
SMIContext
,在初始化时打开存储并将其存储在上下文中,确保存储在合适的时候关闭。
|
ChatRoom
| 封装聊天的流程控制,如用户的进入、离开、注册、注销、登录等操作,还有显示消息和根据用户名获取用户的功能。 |
ChatBean
| 处理 SMI 事件,提供获取和设置用户、移除用户、获取用户列表和存储等功能。 |
User
| 表示聊天系统中的用户,包含用户的基本信息(如姓名、密码、颜色)和操作方法(如创建、更新、处理消息等)。 |
类之间的关系
从类图可以看出,
SMIServlet
与多个类存在关联,它是整个系统的一个入口点,负责调用不同的功能类。
ChatRegistration
、
ChatDispatcher
、
ChatContext
、
ChatRoom
和
ChatBean
都依赖于
C_Chat
接口,因为它们需要使用该接口中定义的常量。
HTMLMessageWriter
实现了
I_MessageWriter
接口,具备写入消息和判断是否可以写入的能力。
聊天系统命令执行流程
graph LR
A[用户发起命令] --> B{命令类型}
B -- showLogin --> C[显示登录对话框]
B -- showRegistration --> D[显示注册对话框]
B -- createUser --> E{注册结果}
E -- 成功 --> F[更新用户信息并显示菜单]
E -- 失败 --> D
B -- login --> G{登录结果}
G -- 成功 --> F
G -- 失败 --> C
B -- enterRoom --> H[注册用户进入房间并打开框架集]
B -- showMessages --> I[显示消息]
B -- showSendDialog --> J[显示发送对话框]
B -- sendMessage --> K[发送消息并更新显示]
B -- showUpdateDialog --> L[显示修改数据对话框]
B -- updateUser --> M{修改结果}
M -- 成功 --> F
M -- 失败 --> L
B -- leaveRoom --> N[注销用户房间注册并显示菜单]
B -- logout --> C
在线商店与聊天系统的技术总结
在线商店
在线商店的配置是一个逐步推进的过程,从数据库表的创建开始,到存储配置文件、SMI 定义文件的编写,再到上下文的配置和在 Servlet 引擎中的注册,每个步骤都紧密相连。这种配置方式确保了系统的各个组件能够协同工作,为用户提供一个完整的购物体验。
聊天系统
聊天系统的开发注重用户需求和流程的设计,通过定义明确的命令和类结构,实现了用户的注册、登录、消息发送等功能。使用常量接口和上下文类,提高了系统的可维护性和扩展性。
技术点分析
数据库操作
在线商店的数据库表设计考虑了业务对象之间的关系,如
OnlineShop
与
OnlineProdukt
、
OnlineKunde
等表之间的关联,通过外键约束保证了数据的一致性。在创建表时,使用
CREATE TABLE
语句定义表结构,使用
INSERT INTO
语句插入类型编号。
配置文件编写
存储配置文件
OnlineShop.store
定义了与数据库的连接信息和业务对象的引入,SMI 定义文件
OnlineShop.smi
则将命令与方法和监听器进行了绑定,同时为命令设置了标准参数。这些配置文件的合理编写使得系统的配置和扩展更加方便。
类设计与接口使用
聊天系统的类设计遵循面向对象的原则,将不同的功能封装在不同的类中,通过接口
C_Chat
定义常量,提高了代码的可维护性和可读性。各个类之间通过方法调用和依赖关系协同工作,实现了聊天系统的各项功能。
实际应用建议
在线商店
- 在实际应用中,可以根据业务需求对数据库表进行扩展,如添加新的字段或表来满足更多的业务逻辑。
- 对于 SMI 定义文件,可以根据不同的业务场景添加新的命令和监听器,以实现更多的功能。
聊天系统
-
可以对
ChatRoom类进行扩展,实现多个聊天房间的管理,以满足不同用户群体的需求。 - 对于消息的存储和处理,可以考虑使用更高效的存储方式,如数据库或缓存,以提高系统的性能。
总结
通过对在线商店配置和网页聊天系统开发的详细介绍,我们了解了如何从需求分析、流程设计到具体的编码实现一个完整的系统。在开发过程中,合理的数据库设计、配置文件编写和类设计是关键,它们能够提高系统的可维护性、扩展性和性能。希望这些内容能够为相关系统的开发提供一些参考和借鉴。
5254



被折叠的 条评论
为什么被折叠?



