Struts 和 Ajax的结合.

Slides:



Advertisements
Similar presentations
— 高级软件人才实作培训专家 ! 北京传智播客教育 ajax 讲师:韩顺平 qq:
Advertisements

1 网站设计理念 大连理工大学创新实验学院 优秀网站展示 - LAMP 类网站
第14章 表单 在制作动态网页时,要实现信息交互,常常用到表单。 常见的表单有搜索表单、用户登录注册表单、调查表 单、留言簿表单等。本章节将和大家一起探讨在表单 的基本概念和各个元素,以及在Dreamweaver CS4中 如何创建表单,并通过实例掌握表单制作的方法。
国家精品资源共享课的建设与经验共享 南京工业职业技术学院 郭晓晶.
第六 章数据库访问页 6.1 数据访问页视图 6.2 创建数据访问页 6.3 编辑数据访问页 6.4 查看数据访问页 退出.
事件驱动的移动数据中心 广州舜飞信息科技有限公司 谭荣棉.
基于SSH的web开发 AND 企业级WEB应用开发新技术
姓名: 钱琬婷 学号: 0501W238 专业: 计算机科学与技术 指导教师: 陈家琪 教授
Web程序设计基础 太原理工大学 计算机科学与技术学院 林福平 求实创新
实训十四、IE浏览器的基本应用.
王寧疆 資深講師 資策會數位教育研究所 MCPD/MCT/MVP
第4章 JavaScript脚本语言基础 4.1 JavaScript简介 4.2 JavaScript语法基础
《网页设计与制作》 教学课件 主讲人:湖南铁道职业技术学院 陈承欢
14 JavaScript语言基础 JavaScript是一种轻量级、解释型的Web开发语言。所谓轻量级,就是语言的体系结构不是很庞杂,例如,没有C、Java等语言中的类、内存管理、系统管理等高深的知识范畴;所谓解释型,就是语言在浏览器或服务器等环境中直接被解释执行,不需要对源代码进行编译操作。
第三章 使用XMLHttpRequest对象
俄语字母的发音体系 阅读规则.
基于解释性语言的手机跨平台架构 Sloan Yi. Qt MTK.
Oracle数据库 Oracle 子程序.
模块七 信息获取与发布 第8章 计算机网络信息的获取与发布.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
数据访问页.
在PHP和MYSQL中实现完美的中文显示
行動研究就是一種行動性的研究,由行動者來進行研究,而不是由外於行動領域的學者與與科學家來進行,研究的問題也取自行動。
第 3 章 網頁的基本設定與預覽.
DhtmlXGrid表格显示控件简介.
网络协会2017培训 恶补Web知识训练营 2017/4/7 – Payne.
Ajax编程技术 第一章 Ajax简介.
AJAX基础.
SVN的基本概念 柳峰
Ebooking 突发问题解决方案.
SQL Injection.
走进编程 程序的顺序结构(二).
第11章:一些著名开源软件介绍 第12章:服务安装和配置 本章教学目标: 了解当前一些应用最广泛的开源软件项目 搭建一个网站服务器
以ISI平台为例,为您演示一下如何在Endnote文献中查看该文献的References
第17章 网站发布.
任务1-3 使用Dreamweaver创建ASP网页
网 站 设 计 与 建 设 Website design and developments
A New Kind of JavaScript Library
SOA – Experiment 2: Query Classification Web Service
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
Ajax编程技术 第六章 调试与错误处理.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
顺序表的删除.
第四章 团队音乐会序幕: 团队协作平台的快速创建
Drupal Dev 我想知道:什么时候、什么变化.
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
姚金宇 MIT SCHEME 使用说明 姚金宇
项目二:HTML语言基础.
Lightweight Data-flow Analysis for Execution-driven Constraint Solving
Web安全基础教程
JSP实用教程 清华大学出版社 第2章 JSP运行环境和开发环境 教学目标 教学重点 教学过程 2019年5月7日.
网 站 设 计 与 建 设 Website design and developments
3.16 枚举算法及其程序实现 ——数组的作用.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
Touch Github = Touch the World
郑 昀 应用开发事业部 神州泰岳 SIP多方会话消息 之实例讲解 郑 昀 应用开发事业部 神州泰岳
Ajax编程技术 第一章 Ajax简介.
目 录: 一、网络存储系统的登录 二、网络存储系统的基本使用 三、学生提交作业功能的使用 四、教师开放资源功能的使用.
Python 环境搭建 基于Anaconda和VSCode.
W3C标准网页制作 主讲教师:张 涛.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
WEB程序设计技术 数据库操作.
使用ADO访问数据库 李宝智 BonizLee 课程 10564A
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
多个Activity的使用 本讲大纲: 1、使用Bundle在Activity之间交换数据 2、调用另一个Activity并返回结果
Presentation transcript:

Struts 和 Ajax的结合

未使用Ajax之前 模仿桌面应用程序的两个选择 1)发送所有的可能作为页面的一部分被请求的信息,使用大量的javaScript来处理(非企业级); 2)不改变形式的提交到后台服务器; Ajax提供了给你融合前台的最佳解决方案--动态的页面

实现动态页面你的选择 等待下一个融合了Ajax技术的Stuts版本; 直接采用新的方法(dwr或者Ruby on Rails); 在已然存在的struts中加入ajax,实现struts和ajax的结合;

在struts中增加ajax的优势 不需要任何新的库文件或者服务器代码(只需要使用现有的Struts库文件和action ) 解决方案中所有部分――JavaScript,XML,Java和Struts――早已为广泛所知。 此应用可以一块一块地移植到AJAX;我们可以确定哪些部分对用户有益,并首先将它们更新到动态AJAX显示。

实现方案 首先看一个现有的struts应用(未添加ajax); 需要注意的地方;

在struts中添加ajax 演示效果 添加AJAX是出奇的容易。服务器端的代码和前面的例子是一样的: 一个Struts的ActionForm来后去数据,一个Struts的Action来执行需要的任务(例如,存储数据库)然后转发到适当的JSP页面来显示结果。

继续 在web页面中引入一个ajax.js; 确保你希望在AJAX调用中更新的web页面的部分包含在标签中,并且给每个标签一个id 当一些事件触发的时候就更新页面 为了页面的显示/更新,最简单的方法是Struts Action转发回同样的页面

Ajax解决方案的细节 增加一个JavaScript方法来完成到服务器的“背后的”AJAX调用 在JSP页面增加标签标签,这个标签中内容将在AJAX调用中更新

发送ajax请求到服务器 retrieveURL()方法获得服务器的URL和Struts form。URL用于使用AJAX,form的值用于传递到服务器。 getFormAsString()方法用于将retrieveURL()中form命名的值组装成查询字符串,并发送到服务器。 使用方法很简单,使用onclick()/onChange()事件来触发retrieveURL()更新显示

retrieveURL方法 function retrieveURL(url,nameOfFormToPost) { //将url转换成字符串 url=url+getFormAsString(nameOfFormToPost); //调用AJAX if (window.XMLHttpRequest) { // 非IE浏览器 req = new XMLHttpRequest(); req.onreadystatechange = processStateChange; try { req.open("GET", url, true); } catch (e) { alert("Server Communication Problem\n"+e); } req.send(null); } else if (window.ActiveXObject) { // IE req = new ActiveXObject("Microsoft.XMLHTTP"); if (req) { req.onreadystatechange=processStateChange; req.open("GET", url, true); req.send(); } } }

getFormAsString()方法 function getFormAsString(formName){ //设置返回字符串 returnString =""; //取得表单的值 formElements=document.forms[formName].elements; //循环数组,组装url //像'/strutsaction.do&name=value'这样的格式 for(var i=formElements.length-1;i>=0; --i ){ //转化每一个值 returnString+="&" +escape(formElements[i].name)+"=" +escape(formElements[i].value); } //返回字符串 return returnString; }

根据ajax的响应,更新web页面 processStateChange(): 该方法在AJAX调用前设定。它在服务器响应到达后由XMLHttpRequest/Microsoft.XMLHTTP 对象调用。 splitTextIntoSpan(): 根据响应,循环取出数组中的元素组装成NewContent。 replaceExistingWithNewHtml(): 根据span元素数组,循环搜索,将里面的元素调换掉页面中和它的'someName'相同的中的内容

processStateChange() 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 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( 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; }

新的控制流

注意几点 避免复制代码,最好在初始化请求(如,显示完整的页面)和AJAX(更新部分页面)请求中使用相同的Struts Action和JSP 在公共的Action(控制器)中,决定JSP页面(所有的JSP页面或者其中的一部分)中的一个区域需要传送到浏览器。通过在web服务器的session或者ActionForm中设定标记来让JSP页面知道哪些部分需要提交 在JSP中,使用Struts 或者JSTL标签来决定提交的HTML区域