本文目录一览:
ajax框架 问题
Ajax是时下比较流行的一种web界面设计新思路,其核心思想是从浏览器获取XMLHttp对象与服务器端进行交互. DWR(Direct Web Remoting)就是实现了这种Ajax技术的一种web框架. 最近做的项目中我也将它用上了,感觉很是方便,比如动态生成javascript代码,隐藏的http协议,java代码和javascript交互的是javascript的对象(或字符串). 下面是我整理的文档.
DWR主要由两部门组成。javascript与web服务器通信并更新web页;运行在web服务器的Servlet处理请求并把响应发回浏览器。
1 . 配置web.xml
servlet
servlet-namedwr-invoker/servlet-name
servlet-classuk.ltd.getahead.dwr.DWRServlet/servlet-class
/servlet
servlet-mapping
servlet-namedwr-invoker/servlet-name
url-pattern/dwr/*/url-pattern
/servlet-mapping
2 当我们想看dwr自动生成的测试页时,可在java代码
servlet中加
init-param
param-namedebug/param-name
param-valuetrue/param-value
/init-param
这个参数DWR默认是false.如果选择true.我们可以通过url ,你就可以看到你部署的每个DWR class。并且可以测试java代码的每个方法是否运行正常。为了安全考虑,在正式环境下你一定把这个参数设为false.
3 log信息配置
我喜欢用log4j输出日志,那么在log4j.properties下加,log4j.logger.uk.ltd.getahead.dwr = debug。这样可以看DWR的调试日志。
4 配置dwr.xml (和web.xml同目录)
create creator="new" javascript="JDate"
param name="class" value="java.util.Date"/
/create
这里的多数元素都是可选的 - 你真正必须知道的是指定一个creator和一个javascript名字。
creator属性 是必须的 - 它用来指定使用那种创造器。
默认情况下DWR1.1有8种创造器。它们是:
new: 用Java的new关键字创造对象。
none: 它不创建对象,看下面的原因。 (v1.1+)
scripted: 通过BSF使用脚本语言创建对象,例如BeanShell或Groovy。
spring: 通过Spring框架访问Bean。
jsf: 使用JSF的Bean。 (v1.1+)
struts: 使用Struts的FormBean。 (v1.1+)
pageflow: 访问Beehive或Weblogic的PageFlow。 (v1.1+)
javascript属性 用于指定浏览器中这个被创造出来的对象的名字。你不能使用Javascript的关键字。
scope属性 非常类似servlet规范中的scope。 它允许你指定这个bean在什么生命范围。选项有"application", "session", "request" 和"page"。这些值对于Servlet和JSP开发者来说应该相当熟悉了。
scope属性是可选的。默认是"page"。如果要使用"session"需要cookies。当前的DWR不支持ULR重写。
param元素 被用来指定创造器的其他参数,每种构造器各有不同。例如,"new"创造器需要知道要创建的对象类型是什么。每一个创造器的参数在各自的文档中能找到。请查看上面的链接。
include和exclude元素 允许创造器来限制类中方法的访问。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗示默认的访问策略是"拒绝";如果是exclude列表则暗示默认的访问策略是"允许"。
5 dwr.jar下载后放lib下
源码浅析
dwr的设计很象webwork2的设计,隐藏http协议,扩展性,兼容性及强。
通过研究uk.ltd.getahead.dwr.DWRServlet这个servlet来研究下dwr到底是如何工作的。
servlet
servlet-namedwr-invoker/servlet-name
servlet-classuk.ltd.getahead.dwr.DWRServlet/servlet-class
/servlet
servlet-mapping
servlet-namedwr-invoker/servlet-name
url-pattern/dwr/*/url-pattern
/servlet-mapping
这样/dwr/*下的所有的请求都是由这个servlet来处理,到底生理了什么呢,我们还是以例子来说明吧.
1 web服务器启动,DWRServlet init()方法调用,init主要做了以下工作。
设置日志级别、实例化DWR用到的单例类(这些类在jvm中只有一个实例对象)、读去配置文件(包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml)。
2 请求处理
DWRServlet.doGet, doPost方法都调用processor.handle(req, resp)方法处理。Processor对象在init()方法中已经初始化了。
代码
public void handle(HttpServletRequest req, HttpServletResponse resp)
throws IOException
{
String pathinfo = req.getPathInfo();
if(pathinfo == null || pathinfo.length() == 0 || pathinfo.equals("/"))
{
resp.sendRedirect(req.getContextPath() + req.getServletPath() + '/' + "index.html");
} else
if(pathinfo != null pathinfo.equalsIgnoreCase("/index.html"))
{
doIndex(req, resp);
} else
if(pathinfo != null pathinfo.startsWith("/test/"))
{
doTest(req, resp);
} else
if(pathinfo != null pathinfo.equalsIgnoreCase("/engine.js"))
{
doFile(resp, "engine.js", "text/javascript");
} else
if(pathinfo != null pathinfo.equalsIgnoreCase("/util.js"))
{
doFile(resp, "util.js", "text/javascript");
} else
if(pathinfo != null pathinfo.equalsIgnoreCase("/deprecated.js"))
{
doFile(resp, "deprecated.js", "text/javascript");
} else
if(pathinfo != null pathinfo.startsWith("/interface/"))
{
doInterface(req, resp);
} else
if(pathinfo != null pathinfo.startsWith("/exec"))
{
doExec(req, resp);
} else
{
log.warn("Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/");
resp.sendError(404);
}
}
dwr/*处理的请求也就这几种。
(1)dwr/index.html,dwr/test/这种只能在debug模式下使用,调试用。
dwr/engine.js,dwr/util.js,dwr/deprecated.js当这个请求到达,从dwr.jar包中读取文件流,响应回去。(重复请求有缓存)
(2)当dwr/interface/这种请求到来,(例如我们在index.html中的 script type='text/javascript' src='dwr/interface/JDate.js'/script)DWR做一件伟大的事。把我们在WEB-INF/dwr.xml中的
create creator="new" javascript="JDate"
param name="class" value="java.util.Date"/
/create
java.util.Date转化为javascript函数。
看看吧。
细节也比较简单,通过java反射,把方法都写成javascript特定的方法。(我觉得这些转换可以放到缓存里,下次调用没必要再生成一遍,不知道作者为什么没这样做)。
(3)dwr/exec
javascript调用方法时发送这种请求,可能是XMLHttpRequest或IFrame发送。
当然,javascript调用的方法签名与java代码一致,包括参数,还有javascript的回调方法也传到了服务器端,在服务器端很容易实现。回调方法的java的执行结果 返回类似 scriptcallMethod(结果)script的javascript字符串,在浏览器执行。哈,一切就这么简单,巧妙。
AJAX详细介绍?
AJAX技术介绍(什么是AJAX?)
By 凌云志 发表于 2006-4-15 23:42:00
不得不关注这个技术了,转点资料贴着慢慢了解了解。
一、AJAX开发者的最新工具和技术
基于XML的异步JavaScript,简称AJAX,是当前Web创新(称为Web2.0)中的一个王冠。感谢组成AJAX的各种技术,Web应用的交互如Flickr, Backpack和Google在这方面已经有质的飞跃。这个术语源自描述从基于网页的Web应用到基于数据的应用的转换。在基于数据的应用中,用户需求的数据如联系人列表,可以从独立于实际网页的服务端取得并且可以被动态地写入网页中,给缓慢的Web应用体验着色使之像桌面应用一样。
虽然大部分开发人员在过去使用过XMLHttp或者使用Iframe来加载数据,但仅到现在我们才看到传统的开发人员和公司开始采用这些技术。就像新的编程语言或模型伴随着更多的痛苦,开发人员需要学习新的技巧及如何最好利用这些新技术。
二、AJAX模式
许多重要的技术和AJAX开发模式可以从现有的知识中获取。例如,在一个发送请求到服务端的应用中,必须包含请求顺序、优先级、超时响应、错误处理及回调,其中许多元素已经在Web服务中包含了,就像现在的SOA。AJAX开发人员拥有一个完整的系统架构知识。同时,随着技术的成熟还会有许多地方需要改进,特别是UI部分的易用性。
AJAX开发与传统的CS开发有很大的不同。这些不同引入了新的编程问题,最大的问题在于易用性。由于AJAX依赖浏览器的JavaScript和XML,浏览器的兼容性和支持的标准也变得和JavaScript的运行时性能一样重要了。这些问题中的大部分来源于浏览器、服务器和技术的组合,因此必须理解如何才能最好的使用这些技术。
综合各种变化的技术和强耦合的客户服务端环境,AJAX提出了一种新的开发方式。AJAX开发人员必须理解传统的MVC架构,这限制了应用层次之间的边界。同时,开发人员还需要考虑CS环境的外部和使用AJAX技术来重定型MVC边界。最重要的是,AJAX开发人员必须禁止以页面集合的方式来考虑Web应用而需要将其认为是单个页面。一旦UI设计与服务架构之间的范围被严格区分开来后,开发人员就需要更新和变化的技术集合了。
三、时刻想着用户
AJAX的最大机遇在于用户体验。在使应用更快响应和创新的过程中,定义Web应用的规则正在被重写;因此开发人员必须更注重用户。现在用户已经逐渐习惯如何使用Web应用了。例如用户通常希望每一次按钮点击会导致几秒的延迟和屏幕刷新,但AJAX正在打破这种长时间的状况。因此用户需要重新体验按钮点击的响应了。
可用性是AJAX另人激动的地方而且已经产生了几种新颖的技术。其中最引人注目的是一种称为“黄色隐出”的技术,他在数据更新之前时将用户界面变为黄色,更新完成后立刻恢复原来的颜色。AJAX开发人员将用户从Web应用的负载中解放出来;小心地利用AJAX提供的丰富接口,不久桌面开发人员会发现AJAX是他们的方向。
四、几种工具和技术
随着AJAX迅速地引人注目起来,我想开发人员对这种技术的期待也迅速地增加。就像任何新技术,AJAX的兴旺也需要一整个开发工具/编程语言及相关技术系统来支撑。
1、JavaScript
如名字所示AJAX的概念中最重要而最被忽视的是他也是一种JavaScript编程语言。JavaScript是一种粘合剂使AJAX应用的各部分集成在一起。在大部分时间,JavaScript通常被服务端开发人员认为是一种企业级应用不需要使用的东西应该尽力避免。这种观点来来自以前编写JavaScript代码的经历:繁杂而又易出错的语言。类似的,他也被认为将应用逻辑任意地散布在服务端和客户端中,这使得问题很难被发现而且代码很难重用。在AJAX中JavaScript主要被用来传递用户界面上的数据到服务端并返回结果。XMLHttpRequest对象用来响应通过HTTP传递的数据,一旦数据返回到客户端就可以立刻使用DOM将数据放到网面上。
2、XMLHttpRequest
XMLHttpRequest对象在大部分浏览器上已经实现而且拥有一个简单的接口允许数据从客户端传递到服务端,但并不会打断用户当前的操作。使用XMLHttpRequest传送的数据可以是任何格式,虽然从名字上建议是XML格式的数据。
开发人员应该已经熟悉了许多其他XML相关的技术。XPath可以访问XML文档中的数据,但理解XML DOM是必须的。类似的,XSLT是最简单而快速的从XML数据生成HTML或XML的方式。许多开发人员已经熟悉Xpath和XSLT,因此AJAX选择XML作为数据交换格式有意义的。XSLT可以被用在客户端和服务端,他能够减少大量的用JavaScript编写的应用逻辑。
3、CSS
为了正确的浏览AJAX应用,CSS是一种AJAX开发人员所需要的重要武器。CSS提供了从内容中分离应用样式和设计的机制。虽然CSS在AJAX应用中扮演至关重要的角色,但他也是构建创建跨浏览器应用的一大阻碍,因为不同的浏览器厂商支持各种不同的CSS级别。
五、服务器端
但不像在客户端,在服务端AJAX应用还是使用建立在如Java,.Net和PHP语言基础上机制;并没有改变这个领域中的主要方式。
既然如此,我们对Ruby on Rails框架的兴趣也就迅速增加了。在一年多前,Ruby on Rails已经吸引了大量开发人员基于其强大功能来构建Web和AJAX应用。虽然目前还有很多快速应用开发工具存在,Ruby on Rails看起来已经储备了简化构建AJAX应用的能力。
六、开发工具
在实际构建AJAX应用中,你需要的不只是文本编辑器。既然是JavaScript非编译的,他可以容易地编写和运行在浏览器中;然而,许多工具提供了有用的扩展如语法高亮和智能完成。
不同的IDE提供了对JavaScript支持的不同等级。来自JetBrains的IntelliJ IDEA是一个用来JavaScript开发的更好的IDE,虽然许多开发人员也喜欢Microsoft’s Visual Studio产品(允诺会在最新的版本中改善对AJAX的支持)。Eclipse包含了两个免费的JavaScript编辑器插件和一个商业的来自ActiveStat的Komodo IDE。
另一个JavaScript和AJAX开发中的问题是调试困难。不同的浏览器提供不同的通常是隐藏的运行时错误信息,而JavaScript的缺陷如双重变量赋值(通常是由于缺少数据类型)使得调试更加困难。在AJAX的开发中,调试就更复杂了,因为其需要标识究竟是客户端还是服务端产生的错误。在过去,JavaScript调试的方法是删除所有代码然后一行行的增加直到错误出现。现在,更多开发人员回到为IE准备的Microsoft Script Debugger和为Mozilla浏览器准备的Venkman。
七、浏览器兼容性
JavaScript编程的最大问题来自不同的浏览器对各种技术和标准的支持。构建一个运行在不同浏览器(如IE和火狐)是一个困难的任务。因此几种AJAX JavaScript框架或者生成基于服务端逻辑或标记库的JavaScript,或者提供符合跨浏览器AJAX开发的客户端JavaScript库。一些流行的框架包括:AJAX.Net, Backbase, Bitkraft, Django, DOJO, DWR, MochiKit, Prototype, Rico, Sajax, Sarissa, and Script.aculo.us.
这些框架给开发人员更多的空间使得他们不需要担心跨浏览器的问题。虽然这些框架提升了开发人员构建应用的能力,但由于厂商已经开发了更细节的用户界面的打包组件解决方案,因此在AJAX组件市场中需要考虑一些其他因素。例如提供通用用户界面的组件如组合框和数据栅格的几个厂商,都可以被用来在应用中创建良好的通过类似电子数据表方式来查看和编辑数据的体验。但这些组件不仅是封装了组件的用户界面而且包括与服务端数据的通讯方式,这些组件通常使用基于标记方式来实现如ASP.Net或JSF控件。
八、展望
最近IE和火狐之间的浏览器之争变得火热起来,因此AJAX开发人员需要足够敏捷的作出反应。关键点在一些问题如CSS或XML,虽然各种浏览器形成采用最新标准的不同阵营(如Mozilla拥抱SVG和E4X标准及在最新火狐BETA版本中使用XUL,而微软使用自己的XAML技术)。所有这些技术代表当前AJAX主流JavaScript和XML的市场方向改变。
总的来说,AJAX开发人员必须尽快地跟进最新的技术并利用高产的工具集。成功的AJAX开发人员还需要留心他们的使用者以避免将任何问题扩大化。并且AJAX开发人员还需要持续地创新来创建增强Web应用易用性的新方法
ajax绝对难题。。。。。。
第一个问题比较好解决,你现在的代码是在onreadystatechange事件里面,如果通过就设置按钮为允许,改为设置两个全局变量:
var name_chk_pass=false;
var email_chk_pass=false;
在 onreadystatechange 事件里面,把以前直接设置按钮为允许的代码修改如下:
email_chk_pass=(判断验证是否通过)
if (email_chk_pass name_chk_pass) 设置按钮为允许
如果你名字验证、邮件验证是使用的一个xmlHTTP对象、一个onreadystatechange事件处理代码,那么你应该在xmlHTTP.send之前,设置一个全局变量记录当前是验证的什么,onreadystatechange事件的时候才知道结果的含义。用这个方法可以解决第二个问题。
jsf 翻页
这个问题产生的原因是受JSF生命周期的影响,即使在第二页有个文本框,你输入值,然后回到第一页,再进入第二页,文本框里面的东西也会消失。
解决的办法是:当你打上勾后,重新刷新一下当前页面。那么这样就能保存你当前的动作和值。
可以使用ajax,局部刷新。把代码加在selectBooleanCheckbox中
a4j:support event="onchange"
onsubmit="showLoadingPage()"
action=""
oncomplete="hideLoadingPage()"
reRender="重新渲染的组建ID"
a4j:ajaxListener type="org.ajax4jsf.ajax.ForceRender" /
/a4j:support
希望对你有所帮助。
jsf ajax session超时跳转问题
你JSF的实现用的是官方的,还是myfaces,如果是myfaces的话,"$"应该冲突了
jsf导航配置文件的问题
我们的是直接配置一个filter.xml文件。希望对你有所帮助。
!-- filters.xml starts --
!-- context-params.xml does not work. put here --
context-param
param-namejavax.faces.STATE_SAVING_METHOD/param-name
param-valueserver/param-value
/context-param
context-param
param-nameorg.apache.myfaces.READONLY_AS_DISABLED_FOR_SELECTS/param-name
param-valuetrue/param-value
/context-param
context-param
param-nameorg.apache.myfaces.ADD_RESOURCE_CLASS/param-name
param-valueorg.apache.myfaces.renderkit.html.util.DefaultAddResource/param-value
/context-param
context-param
param-nameorg.apache.myfaces.RESOURCE_VIRTUAL_PATH/param-name
param-value/faces/myFacesExtensionResource/param-value
/context-param
context-param
param-nameorg.apache.myfaces.CHECK_EXTENSIONS_FILTER/param-name
param-valuetrue/param-value
/context-param
context-param
param-namejavax.faces.CONFIG_FILES/param-name
param-value/WEB-INF/模块一.xml,
/WEB-INF/模块二.xml, /WEB-INF/模块三.xml
/param-value
/context-param
context-param
param-nameorg.apache.myfaces.ALLOW_JAVASCRIPT/param-name
param-valuetrue/param-value
!--
description
This parameter tells MyFaces if javascript code should be allowed in the
rendered HTML output.
If javascript is allowed, command_link anchors will have javascript code
that submits the corresponding form.
If javascript is not allowed, the state saving info and nested parameters
will be added as url parameters.
Default: "true"
/description
--
/context-param
context-param
param-nameorg.apache.myfaces.DETECT_JAVASCRIPT/param-name
param-valuefalse/param-value
!--
description
This parameter tells MyFaces if javascript code should be allowed in the
rendered HTML output.
If javascript is allowed, command_link anchors will have javascript code
that submits the corresponding form.
If javascript is not allowed, the state saving info and nested parameters
will be added as url parameters.
Default: "false"
Setting this param to true should be combined with STATE_SAVING_METHOD "server" for
best results.
This is an EXPERIMENTAL feature. You also have to enable the detector filter/filter mapping below to get
JavaScript detection working.
/description
--
/context-param
context-param
param-namejavax.faces.PARTIAL_STATE_SAVING_METHOD/param-name
param-valuefalse/param-value
/context-param
context-param
param-nameorg.apache.myfaces.PRETTY_HTML/param-name
param-valuetrue/param-value
!--
description
If true, rendered HTML code will be formatted, so that it is "human readable".
i.e. additional line separators and whitespace will be written, that do not
influence the HTML code.
Default: "true"
/description
--
/context-param
context-param
param-nameorg.apache.myfaces.AUTO_SCROLL/param-name
param-valuetrue/param-value
!--
description
If true, a javascript function will be rendered that is able to restore the
former vertical scroll on every request. Convenient feature if you have pages
with long lists and you do not want the browser page to always jump to the top
if you trigger a link or button action that stays on the same page.
Default: "false"
/description
--
/context-param
!-- WelcomeFile Filter --
!--
filter
filter-nameWelcomeFile Filter/filter-name
filter-classorg.apache.myfaces.webapp.filter.WelcomeFileFilter/filter-class
description
Due to the manner in which the JSP / servlet lifecycle
functions, it is not currently possible to specify default
welcome files for a web application and map them to the
MyFacesServlet. Normally they will be mapped to the
default servlet for the JSP container. To offset this
shortcoming, we utilize a servlet Filter which examines
the URI of all incoming requests.
/description
/filter
--
!-- JavaScriptDetector Filter --
!--
filter
filter-namejavascriptDetector/filter-name
filter-classorg.apache.myfaces.webapp.filter.JavaScriptDetectorFilter/filter-class
/filter
--
filter
filter-nameMyFacesExtensionsFilter/filter-name
filter-classorg.apache.myfaces.webapp.filter.ExtensionsFilter/filter-class
init-param
param-nameuploadMaxFileSize/param-name
param-value200m/param-value
/init-param
init-param
param-nameuploadThresholdSize/param-name
param-value100k/param-value
/init-param
/filter
filter
display-nameAjax4jsf Filter/display-name
filter-nameajax4jsf/filter-name
filter-classorg.ajax4jsf.Filter/filter-class
init-param
param-nameforceparser/param-name
param-valuefalse/param-value
/init-param
/filter
!-- filters.xml ends --