当前位置: 首页 > news >正文

在Struts应用中使用Ajax

 

到现在为止,我们学习过了使用JavaScript来完成AJAX调用(前面列出),Struts Action,ActionForm以及JSP(基本没有变化,只是增加了标签)。为了完善我们对Struts-AJAX项目的了解,我们需要了解三个用于根据服务器返回的结果而更新页面的JavaScript方法。

  • • processStateChange(): 该方法在AJAX调用前设定。它在服务器响应到达后由XMLHttpRequest/Microsoft.XMLHTTP 对象调用。
  • •splitTextIntoSpan(): 根据响应,循环取出数组中的元素组装成NewContent。
  • •replaceExistingWithNewHtml(): 根据span元素数组,循环搜索,将里面的元素调换掉页面中和它的'someName'相同的中的内容。注意,我们使用的是req.responseText 方法来获得返回的内容(它允许我们操作任何文本的响应)。与此相对于的是req.responseXml (它的作用更大,但是要求服务器返回是XHTML或者XML)。

function processStateChange() {

if (req.readyState == 4) { // 完成

if (req.status == 200) { // 响应正常

//将响应的文本分割成Span元素

spanElements =

splitTextIntoSpan(req.responseText);

//使用这些Span元素更新页面

replaceExistingWithNewHtml(spanElements);

} else {

alert("Problem with server response:/n "

+ req.statusText);

}

}

}

replaceExistingWithNewHtml()是为processStateChange()使用的“私有”方法。

function replaceExistingWithNewHtml

(newTextElements){

//循环newTextElements

for(var i=newTextElements.length-1;i>=0;--i){

//判断是否以 if(newTextElements[i].

indexOf("-1){

//获得span的名字- 设置在第一和第二个引号之间

//确认span元素是以下的格式

//NewContent

startNamePos=newTextElements[i].

indexOf('"')+1;

endNamePos=newTextElements[i].

indexOf('"',startNamePos);

name=newTextElements[i].

substring(startNamePos,endNamePos);

//获得内容-在第一个>标记后的所有内容

startContentPos=newTextElements[i].

indexOf('>')+1;

content=newTextElements[i].

substring(startContentPos);

//现在更新现有的Document中的元素,

// 确保文档存在该元素

if(document.getElementById(name)){

document.getElementById(name).

innerHTML = content;

}

}

}

splitTextIntoSpan() 是为processStateChange() 使用的“私有”方法。

function splitTextIntoSpan(textToSplit){

//分割文档

returnElements=textToSplit.

split("")

//处理每个元素

for(var i=returnElements.length-1;i>=0;--i){

//删除掉第一个span后面的元素

spanPos = returnElements[i].

indexOf("

//如果找到匹配的,获得span前的内容

if(spanPos>0){

subString=returnElements[i].

substring(spanPos);

returnElements[i]=subString;

}

}

return returnElements;

}

新的控制流

添加以下的JavaScript代码到我们的应用中,以下的步骤将在服务器和浏览器中执行。

  • 1. 如同一个普通Struts应用装载页面。
  • 2. 用户改变文本框的值,触发一个onChange() 事件,调用retrieveURL() 方法。
  • 3. 该JavaScript方法通过发送Struts明白的表单变量(后台)请求到服务器的Struts Action。
  • 4. 该JavaScript方法同样设定了第二个JavaScript方法的名字,此方法将到服务器响应完毕后调用。本例子中,设定为processStateChange() 方法。
  • 5. 如我们所预期的,服务器响应完毕,调用processStateChange() 方法。
  • 6. JavaScript在(新的)服务器响应中循环取出所有元素。将页面上存在与获得元素名字相同的 中的元素替换掉。

在你的应用中设计AJAX

以上描述的JavaScript方法能在大多数的应用中使用,包括比我们的例子复杂得多的。但是,在使用之前,你需要注意以下几点:

• 避免复制代码,最好在初始化请求(如,显示完整的页面)和AJAX(更新部分页面)请求中使用相同的Struts Action和JSP。

•在公共的Action(控制器)中,决定JSP页面(所有的JSP页面或者其中的一部分)中的一个区域需要传送到浏览器。通过在web服务器的session或者ActionForm中设定标记来让JSP页面知道哪些部分需要提交。

• 在JSP中,使用Struts 或者JSTL标签来决定提交的HTML区域。

相关文章:

  • jQuery计算文本宽度和input标签根据输入字符动态自适应宽度的实现
  • Eclipse 3.2.2 安装、汉化和插件配置
  • iOS开发 贝塞尔曲线UIBezierPath(2)
  • Eclipse 平台入门
  • 【安卓面试题】Activity和Task的启动模式有哪些?每种含义是什么?举例说明各自的应用场景...
  • ??eclipse的安装配置问题!??
  • Eclipse 修改某个项目文件的编码类型
  • FastReport使用总结三——条码简介
  • Eclipse开发环境的使用
  • 线上mongodb 数据库用户到期时间修改的操作记录
  • 开源技术 Eclipse使用技巧
  • lucene maven
  • MyEclipse 5.5 + Tomcat 开发视频,下载,安装,配置,开发并运行Web项目
  • live555_RTSP连接建立以及请求消息处理过程
  • ??myeclipse+tomcat
  • [PHP内核探索]PHP中的哈希表
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Java Agent 学习笔记
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • js ES6 求数组的交集,并集,还有差集
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Logstash 参考指南(目录)
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Nodejs和JavaWeb协助开发
  • RxJS: 简单入门
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vue中实现单选
  • 多线程 start 和 run 方法到底有什么区别?
  • 计算机常识 - 收藏集 - 掘金
  • 如何解决微信端直接跳WAP端
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​queue --- 一个同步的队列类​
  • ​比特币大跌的 2 个原因
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • !$boo在php中什么意思,php前戏
  • #{} 和 ${}区别
  • #Linux(帮助手册)
  • #QT(智能家居界面-界面切换)
  • #微信小程序:微信小程序常见的配置传值
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (全注解开发)学习Spring-MVC的第三天
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (循环依赖问题)学习spring的第九天
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .Net中的集合