`

AjaxAnyWhere+Struts的一个应用(demo/feature crew)

阅读更多
  • AjaxAnywhere介绍:

   AjaxAnywhere, 是能够把任何一套现存的JSP组件转换成AJAX感知组件而不需要复杂的JavaScript编码.它利用标签把Web页面简单地划分成几个区域,然后使用AjaxAnywhere来刷新那些需要被更新的区域. AjaxAnywhere 并不需要大规模修改原来的既有代码. 相对来说, 比较容易实现. 并且并没有把你的程序和AJAX绑定到一起. 即使是一些不支持AJAX的浏览器,也还可以正常地工作。 下载地址

  • AjaxAnywhere使用"分区刷新"的思路,其工作原理如下。

使用AjaxAnywhere自定义标签库将一个Web页面划分为几个可重载的区域(reload-capable zones)。

使用AjaxAnywhere Javascript 应用编程接口(API)替代传统通信机制下表单提交方式。

当请求在服务器端处理的时候,决定那些页面区域可以刷新(refresh)。这个过程可以使用基于客户端的Javascript或者基于服务器端的AjaxAnywhere应用编程接口(API)。

在服务器端,AjaxAnywhere会生成包含即将更新的HTML代码的XML文档。

在客户端,AjaxAnywhere Javascript接受这个XML文档,解析文档,并更新指定的页面区域。


  • 技术选型(模型)优势

无须掌握和开发那么多的Javascript代码。

由于缺乏被广泛接受的命名习惯、格式化规则和模式,使得Javascript编码相对Java/JSP复杂许多,尤其在浏览器兼容性方面缺乏有效的调试和单元测试手段。使用AjaxAnywhere可以摆脱这些Javascript的复杂性。


方便集成。

使用AjaxAnywhere无须改变底层的应用程序代码。


降低技术风险。

可以随时在传统的通信机制和Ajax之间切换,允许Web应用程序同时支持两种通信机制。


平滑的兼容性。

再也不用在使用Ajax还是传统的交互方式间摇摆了,使用Ajax AnyWhere的Web应用程序可以兼容两种请求方式。

AjaxAnywhere的客户端脚本经过了IE,Mozilla Firefox和Opera等浏览器的兼容性测试,能够最大程度地保证代码的浏览器兼容性。



  • 部分注意事项

需要注意的AjaxAnywhere特性是,Ajax接收到的Ajax代码采用特殊的方式处理。AjaxAnywhere通过eval("")的方式执行这些Javascript代码,也可以将所定义的Javascript函数保存在适当的上下文(Context)中。不过,在允许Ajax方式重载的页面区域,不允许执行document.write()之类的Javascript语句。

允许重载的区域可能在提交请求之前就确定了,这种情况下需要重载客户端的AjaxAnywhere.getZonesToReload()的Javascript函数,不需要额外的服务器逻辑处理。

如果希望AjaxAnywhere重载整个文档,则重载后的AjaxAnywhere.getZonesToReload()函数必须返回“document.all”字符串,也可以在服务器端调用AAUtils.setRefreshAll(true)刷新整个页面。

相应的,Ajax请求中的response.sendRedirect()会被转化成Javascript代码的location.replace()命令。



下面看Demo:
配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" target="_blank" rel="nofollow">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>">

	<welcome-file-list>
		<welcome-file>list.jsp</welcome-file>
	</welcome-file-list>

	<filter>
		<filter-name>SetCharacterEncoding</filter-name>
		<filter-class>com.filter.EncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>SetCharacterEncoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<filter>
		<filter-name>AjaxAnywhere</filter-name>
		<filter-class>org.ajaxanywhere.AAFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>AjaxAnywhere</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>

	<filter-mapping>
		<filter-name>AjaxAnywhere</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>

	<servlet>
		<servlet-name>action</servlet-name>
		<servlet-class>
			org.apache.struts.action.ActionServlet
		</servlet-class>
		<init-param>
			<param-name>config</param-name>
			<param-value>/WEB-INF/struts-config.xml</param-value>
		</init-param>
		<init-param>
			<param-name>debug</param-name>
			<param-value>3</param-value>
		</init-param>
		<init-param>
			<param-name>detail</param-name>
			<param-value>3</param-value>
		</init-param>
		<load-on-startup>0</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>action</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
</web-app>


注意上面的最重要的是:设置AjaxAnywhere filter.

view代码:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://ajaxanywhere.sourceforge.net/" prefix="aa"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
  <head> 
    <title>list.jsp</title>
 
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">  
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
    <script type="text/javascript" src="inc/aa.js"></script>
	<script>
	  <!-- 所要提交的表单 -->	
	   function doCheck(){
		    ajaxAnywhere.formName="listForm";
			ajaxAnywhere.submitAJAX();
			ajaxAnywhere.getZonesToReload = function () {
            return "formlist,1"
    };
			
		}			
	 
	</script>
    
  
 </head>
  
  <body> 
        <c:set value="Sophia" var="str"></c:set>
        <c:out value="${str}"></c:out>
        <center>
    	<div>列表</div>       
                <!-- 这里标识了一个待局部刷新的区域 -->	
    	   <aa:zone name="formlist">
		    	<table>
		    		<tr>
		    			<td>ID编号   </td>
		    			<td>姓名</td>
		    			<td>性别</td>
		    			<td>工作行业</td>
		    			<td>${flag}</td>
		    		</tr>		    		 
		         </table>
		   </aa:zone>    	  
   </center> 
   <br>
   <br>
   <hr>
    <center>
    		<div> <h3>录入</h3></div>
    		<html:form action="/listAction" method="post" >
    		<table>
    			
    			 <tr>
    			 	<td>姓名 :</td><td><input type="text" name="name" /></td>
    			 </tr>
    			 <tr>
    			 	<td>性别 :</td><td><input type="text" name="sex" /></td>
    			 </tr>
    			 <tr>
    			 	<td>工作行业:</td><td><input type="text" name="work" /></td>
    			 </tr>
    			 <tr>
    			 	<td>地址:</td><td><input type="text" name="address" /></td>
    			</tr>
    			<tr>
    				<td> <html:submit value="提 交" styleClass="button" onclick="return doCheck()"/></td ><td><input type="reset" value="取消" /></td >
    			</tr > 
    			
    		</table>
    		 </html:form>
    </center>
    
  </body>
</html>


action代码:

package com.action;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.ajaxanywhere.AAUtils;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.action.ListForm;

public class ListAction extends Action {
	public ActionForward execute(ActionMapping actionMapping,
			ActionForm actionForm, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		if (actionForm != null) {
			ListForm form = (ListForm) actionForm;
			System.out.println("name=" + form.getName());
		}
                                 //它标识了要刷新的区域.
		if (AAUtils.isAjaxRequest(request)) {
			AAUtils.addZonesToRefresh(request, "formlist");
			System.out.println("AjaxRequest=Ok");
		}		request.setAttribute("flag", "pass");

		return actionMapping.findForward("list");
	}

}


最后附加整个demo的打包(war包含source code)
0
3
分享到:
评论
1 楼 yw9002 2012-11-21  
你这个貌似提交的时候整个页面都会刷新。

相关推荐

    PSO_Crew_pairing_swarm_mainxel_crewpairing_PSO_particleswarm_

    本文将深入探讨一个特定的优化技术——粒子群优化(PSO),以及它在解决机组配对问题(Crew Pairing Problem, CPP)中的应用。机组配对问题是一个典型的组合优化问题,常见于航空公司运营中,目标是为飞行员和空乘...

    delphi里的telnet代码demo

    delphi里的telnet代码demo,客户端和服务器demo {----------------------------------------------------------------------------- Demo Name: Telnet client demo Author: Copyright: Indy Pit Crew Purpose:...

    Azn-Crew-Bible:Azn-Crew Bible

    "Azn Crew"可能是一个编程团队、一个社区或者一个项目组,具体含义需要根据上下文来确定。在这个指南中,我们可以预期找到关于这个团队的组织结构、工作流程、技术栈以及团队文化等多方面信息。 标签“JavaScript”...

    EmoGenius Crew's requirement specification

    EmoGenius Crew致力于构建一个能够感知和回应用户情绪的智能系统,通过机器人和设备实现与用户的共享情感体验。 2.1.2 应用目标与范围 本项目旨在打造一个跨平台的应用程序,用户可以通过智能手机、智能家居设备或...

    Suduko_Suduko_crew6yj_数独_

    本项目名为"Suduko_Suduko_crew6yj",由用户"crew6yj"开发,旨在提供一个自动解数独的程序。 程序的核心功能是接受一个9x9的数独网格作为输入,其中未确定的数字用0表示。通过一系列算法,程序能够填充这些空位,...

    crew-mates-main.zip

    https://raw.githubusercontent.com/GreenCubeIO/crew-mates/latest/install.sh | bash关于这个项目作为开发人员,您是“船长”,这些是您的crew-mates :chiefmate 首席副驾驶是副驾驶(有时称为副驾驶或“第一”...

    海事PLC.zip

    海事PLC,全称Marine Programmable Logic Controller,是专为海洋环境设计的可编程逻辑控制器,广泛应用于船舶、海上平台以及各种水上设施的自动化系统中。这种PLC是工业自动化领域的核心设备,用于控制复杂的机械...

    【船级社】 ABS Crew Habitability on Mobile Offshore Drilling Units

    【船级社】 ABS Crew Habitability on Mobile Offshore Drilling Units (MODUs) ]HAB_MODU_Guide_to_Colors-Sept14.pdf

    Flight Crew Training Manual FCTM_737

    ### 737 机组训练手册 (Flight Crew Training Manual FCTM_737) 相关知识点 #### 一、文档概述与版权信息 该文档是波音公司为737系列飞机编写的《飞行机组训练手册》(Flight Crew Training Manual, FCTM_737),...

    PNP.zip_crew91m_human9bd_网络编程

    描述中提到的“利用PHP的画图功能函数库实现三维饼图效果”,这是PHP在网络编程中用于数据可视化的一个应用场景。PHP虽然不是专门的图形处理语言,但它可以通过一些扩展库来创建图表,例如GD库、ImageMagick等。在...

    GT-crew舞蹈工作室创业计划书.doc

    GT-crew舞蹈工作室是一项专注于舞蹈培训和商业演出的创业项目,旨在为湖南科技学院及其周边社区提供多样化的舞蹈课程和专业演出服务。工作室的创始人源于2007年重组的F3街舞团体,拥有丰富的师资力量和实践经验。 ...

    漂亮的后台界面Administry.Admin.Template.HTML.RIP-dESiGNERz-CREW.iNFO

    提供的信息表明,这是一个关于网页模板的设计资源,特别适用于构建美观的后台管理界面。Administry可能是该模板的品牌或名称,而HTML则表明它是基于超文本标记语言(HTML)构建的,这是一种用于创建网页的标准标记...

    path_antenne_10ghz_HFSS_antenna_WorkIt_crew4sm_

    标题中的“path_antenne_10ghz_HFSS_antenna_WorkIt_crew4sm_”揭示了我们正在讨论一个10 GHz频段的天线设计项目,使用了HFSS(High Frequency Structure Simulator)软件进行仿真。HFSS是Ansys公司开发的一款电磁场...

    MongoDB-CheatSheet-v1_0

    MongoDB 是一个基于分布式文件存储的开源数据库系统。它采用 JSON 文档的形式来存储数据,并且提供了非常灵活的数据模型,使得开发人员可以更加高效地进行数据操作。 #### 二、安装与配置 1. **下载 MongoDB**: ...

    DYFFKDBH_PI.zip_SIMULINK_crew8k1_单闭环_比例积分_电压负反馈

    在本文中,我们将深入探讨如何使用MATLAB的Simulink工具来构建一个单闭环系统,该系统采用比例积分(PI)控制器以及电压负反馈技术。标题"DYFFKDBH_PI.zip_SIMULINK_crew8k1_单闭环_比例积分_电压负反馈"揭示了我们...

    Vehicle and Crew Schedule

    - **完全集成规划**:这种方法是最先进的,它将车辆与乘务员的调度作为一个整体来考虑,旨在最大化系统的整体效率。这种集成化的方法能够更好地应对复杂的情况,但也更加复杂和耗时。 #### 历史数据利用 - **无...

    Musk:这是一个现代的Android应用程序,它使用SpaceX API来显示所有的Rockets,Launchs和Crew成员。 它使用带有存储库模式的Clean Architecture进行健壮的本地DB缓存

    这是一个现代的Android应用程序,它使用SpaceX API来显示所有的Rockets,Launchs和Crew成员。 它使用带有存储库模式的Clean Architecture进行健壮的本地DB缓存。 从下载debug APK。 屏风 架构-MVVM MVVM (Model-...

    crewcloud-dashboard:包装 OpenStack REST API 的 Rails 应用程序,为学生提供简化的访问

    这是一个 Rails 应用程序,所以只是 git clone https://github.com/crew/crewcloud-dashboard cd crewcloud-dashboard bundle install rails s open http://localhost:3000 我们建议在开发时使用 Sublime Text 3 或...

    zeen-crew:Zeen Crew商店网站

    【标题】"Zeen Crew商店网站"涉及到的是一个在线商店平台的前端开发,重点在于用户体验和界面设计。在这个项目中,Zeen Crew试图创建一个既美观又功能齐全的商店网站,用户可以方便地浏览商品、添加到购物车并进行...

Global site tag (gtag.js) - Google Analytics