DWR是什么?

DWR框架简化了Ajax应用开发过程,通过将Java对象暴露给JavaScript,消除了直接处理XMLHttpRequest对象的需求。它作为Servlet部署,动态生成JavaScript存根,并处理Ajax请求到Java对象的转换。

来源:IBM中国

DWR 是什么?

从最简单的角度来说,DWR 是一个引擎,可以把服务器端 Java 对象的方法公开给 JavaScript 代码。使用 DWR 可以有效地从应用程序代码中把 Ajax 的全部请求-响应循环消除掉。这意味着客户端代码再也不需要直接处理 XMLHttpRequest 对象或者服务器的响应。不再需要编写对象的序列化代码或者使用第三方工具才能把对象变成 XML。甚至不再需要编写 servlet 代码把 Ajax 请求调整成对 Java 域对象的调用。

DWR 是作为 Web 应用程序中的 servlet 部署的。把它看作一个黑盒子,这个 servlet 有两个主要作用:首先,对于公开的每个类,DWR 动态地生成包含在 Web 页面中的 JavaScript。生成的 JavaScript 包含存根函数,代表 Java 类上的对应方法并在幕后执行 XMLHttpRequest。这些请求被发送给 DWR,这时它的第二个作用就是把请求翻译成服务器端 Java 对象上的方法调用并把方法的返回值放在 servlet 响应中发送回客户端,编码成 JavaScript。DWR 还提供了帮助执行常见的用户界面任务的 JavaScript 工具函数。

 

学习dwr框架,看资料有:官方,IBM中国(http://www.ibm.com/developerworks/cn/java/j-ajax3/),dwr中文文档.pdf

你提的问题非常关键,涉及 **前端与后端如何通过 AJAX 和 DWR 框架进行交互** 的完整流程。我们来一步步拆解你的每一个疑问,并用通俗易懂的方式解释清楚。 --- ## ✅ 一句话总览 > 用户点击一个“查看条款内容”的按钮(前端),这个按钮触发了一段 JavaScript 代码(JS 函数),该函数使用 **DWR 框架** 向后台发送异步请求(类似 AJAX),后台的 Java 方法接收参数、查询数据库、返回数据,然后前端再调用一个 **回调函数(Callback)** 把结果显示在页面上。 整个过程 **不刷新页面、不提交表单**,用户体验流畅。 --- 下面我们逐个回答你的问题: --- ### ❓1. “按钮”是前端展示的按钮吗? ✅ **是的!** - 这个“按钮”就是你在网页上看到的一个 HTML 元素,比如: ```html <button onclick="openPolicyClausesContext(this)">查看条款内容</button> ``` - 它是一个 **前端控件**,由浏览器渲染出来。 - 当用户点击它时,`onclick` 事件会触发 `openPolicyClausesContext(this)` 这个 JS 函数。 - `this` 表示当前按钮对象,传进去是为了让 JS 知道“我点的是哪一行的按钮”。 📌 所以:**按钮是前端的,但它的行为(点击后做什么)是由 JS 控制的。** --- ### ❓2. 那代码也是在后台吗? 我们要分清楚两种“代码”: | 类型 | 存放位置 | 说明 | |------|----------|------| | 🖥️ 前端 JS 代码 | `.jsp` 文件或 `.js` 文件中,运行在浏览器 | 处理用户交互、收集数据、发起请求、更新页面 | | ⚙️ 后端 Java 代码 | `.java` 文件中,运行在服务器(如 Tomcat) | 接收请求、查数据库、处理业务逻辑、返回结果 | ✅ 所以: - 按钮和 JS 函数 → **前端代码** → 浏览器执行 - Java 方法(如 `openPolicyClausesContext`)→ **后台代码** → 服务器执行 它们通过网络通信连接在一起。 --- ### ❓3. 是按钮 → 触发 JS → 调用 DWR → 发起请求 → Java 接收参数? ✅ 完全正确!流程如下: ``` [用户点击按钮] ↓ [触发 JS 函数 openPolicyClausesContext(button)] ↓ [JS 收集参数:条款编码 clauseCode] ↓ [调用 dwrInvokeData(...) —— 使用 DWR 框架发送异步请求] ↓ [请求发往服务器DwrInvokeDataAction.java 中的 openPolicyClausesContext(String clauseCode)] ↓ [Java 方法接收到 clauseCode 参数] ↓ [调用 Service 层从数据库查询条款内容] ↓ [Java 方法 return 条款文本] ↓ [DWR 框架自动将结果传回浏览器] ↓ [自动执行 JS 回调函数:openPolicyClausesContextCallback(input, output, returnObject)] ↓ [JS 更新页面:<textarea> 显示条款内容] ``` 这就是完整的 **前后端异步交互流程**。 --- ### ❓4. Java 方法接收哪些参数?(按文档) 根据文档,Java 方法只能有一个入参,但这个参数可以是多种类型: | 前端 JS 参数 | 后端 Java 参数 | 示例 | |-------------|----------------|------| | `var clauseCode = "CL001"` | `String clauseCode` | 单个字符串 | | `var id = 123` | `Integer id` 或 `Long id` | 数字自动转换 | | `["CL001", "CL002"]` | `String[] codes` | 字符串数组 | | `{clauseCode: "CL001", lineNo: 2}` | `GgClauseTextDto dto` | DTO 对象(属性名必须一致) | | `[dto1, dto2]` | `List<GgClauseTextDto>` 或 `GgClauseTextDto[]` | 对象列表 | 💡 **重要规则**: - 只能有一个参数(这是 DWR 的限制) - 系统会自动做类型转换(JS ↔ Java) - JS 对象的属性名必须和 Java DTO 的字段名完全一致 --- ### ❓5. 返回之后,再调 JS 里的什么方法去更新页面? ✅ 调用的是你指定的 **回调函数(Callback Function)** 例如你在 JS 中这样写: ```javascript dwrInvokeData( "openPolicyClausesContext", // 后台方法名 clauseCode, // 参数 "openPolicyClausesContextCallback", // ← 这就是回调函数名! inputObj, outputObj ); ``` 当后台返回数据后,系统会自动调用这个函数: ```javascript function openPolicyClausesContextCallback(inputObj, outputObj, returnObject) { // returnObject 就是后台返回的数据(比如条款内容) outputObj.value = returnObject; // 把内容填入 textarea } ``` 📌 回调函数的三个参数固定: 1. `inputObj`:你传给 `dwrInvokeData` 的第四个参数(输入域) 2. `outputObj`:第五个参数(输出域,通常是要填充的地方) 3. `returnObject`:后台返回的真实数据 --- ### ❓6. JS 里也会校验数据吗? ✅ **当然会!而且必须做!** 虽然后台也要校验(防止恶意请求),但前端 JS 一般会先做初步校验,提升用户体验。 常见 JS 校验包括: ```javascript if (!clauseCode) { alert("请先输入条款编码!"); return; } if (contentOutput.value) { alert("条款内容已加载,无需重复查询!"); return; } ``` 还可以校验格式、长度、特殊字符等。 🎯 总结: - 前端 JS 校验 → 提升体验,快速反馈 - 后端 Java 校验 → 保证安全,防止绕过 两者缺一不可。 --- ### ❓7. DWR 框架是什么? #### 🔹 DWR 全称:Direct Web Remoting > 是一个 Java 开源库,可以让 JavaScript 直接调用 Java 方法,就像本地函数一样。 #### 🧩 工作原理简述: 1. DWR服务器端生成一段 JS 代理代码(比如 `DwrInvokeDataAction.openPolicyClausesContext(...)`) 2. 浏览器加载这段 JS 后,就可以像调用 JS 函数一样“假装”调用了 Java 方法 3. 实际上 DWR 内部帮你做了: - 序列化参数 → 发送 HTTP 请求 → 调用 Java 方法 → 反序列化结果 → 回调 JS 函数 #### ✅ 类比理解: | 比喻 | 解释 | |------|------| | DWR 就像“翻译官” | 把 JS 的话翻译成 Java 能听懂的语言,反过来也一样 | | JS 调用 Java 方法 | 像打电话给后台:“喂,帮我查一下 CL001 的条款内容” | | 回调函数 | 后台说:“好的”,然后打回来告诉你结果 | #### ⚠️ 缺点(现代已逐渐淘汰): - 安全性较低(暴露 Java 方法名) - 不符合 REST 风格 - 调试困难 - 维护成本高 👉 现代项目更多使用 **Spring Boot + REST API + JSON + Axios/Fetch** 替代 DWR。 --- ### ❓8. AJAX 是什么? #### 🔹 AJAX 全称:Asynchronous JavaScript and XML > 是一种技术,允许网页在不刷新的情况下与服务器交换数据并更新部分页面。 #### 🎯 核心思想: - 不要整页刷新 - 只更新需要变化的部分 - 用户体验更好 #### 💡 生活类比: 你点外卖时,App 不会每次更新都重新打开一遍,而是“悄悄地”告诉你骑手到了哪里 —— 这就是 AJAX! #### ✅ AJAX 的典型步骤: ```javascript // 1. 创建请求 var xhr = new XMLHttpRequest(); // 2. 设置回调(成功时做什么) xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { document.getElementById("result").innerHTML = xhr.responseText; } }; // 3. 发起请求 xhr.open("GET", "/getClause?code=CL001", true); xhr.send(); ``` #### 🔁 DWR 和 AJAX 的关系: | 对比项 | DWR | 原生 AJAX | |--------|-----|-----------| | 是否基于 AJAX | ✅ 是 | ✅ 是 | | 是否封装了 AJAX | ✅ 是(高度封装) | ❌ 需手动写 | | 能否直接调 Java 方法 | ✅ 可以 | ❌ 不行(需定义接口) | | 学习难度 | 高(私有框架) | 中(标准 Web 技术) | 📌 所以可以说:**DWR 是建立在 AJAX 基础上的高级封装工具**。 --- ## ✅ 最终总结图(文字版) ``` ┌─────────────┐ 点击 ┌──────────────────┐ │ 用户 │────────────▶│ 页面上的按钮 │ └─────────────┘ └──────────────────┘ ↓ onclick="openPolicyClausesContext(this)" ↓ ┌──────────────────────────────────┐ │ JavaScript 函数开始执行 │ │ - 获取条款编码 │ │ - 调用 dwrInvokeData(...) │ └──────────────────────────────────┘ ↓ ┌──────────────────────────────────┐ │ DWR 框架发送 AJAX 请求 │ │ URL: /dwr/exec/DwrInvokeDataAction.openPolicyClausesContext | └──────────────────────────────────┘ ↓ ┌──────────────────────────────────┐ │ 后台 Java 方法被调用 │ │ public String openPolicyClausesContext(String clauseCode) | │ → 查询数据库 → 返回条款内容 │ └──────────────────────────────────┘ ↓ ┌──────────────────────────────────┐ │ DWR 将结果带回浏览器 │ │ 自动调用回调函数: │ │ openPolicyClausesContextCallback(...) | └──────────────────────────────────┘ ↓ ┌──────────────────────────────────┐ │ JS 更新页面 DOM │ │ document.getElementById(...).value = 返回的内容 | └──────────────────────────────────┘ ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值