Web应用操作实现全解析
立即解锁
发布时间: 2025-08-23 01:08:38 阅读量: 3 订阅数: 14 


数据密集型Web应用的设计与实现
### Web 应用操作实现全解析
在 Web 应用开发中,内容更新和通用操作的实现是至关重要的环节。下面将详细探讨操作实现的相关技术和方法。
#### 1. 操作实现概述
实现带有操作的超文本需要两个不同的步骤:
- **构建调用操作的页面模板**:这一步复用之前示例中展示的所有实现技术,并进行一些小的扩展。
- **实现操作**:此任务需要实际实现操作的业务逻辑,以及在操作完成后决定要遵循哪个链接所需的结果检查代码。
为了简化示例,我们假设操作以 JSP 模板(即操作模板)的形式实现,以区别于页面模板。虽然从编程风格的角度来看,将操作编码为 Servlet 是更合适的方法,但为了避免引入 Servlet 编程的复杂性,我们在后续章节再进行改进。
#### 2. 操作实现的通用模式
操作通过在页面中的单元与操作之间建立链接插入到超文本中,导航该链接将触发操作。操作实现主要涉及两个方面:
- **如何编码操作序列**
- **如何构建激活该序列的链接**
操作序列(包括单个操作作为特殊情况)通过编写适当的 JSP 操作模板来实现,其一般结构如下:
| 部分 | 描述 |
| ---- | ---- |
| 第一部分 | 从 HTTP 请求中提取参数,与页面模板的相应部分相同。 |
| 第二部分 | 准备和执行操作查询:<br>1. 开始事务<br>2. 为当前操作的查询实例化参数<br>3. 执行当前操作的查询<br>4. 如果出现错误,回滚当前事务并将控制转发到当前操作的 KO 链接的目标<br>5. 如果当前操作不是最后一个操作,则转到步骤 2 |
| 第三部分 | 显示结果页面:<br>6. 提交当前事务<br>7. 将控制转发到当前操作的 OK 链接的目标 |
操作链的实现还会影响激活操作链的页面的编码。激活操作链的链接的 HTML 实现必须遵循以下规则:
- 链接除了携带自身参数外,还必须携带到达同一链中操作的传输链接所携带的所有参数。可以通过以下两种方式实现:
- 如果链接实现为锚标签,则将适当的参数添加到其 URL 的查询字符串中。
- 如果链接实现为 HTML 表单的提交按钮,则向 HTML FORM 标签添加隐藏类型的输入字段。
- 如果任何操作有指向激活操作链的页面的链接,则激活链接还必须携带用于“记住”外部依赖单元输入的额外参数。
```mermaid
graph TD;
A[提取 HTTP 请求参数] --> B[准备和执行查询];
B --> B1[开始事务];
B1 --> B2[实例化当前操作查询的参数];
B2 --> B3[执行当前操作查询];
B3 --> B4{是否出错};
B4 -- 是 --> B5[回滚事务,转发到 KO 链接目标];
B4 -- 否 --> B6{是否最后一个操作};
B6 -- 否 --> B2;
B6 -- 是 --> C[显示结果页面];
C --> C1[提交事务];
C1 --> C2[转发到 OK 链接目标];
```
#### 3. 从索引中选择对象进行删除操作的实现
以删除新闻类别为例,假设删除操作通过名为 `delete.jsp` 的 JSP 操作模板实现。页面 `NewsCategoryDelete` 的实现与之前的代码类似,但第 23 行的 URL 指向包装删除操作的 JSP 模板。
```jsp
<%@page language="java" %>
<%@ page import= "java.sql.*" %>
<% // REQUEST PARAMETERS FETCH
String selectedOID = request.getParameter("OID");
// DATABASE CONNECTION
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection("jdbc:odbc:acme",
"acmeuser", "acmepwd");
// QUERY PREPARATION
PreparedStatement pstmt = conn.prepareStatement(
"DELETE FROM NEWSCATEGORY WHERE OID =?");
pstmt.setString(1, selectedOID);
// QUERY EXECUTION AND ERROR TRAPPING
try {
pstmt.executeUpdate();
} catch (SQLException e) {
pageContext.forward("errorPage.jsp"); // KO LINK
}
pstmt.close(); // TEMPORARY OBJECTS DISPOSITION
conn.close();
pageContext.forward("newsCategories.jsp"); // OK LINK
%>
```
该操作模板的执行过程如下:
1. 从 HTTP 请求中提取所选对象的 OID。
2. 建立数据库连接。
3. 准备删除操作的查询。
4. 执行查询,并使用 `try-catch` 块捕获可能的 SQL 异常。
5. 如果执行成功,将控制转发到 `newsCategories.jsp` 页面;如果失败,将控制转发到 `errorPage.jsp` 页面。
此示例可以轻松扩展以实现使用多选单元选择的多个对象的删除,通过动态组装 SQL 命令的 `WHERE` 条件来实现。
#### 4. 与创建单元链接的输入单元操作实现
创建操作的实现涉及多个方面,包括唯一标识符的创建、文件上传以及处理包含大对象的数据库列的更新。
**唯一标识符的创建**
为新创建的对象创建唯一标识符是一个常见的问题。一种简单的方法是使用辅助的 `COUNTER` 表,该表存储当前所有实体表中使用的最大 OID 值。创建操作通过以下三个 SQL 命令实现:
1. 通过查询 `COUNTER` 表计算下一个可用的 OID。
2. 递增 `COUNTER` 表以记录新的最大 OID 值。
3. 使用计算得到的 OID 值作为新对象的主键执行 `INSERT` 语句。
为了确保并发创建操作的安全性,需要在原子事务中执行这些语句,并对 `COUNTER` 表设置排他锁。
```jsp
<%@page language="java" %>
<%@ page import= "java.sql.*" %>
<% // REQUEST PARAMETERS FETCH
String heading = request.getParameter("heading");
String body = request.getParameter("body");
// DATABASE CONNECTION
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection("jdbc:odbc:acme",
"acmeuser", "acmepwd");
// START TRANSACTION
conn.setAut
```
0
0
复制全文
相关推荐










