|
阅读:6565回复:17
[分享]Server Java讲座
<P>第一讲 前言------为什么我们选择JSF,而不是其它framework</P>
<P><STRONG><FONT color=#ff0000>主讲人:CJ</FONT></STRONG><br></P> <DIV>在正式开讲之前,我们来探讨一下为什么要使用JSF来实现SERVER ADF,这也是很多开发商跟我讨论时经常会问到的问题。<br><br> 世界上有300种Java的framework,这个数字是我几个月前听到的,现在可能已经不止这个数了。我曾经用过的framework包括Structs,Hibernate,Spring。这些framework不但能加速开发,而且会带来全新的程序设计理念。我当时的感觉是:原来程序还可以这样写! 当然,这些framework都是开源免费,你不用担心自己的良心受到谴责,也不用担心比尔盖茨半夜敲门收钱。<br><br> 在这300多种framework中,ESRI为什么选择了JSF?各个framework有各个framework的好处。JSF最大的优点就是:像 Swing 和 AWT 一样,JSF 是一个可以提供一组标准的、可重用的 GUI 组件的开发框架。<br><br>原因之一: 行为与表示的完全分离。<br><br> 行为和表现不分离的一个典型例子是普通的JSP 技术,这一技术很好,因为很容易在 HTML(和类 HTML)页面中混合 Java 代码。这样我们就可以使用强大的Java API的功能。当然,很明显的坏处是行为表现黏合在一起。而且代码不容易重用。这让我想起刚使用JSP技术时,在文本编辑器下写JSP页面,读写数据库,并且在同一个页面上显示出来的痛苦回忆。<br><br> Model1架构的出现使开发人员可以用javabean的方式进行开发,舒服多了。当然,还有更好的。<br><br> 这就不得不提到著名的MVC结构,(MVC) model-view-controller架构提供了一系列的设计模式,这些模式让你可以轻松地应用于程序地开发,特别是有界面程序的开发。现在又有多少的程序是没有界面的呢?<br> <br> Model包装了商业逻辑,也包含了数据持久的代码,包括存取数据库或者存取文件。Model最好不要跟View有任何关系,它最好不要知道谁将显示结果,是一个Swing界面,还是JSF界面,还是普通的JSP界面。为了做到这一点,事先的规划要花一些时间,但是相信我,这些花的时间带来的价值将超过你的想象。如果设计得当,许多用ArcGIS Engine开发的代码可以轻松在Server中使用,不需要修改任何代码。.net也是一样。<br><br> View只用来显示显示逻辑,不能有任何商务逻辑。controller是view和model的桥梁,它和model进行交互,并且把结果显示在Model中。显示页面的选择也由controller进行选择。我会在后面的讲座中详细解释JSF中的Controller的实现。<br><br> Structs,Spring都实现了MVC的架构。但是它们都没有像JSF这样,提供一个事件驱动的组件对象模型。大家可以想一想,一个平常在HTML中使用的标签, <input type="text" name="q">,在JSF框架中变成了一个组件,这个组件还可以有事件,而且可以对这个事件可以进行编程。这是多么得激动人心啊! GIS程序需要和用户进行良好地交互,选择一个事件驱动的framework,可以更加容易编程和实现。<br><br> 这是ESRI选择JSF的重要原因之一。<br> (未完待续)</DIV> [此贴子已经被作者于2007-11-4 20:05:48编辑过]
|
|
|
|
1楼#
发布于:2007-11-04 20:04
<DIV right" align=right></DIV>Server Java开发 JSF基础<BR><BR>
<DIV><FONT size=3><FONT color=#000000><FONT face=宋体> 有很多开发人员问我,如果我已经有了一个</FONT><FONT face="Times New Roman">JSP</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">Application</FONT><FONT face=宋体>,为了使用</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>,为了使用我们新版的</FONT><FONT face="Times New Roman">ArcGIS Server</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">Java ADF</FONT><FONT face=宋体>,我需要重新修改写我的程序以让它们适应整个</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>框架么?这是一个很有意思的问题,我可以想象出大家头皮发麻,左右为难的感觉,这也引出了今天的话题,</FONT><FONT face="Times New Roman">Servlet</FONT><FONT face=宋体>容器是如何对</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的程序进行处理的呢?</FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体> 随便找一个</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">Application</FONT><FONT face=宋体>,可以是我们的</FONT><FONT face="Times New Roman">ArcGIS Server</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">Sample</FONT><FONT face=宋体>,也可以是任何您从网上下载的</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>例子,打开</FONT><FONT face="Times New Roman">web.xml</FONT><FONT face=宋体>文件,你就可以看到该文件里面有如下的</FONT><FONT face="Times New Roman">servlet</FONT><FONT face=宋体>映射:</FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3734;extra=page%3D5###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3734;extra=page%3D5###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><servlet><BR> <servlet-name>Faces Servlet</servlet-name><BR> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class><BR> <load-on-startup>1</load-on-startup><BR> </servlet><BR><servlet-mapping><BR> <servlet-name>Faces Servlet</servlet-name><BR> <url-pattern>*.jsf</url-pattern><BR> </servlet-mapping></DIV></DIV><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体> 这是</FONT><FONT face="Times New Roman">Java</FONT><FONT face=宋体>程序员最熟悉不过的</FONT><FONT face="Times New Roman">Servlet</FONT><FONT face=宋体>配置了,该</FONT><FONT face="Times New Roman">Servlet</FONT><FONT face=宋体>映射是什么意思呢?将所有对后缀名为</FONT><FONT face="Times New Roman">jsf</FONT><FONT face=宋体>的请求,都交由</FONT><FONT face="Times New Roman">javax.faces.webapp.FacesServlet</FONT><FONT face=宋体>来处理。哦,另外插一句,</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的标准是公开的,如果你觉得这个</FONT><FONT face="Times New Roman">FacesServlet</FONT><FONT face=宋体>不好,你大可以自己写一个</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>处理</FONT><FONT face="Times New Roman">Servlet</FONT><FONT face=宋体>。将所有对</FONT><FONT face="Times New Roman">jsf</FONT><FONT face=宋体>的请求自己来处理。事实上,已经有人这么做了,这就是</FONT><FONT face="Times New Roman">Myfaces</FONT><FONT face=宋体>,可以参考</FONT><FONT face="Times New Roman">Apache</FONT><FONT face=宋体>的网站。</FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>言归正转,如何将</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的应用集成到已经有的应用程序中呢,您一定已经想到了。事实上事情很简单,在访问某个</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>页面的时候,映射到某个目录即可。这个目录在</FONT><FONT face="Times New Roman">web.xml</FONT><FONT face=宋体>进行了设置,比如下面的配置就可以把所有的对</FONT><FONT face="Times New Roman">faces</FONT><FONT face=宋体>的请求,让</FONT><FONT face="Times New Roman">Face Servlet</FONT><FONT face=宋体>来处理:</FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3734;extra=page%3D5###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3734;extra=page%3D5###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><servlet-mapping><BR> <servlet-name>Faces Servlet</servlet-name><BR> <url-pattern>/faces/*</url-pattern><BR> </servlet-mapping></DIV></DIV><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体> 所以,如果你在根目录了放了一个</FONT><FONT face="Times New Roman">hello.jsp</FONT><FONT face=宋体>页面,这个</FONT><FONT face="Times New Roman">jsp</FONT><FONT face=宋体>页面使用了</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>框架,那么你在访问这个</FONT><FONT face="Times New Roman">jsp</FONT><FONT face=宋体>页面时用</FONT></FONT><a href="http://servername/faces/hello.jsp" target="_blank" ><FONT face="Times New Roman"><FONT color=#0000ff>http://servername/faces/hello.jsp</FONT></FONT></A><FONT color=#000000><FONT face=宋体>就可以了,你的容器会把这样的请求提交</FONT><FONT face="Times New Roman">Face Servlet</FONT><FONT face=宋体>来处理,这个时候,就轮到</FONT><FONT face="Times New Roman">Face Servlet</FONT><FONT face=宋体>来大显身手了,它会忠实地执行你的请求。</FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face="Times New Roman"> JSF</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">Managed Bean</FONT><FONT face=宋体>是保存在</FONT><FONT face="Times New Roman">session</FONT><FONT face=宋体>中的,所以你在</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>页面和普通</FONT><FONT face="Times New Roman">JSP</FONT><FONT face=宋体>之间切换页面的时候,不会丢失信息,反过来也一样。</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>自己有自己的</FONT><FONT face="Times New Roman">Page Navigation</FONT><FONT face=宋体>系统,但是它仍然可以跟普通的</FONT><FONT face="Times New Roman">JSP</FONT><FONT face=宋体>页面互相切换,我们在后面的讲座中会讲到。</FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体> 所以如果你已经存在的一个项目,想上我们的</FONT><FONT face="Times New Roman">ArcGIS Server</FONT><FONT face=宋体>,利用其基于</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">ADF</FONT><FONT face=宋体>进行开发,也是完全可以的。当然,新的应用最好用</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>框架开发,开始时可能需要一点时间去学习,对于你后面会用到的强大的</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的功能,这些投资是完全值得的。</FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体> 欢迎大家进入美妙的</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的世界。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体> 了解了</FONT><FONT face="Times New Roman">Servlet</FONT><FONT face=宋体>是如何处理你的</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>请求的,那么接下去我们来看看,让</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>程序跑起来需要什么必要条件,一个</FONT><FONT face="Times New Roman">Servlet</FONT><FONT face=宋体>容器是必需的,这个一般取决于公司给我们配什么,或者客户要求什么。一般免费的好选择是</FONT><FONT face="Times New Roman">Tomcat</FONT><FONT face=宋体>,价格便宜量又足,我们大家都用它。当然如果项目大,经费充足,</FONT><FONT face="Times New Roman">IBM</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">J2EE</FONT><FONT face=宋体>容器</FONT><FONT face="Times New Roman">Websphere</FONT><FONT face=宋体>和</FONT><FONT face="Times New Roman">Bea</FONT><FONT face=宋体>公司的</FONT><FONT face="Times New Roman"> Weblogic</FONT><FONT face=宋体>也是一个好选择。选用大公司</FONT><FONT face="Times New Roman">J2EE</FONT><FONT face=宋体>容器有一个好处,即使三更或者五更出了问题,你照样可以拍着桌子让他们的工程师过来帮你解决问题,如果你用我们</FONT><FONT face="Times New Roman">ESRI</FONT><FONT face=宋体>的软件,你也可以这样;而用免费的软件三更出了问题只有我们自己出马了,当然,</FONT><FONT face="Times New Roman">google</FONT><FONT face=宋体>和百度在这个时候看在点击率的份上,还是可以拉我们一把的。除了一个好的容器,还需要一个</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的实现,用</FONT><FONT face="Times New Roman">SUN</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">Reference Implementation</FONT><FONT face=宋体>总是不会错的,人家是标准的制定者嘛,名字也起做“参考实现”,写来让你参考的。也可以选择功能更加强大的</FONT><FONT face="Times New Roman">Myfaces</FONT><FONT face=宋体>。</FONT><FONT face="Times New Roman">ESRI</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">ArcGIS Server ADF</FONT><FONT face=宋体>遵循标准的</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>,所以</FONT><FONT face="Times New Roman">ADF</FONT><FONT face=宋体>可以跑在</FONT><FONT face="Times New Roman">Sun </FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>实现,或者</FONT><FONT face="Times New Roman">Myfaces</FONT><FONT face=宋体>上。我们这次所有的教程都是基于</FONT><FONT face="Times New Roman">sun</FONT><FONT face=宋体>的标准的</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>实现。还有其它的</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>实现,大家可以根据自己的爱好,择优选择之。如果你觉得都不好用,大可以参考标准自己写一个实现,除了你的老板(要投入更多的开发经费)和你的</FONT><FONT face="Times New Roman">team (</FONT><FONT face=宋体>要干更多的活</FONT><FONT face="Times New Roman">) </FONT><FONT face=宋体>,是没有人有意见的。</FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体> 如果您像我一样选择了</FONT><FONT face="Times New Roman">SUN</FONT><FONT face=宋体>的参考实现,那么去</FONT><FONT face="Times New Roman">SUN</FONT><FONT face=宋体>的网站上去下载一个</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的开发包吧,如果不想下载,随便找一个</FONT><FONT face="Times New Roman">Server Java ADF</FONT><FONT face=宋体>的例子,在</FONT><FONT face="Times New Roman">WEB-INF/lib</FONT><FONT face=宋体>目录里面有</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的包,名为</FONT><FONT face="Times New Roman">jsf-api.jar</FONT><FONT face=宋体>和</FONT><FONT face="Times New Roman">jsf-impl.jar</FONT><FONT face=宋体>的两个包就是;注意那个</FONT><FONT face="Times New Roman">JSP</FONT><FONT face=宋体>的标准标签库</FONT><FONT face="Times New Roman">jstl.jar</FONT><FONT face=宋体>,把它跟</FONT><FONT face="Times New Roman">jsf</FONT><FONT face=宋体>的包放在一起,你不一定用标准标签库,但是</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>用到了它。</FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体> 我把</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">doc</FONT><FONT face=宋体>放在这里给大家下载,因为这个东西实在不好找,有人知道好的下载</FONT><FONT face="Times New Roman">URL</FONT><FONT face=宋体>,可以在这里贴一个。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体> 把这些包放在一个</FONT><FONT face="Times New Roman">web application</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">lib</FONT><FONT face=宋体>目录里面有,你的程序你可以使用</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的强大功能了。让我也来俗气一下,写一个简单的</FONT><FONT face="Times New Roman">hello world</FONT><FONT face=宋体>作为今天的结束吧。注意在你的</FONT><FONT face="Times New Roman">web application</FONT><FONT face=宋体>里面的</FONT><FONT face="Times New Roman">web.xml</FONT><FONT face=宋体>配置文件添加了</FONT><FONT face="Times New Roman">Face Servlet</FONT><FONT face=宋体>的声明和</FONT><FONT face="Times New Roman">URI</FONT><FONT face=宋体>映射。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3734;extra=page%3D5###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3734;extra=page%3D5###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><BR><%@ page c%> <BR><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><BR><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><BR><meta http-equiv="Content-Type" c><BR><BR><f:view><BR> <html><BR> <head><BR> <title><BR> 欢迎来到ArcGIS Server ADF 世界<BR> </title><BR><BR> </head><BR> <body><BR> <h:form id="welcomeForm"><BR> <h:outputText id="welcomeOutput" value="欢迎来到ArcGIS Server Java ADF 教程!" style="color: red;"/><BR> <p><BR> <h:message id="errors" for="helloInput" style="color: red"/><BR> </p><BR> <p><BR> <h:outputLabel for="helloInput"><BR> <h:outputText id="helloInputLabel"<BR> value="123"/><BR> </h:outputLabel><BR> </h:form><BR> </body><BR> </html><BR></f:view></DIV></DIV><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000> 保存后访问</FONT></FONT></FONT><FONT size=3><a href="http://servername:port/faces/hello.jsp" target="_blank" ><FONT color=#0000ff>Http://servername:port/faces/hello.jsp</FONT></A></FONT><FONT color=#000000><FONT face=宋体><FONT size=3>即可,如果页面能够出来,那么恭喜您,您已经迈入了</FONT></FONT><FONT size=3>JSF wonderland</FONT><FONT face=宋体><FONT size=3>的大门。</FONT></FONT></FONT></DIV><BR both"> |
|
|
|
2楼#
发布于:2007-11-04 20:05
Server Java 讲座--ADF 体系结构 第一部分<BR><BR>
<DIV>这两天一直在等待9.2 Engine到货,好调试我写的例子,但是看来还得等一下,所以今天的这个讲座将向前跨越一大步。等Enging到货后把前面的部分,也就是如何自己写一个ADF补上。<BR><BR> 有很多人看了前面的讲座问我,怎么讲了半天,还是没有讲到如何对server进行开发,就像吃浙大的豆沙包,咬了一大口,发现离馅还有300里。这句话提醒了我:那么今天我们直接吃豆沙馅了。<BR><BR> 在讲一些sample之前,我们来看看整个ADF的体系架构,ADF里面有大部分类是纯JAVA的。它是构建在JSF之上的,所以它严格地遵守JSF的规范,所有的Bean都放在faces-config.xml和web.xml这样的配置文件中。我们今天吃豆沙馅,所以就讲讲这两个文件里面的配置;<BR><BR> Faces-config.xml文件中有如下配置:<BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3800;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3800;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><managed-bean><BR><managed-bean-name>esriWebSession</managed-bean-name><BR><managed-bean-class>com.esri.adf.web.data.WebSession</managed-bean-class><BR><managed-bean-scope>session</managed-bean-scope><BR><managed-property><BR><property-name>webApplication</property-name><BR><value>#{esriWebApplication}</value><BR></managed-property><BR>< /managed-bean></DIV></DIV><BR>这里定义了一个managed bean指向了WebSession的类,这个WebSession类实现了一个接口,这个接口是HttpSessionListener,看看这个接口的Javadoc吧;这个接口做两件事情:每当往Session中存入一个对象(setAttribute)或从Session中删除一个对象的时候,如果这个对象实现了此监听器接口,应用服务器将会自动调用接口相应的方法。你有机会在这两个方法里面做一些事情,最好的莫过于初始化存放在session中的变量。如果你一定要问我,Managed Bean的scope如果是session,那么在每个新session中,都会初始化这个managed bean,调用它的constructor,这样不是也可以实现managed bean地初始化么?如果你一定要这样写,也可以,但是系统的可扩展性很差啦。<BR><BR> 在ADF中,如果我们写了一个类,并且希望这个类能够被ADF初始化,我们直接实现WebContextInitialize接口就可以了,ADF会自动初始化这个类,那么WebContextInitialize接口是什么呢?<BR><BR> 首先,来看看我们的核心中的核心WebContext,Adf的广大Managed bean们都团结在WebContext周围,错了,是团结在WebContex里面;这个WebContext是这个Server ADF的容器。Context这个词翻译成上下文实在是不合适,我们还是叫它叫容器吧。<BR>这个容器里面有什么?随便举个例子吧,它有很多的Attribute,比如有一个WebMap,所有容器里面的Attribute都需要实现一个接口,这个接口的名字叫做WebContextInitialize,这个伟大的接口有两个方法:init和destroy。看看这两个方法,我不说你都能想到它们是用来做什么的。初始化这个attribute,和销毁这个attribute。看个帮助里面的例子吧:<BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3800;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3800;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>public class MyAttribute implements WebContextInitialize {<BR> WebContext context;<BR> public void init(WebContext context) {<BR> this.context = context;<BR> //初始化其它资源或者变量<BR> }<BR> public void destroy() {<BR> context = null; <BR> //释放其它资源<BR> }<BR>}</DIV></DIV><BR> OK,这个attribute也将作为一个managed bean部署在faces-config.xml文件里面。这里引出的问题是,谁来调用这个init方法和destroy方法呢?对JSF来说,这两个只是普通的方法,JSF不会调用这两个方法来进行资源的初始化和释放。答案是WebContext来调用这些初始化和释放的方法,我们可以看WebContext的doc原文:<BR><BR>WebContext is responsible for making the callback methods implemented by the resources and attributes at appropriate junctures of the ADF application. The callback methods are declared in the WebContextInitialize, WebContextObserver and WebLifecycle interfaces.<BR><BR> 原来是WebContext负责调用这三个接口的方法,初始化和释放资源。<BR><BR> 我们看一下WebContext,发现它也是需要有人来初始化它的,那么WebContext是谁来负责的呢? 是WebSession。WebSession里面存放了所有的WebContext,并且保证这些WebContext们能够被正常的初始化和destroy,什么时候初始化,什么时候Destroy,当然由WebSession实现的,大名鼎鼎的HttpSessionBindingListener接口来实现,每次有一个用户访问或者用户退出时,该监听器会自动调用两个方法,用来初始化和摧毁WebContext。另外要说一句地时:一个session可以有多个webContext,你可以用getWebContexts()得到所有的WebContext。目前我们看到的所有的配置文件都只使用了一个WebContext,多个WebContext会使用在什么地方呢,这个问题大家先考虑一下,我在后面的讲座中会揭晓答案。<BR><BR> 如果有多个用户访问时,就会产生多个并发用户,我们的Web Server会为每个用户都分配一个WebSession,这些Websession会放在哪里,答案是放在WebApplication中,我们打开faces-config.xml文件可以看到里面有一个webApplication的定义<BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3800;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3800;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><referenced-bean><BR><referenced-bean-name>esriWebApplication</referenced-bean-name><BR><referenced-bean-class>com.esri.adf.web.data.WebApplication</referenced-bean-class><BR></referenced-bean></DIV></DIV><BR> 再去看WebSesstion的定义,有指向esriWebApplication的引用。<BR><BR> 现在的问题是,是谁,初始化了WebApplication,我们祭出最原始也是最强大的武器了:ServletContextListener出马了,看web.xml中下面的顶定义,<BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3800;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3800;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV> <listener><BR> <listener-class>com.esri.adf.web.util.ADFServletContextListener</listener-class><BR> </listener></DIV></DIV><BR>ADFServletContextListener 实现ServletContextListener接口,ServletContextListener有两个方法:contextInitialized()和contextDestroyed(); 分别在web application启动的时候和结束的时候调用,你要是觉得好玩,可以写一个listener玩玩,我这里写一个简单的listener现现丑:<BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3800;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3800;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>public class ScheduleListener implements ServletContextListener {<BR>public void contextInitialized(ServletContextEvent arg0) {<BR>System.out.println("context object inited.");<BR>}<BR>public void contextDestroyed(ServletContextEvent arg0) {<BR>System.out.println("context object destroyed.");<BR>}<BR>}</DIV></DIV><BR>ESRI使用了ADFServletContextListener,它实现了ServletContextListener接口,用来启动和destroy WebApplication。看看Javadoc的原文吧:<BR><BR>The ADFServletContextListener initializes a WebApplication object and sets it as an attribute on the ServletContext. When the ServletContext is destroyed, it destroys the associated WebApplication and attempts to clean up all server hosted objects in the current thread.<BR><BR>This class must be registered as a listener-class (in the web.xml file) for the web application.<BR><BR> 现在大家都明白了吧,整个调用过程。Servelt容器启动的时候,会发送启动消息给ADFServletContextListener,ADFServletContextListener负责创建WebApplication,WebApplication负责创建和存放WebSession,WebSession负责创建WebContext,WebContext负责创建所有的Attribute,对资源的使用等等。这一下大家都满意了吧。<BR><BR> 谨以此文,纪念在浙大吃过的一千个豆沙包。</DIV><BR both"> |
|
|
|
3楼#
发布于:2007-11-04 20:06
Server Java 开发实战---自定义command<BR><BR>
<DIV><FONT color=#000000><FONT size=2><FONT face=宋体>自定义</FONT>Command<BR><BR><FONT face=宋体>这个文档大家如果喜欢看英文,在</FONT>ESRI<FONT face=宋体>的帮助里面就有。本文和</FONT>ESRI<FONT face=宋体>的帮助文档类似,当然,我写的会加入自己的一些东西。</FONT><BR><BR><FONT face=宋体>咱开发人员拿到一个开发平台,当然是要用来开发的,而且我们最好把它改得面目全非,才能显出开发人员我的水平所在。对于那些拿着模版生成一个</FONT>web gis<FONT face=宋体>站点就去问客户要钱的事情,对于一个有自尊的开发人员,一般是不屑做的。</FONT><BR><BR><FONT face=宋体>所以,我们今天就讲讲如何自定义命令和工具,先说说自定义命令吧。</FONT><BR><BR><FONT face=宋体>命令事实上是</FONT>command<FONT face=宋体>,也就是平常所在</FONT>html<FONT face=宋体>页面里面的</FONT>command<FONT face=宋体>,这些</FONT>command<FONT face=宋体>里面就是命令按钮。在我们的</FONT>ArcGIS Server<FONT face=宋体>的</FONT>Web ADF<FONT face=宋体>里面,</FONT>command<FONT face=宋体>被用来做一些不用跟地图交互的工作;比如缩放到全图:你不需要跟地图做任何交互,只要一按按钮,地图就缩放到全图。其它用处,就靠大家去发挥想象了,相信大家在以后的项目中会经常用到。我们以一个例子作为说明:</FONT><BR></FONT><FONT face=宋体><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3882;extra=page%3D4###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3882;extra=page%3D4###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>package com.demo;<BR>import javax.faces.event.ActionEvent;<BR>import com.esri.adf.web.data.WebContext;<BR>import com.esri.adf.web.data.geometry.WebExtent;<BR>import com.esri.adf.web.faces.event.MapEvent;<BR>import com.esri.adf.web.faces.event.MapToolAction;<BR>public class MyFullExtent {<BR>WebContext context;<BR><BR>public WebContext getContext() {<BR>return context;<BR>}<BR>public void setContext(WebContext context) {<BR>this.context = context;<BR>}<BR> <BR>public void setFullExtent(){<BR>try{<BR>WebExtent ex=context.getWebMap().getFullExtent();<BR>context.getWebMap().setCurrentExtent(ex);<BR>context.refresh();<BR><BR>}catch(Exception ex){<BR>ex.printStackTrace();<BR>}<BR>}<BR>}</DIV></DIV><BR></FONT><BR><FONT face=宋体>这是无比简单的一个</FONT><FONT face="宋体, MS Song">command</FONT><FONT face=宋体>,简单到我都不好意思发出来给大家看了。注意这个类没有实现任何接口,也没有扩展任何现有的类,除了祖宗</FONT><FONT face="宋体, MS Song">Object</FONT><FONT face=宋体>。它有一个</FONT><FONT face="宋体, MS Song">WebContext</FONT><FONT face=宋体>,从上面一个讲座我们可以知道,这个类可是我们整个</FONT><FONT face="宋体, MS Song">Web ADF</FONT><FONT face=宋体>的关键,有了它,可以得到所有的东西了。</FONT><BR><FONT face=宋体>这个类关键的方法是</FONT><FONT face="宋体, MS Song">setFullExtent</FONT><FONT face=宋体>,里面的几行代码用来将地图缩放到全图,大家看看代码应该就可以明白。</FONT><BR><BR><FONT face=宋体>怎么进行部署呢?就像普通的</FONT><FONT face="宋体, MS Song">managed bean</FONT><FONT face=宋体>一样进行部署就可以了,打开</FONT><FONT face="宋体, MS Song">jsf application</FONT><FONT face=宋体>的心脏</FONT><FONT face="宋体, MS Song">faces-config.xml</FONT><FONT face=宋体>文件,在里面添加如下配置:</FONT><BR><FONT face=宋体><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3882;extra=page%3D4###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3882;extra=page%3D4###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><managed-bean><BR> <managed-bean-name>myFullExtent</managed-bean-name><BR> <managed-bean-class>com.demo. MyFullExtent </managed-bean-class><BR> <managed-bean-scope>session</managed-bean-scope><BR> <managed-property><BR> <property-name>context</property-name><BR> <value>#{mapContext}</value><BR> </managed-property><BR> </managed-bean></DIV></DIV><BR></FONT><BR><BR><FONT face=宋体>注意我们把</FONT><FONT face="宋体, MS Song">web context</FONT><FONT face=宋体>作为一个属性,用来初始化</FONT><FONT face="宋体, MS Song">MyFullExtent,</FONT><FONT face=宋体>#{mapContext}指向了一个在faces-config.xml文件中定义的另外一个Bean,这个bean我们上次讲座已经详细解释过了。这里说一句废话,算是提醒一下,有请求过来的时候,先实例化这个类,然后再设置属性,有的工程师想在实例化里面进行一些操作,就必要用</FONT><FONT face="宋体, MS Song">webContext</FONT><FONT face=宋体>,会报告空指针错误,因为这个时候</FONT><FONT face="宋体, MS Song">webContext</FONT><FONT face=宋体>属性还没有被设置。</FONT><BR><BR><FONT face=宋体>类写好了,也配置好了,怎么用呢,再给个例子:</FONT><BR><FONT face=宋体><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3882;extra=page%3D4###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3882;extra=page%3D4###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><a:command id="fullExtent" action="#{myFullExtent. setFullExtent }" toolText="全图显示" /></DIV></DIV><BR></FONT><BR><FONT face=宋体>自定义</FONT><FONT face="宋体, MS Song">command</FONT><FONT face=宋体>就这样完成了</FONT></FONT></DIV> |
|
|
|
4楼#
发布于:2007-11-04 20:06
<DIV right" align=right></DIV>Server Java讲座--自定义Tools开发<BR><BR>
<DIV><FONT face=宋体><FONT size=3>今天进行整理,发现自定义tools的教程忘记写了。今天把这个补全吧。<BR><BR><FONT color=#000000>什么是tools,tools就是工具,它跟command的区别就是tools是要跟地图进行交互后再执行某个命令,而command是直接执行某个命令。最简单的tools和command的对比是放大是一个工具,而全图显示就是一个命令。</FONT><BR><FONT color=#000000></FONT><BR><FONT color=#000000>ESRI已经包含的工具包括:放大(zoom in),缩小(zoom out),平移(Pan)。</FONT><BR><FONT color=#000000></FONT><BR><FONT color=#000000>前面我们都是先说服务器端的处理代码,现在先来看看客户端的处理。跟地图交互,就会产生怎么交互的问题。拉框放大的时候是在地图上画的是一个长方形,测距的时候在地图上画的是一条线。如何控制这些客户端的功能呢?</FONT><BR><FONT color=#000000></FONT><BR><FONT color=#000000>查看com.esri.adf.web.faces.event.MapEvnet的帮助,里面详细说明了如何把客户端的操作如何和服务器端的代码建立联系。已有的客户端支持的操作包括:</FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>EsriMapCircle <BR>EsriMapContinuousPan <BR>EsriMapLine <BR>EsriMapOval <BR>EsriMapPan <BR>EsriMapPoint <BR>EsriMapPolygon <BR>EsriMapPolyline <BR>EsriMapRectangle</DIV></DIV><BR><FONT color=#000000>如果我们要自己写一个工具,我们可以新建一个普通的类,这个类可以实现MapToolAction接口,也可以不实现任何接口。我们先来看一个实现接口的类。</FONT><BR></FONT></FONT><FONT face=宋体><FONT size=3><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>public class CJZoomInTool implements MapToolAction {<BR><BR> public void execute(MapEvent event) {<BR><BR>WebContext ctx = event.getWebContext();<BR> WebGeometry screenGeom = event.getWebGeometry();<BR> WebGeometry mapGeom = screen.toMapGeometry(ctx.getWebMap());<BR><BR><BR>}<BR><BR>}</DIV></DIV><BR></FONT></FONT><FONT size=3><FONT face=宋体><FONT color=#000000>我们可以看到,通过MapEvent的getWebGeometry方法可以得到客户端所画的多边形,此时得到的是屏幕坐标,然后再通过toMapGeometry方法转换为地图坐标。</FONT><BR><FONT color=#000000></FONT><BR><FONT color=#000000>MapEvent的getWebGeometry方法事实上是指向到ClientActionArgs的getWebGeometry方法,你可以用下面的代码得到另外一个WebGeometry进行比较:</FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>ClientActionArgs clientarg=event.getClientActionArgs();<BR>WebGeometry anotherGeom=clientarg.getWebGeometry();</DIV></DIV><BR><FONT color=#000000>我们还可以用ClientActionArcgs的getRequestParameter查看传送过来的参数是什么,在客户端指定长方形的情况下,得到的RequestParamerter里面有如下参数:</FONT><BR><FONT color=#000000></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>Map0_maxx:246<BR>Map0_miny:147<BR>Map0_minx:199<BR>Map0_maxy:199</DIV></DIV><BR><FONT color=#000000>你一定想看看客户端是多边形的情况下,参数是什么情况,我们满足一下您的愿望:</FONT><BR></FONT></FONT><FONT face=宋体><FONT size=3><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>Map0_coords:220:168|264:220|296:186|292:136|258:125</DIV></DIV><BR></FONT></FONT><FONT size=3><FONT face=宋体><FONT color=#000000>出现了以|分隔的参数集合,这个意思大家都明白了吧,这就是多边形的情况。</FONT><BR><FONT color=#000000></FONT><BR><FONT color=#000000>ClientActionArgs是一个基类,它的所有的子类对应于每一个客户端的操作。每个积累需要实现它的抽象方法。最重要的两个方法是init()和getWebGeometry,init从request里面得到所有的参数,getWebGeometry从根据不同的参数,构建不同的geometry返回。ADF会根据不同的客户端操作,创建不同的ClientActionArgs类。如果你一定要问我ADF是如何根据不同的客户端操作创建ClientActionArgs的,我们可以看到ClientActionArgs有一个静态方法:</FONT><BR><FONT color=#000000></FONT><BR></FONT></FONT><FONT face=宋体><FONT size=3><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>getClientActionArgs(java.lang.String clientAction, java.util.Map requestParameters, java.lang.String controlId)</DIV></DIV><BR><FONT color=#000000>ADF就是用这个静态方法,根据不同的clientAction可以得到的ClientActionArgs。</FONT><BR><FONT color=#000000></FONT><BR><FONT color=#000000>这一下,把来龙去脉都讲了,既让大家看看整个客户端和服务器端操作的来龙去脉,也为大家增加自己的客户端操作热个身。</FONT><BR><FONT color=#000000></FONT><BR><FONT color=#000000>当然,自定义一个tool并不需要这么多的知识。事实上,自定义一个tools非常得简单,我们来看看帮助中的一段代码,计算选中了多少个要素。</FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>package com.cj.ucdemo;<BR><BR>import java.rmi.RemoteException;<BR><BR>import com.esri.adf.web.ags.ADFAGSException;<BR>import com.esri.adf.web.ags.data.AGSMapResource;<BR>import com.esri.adf.web.data.WebContext;<BR>import com.esri.adf.web.data.geometry.WebExtent;<BR>import com.esri.adf.web.faces.event.MapEvent;<BR>import com.esri.adf.web.faces.event.MapToolAction;<BR>import com.esri.arcgisws.EnvelopeN;<BR>import com.esri.arcgisws.EsriSearchOrder;<BR>import com.esri.arcgisws.EsriSpatialRelEnum;<BR>import com.esri.arcgisws.MapServerPort;<BR>import com.esri.arcgisws.SpatialFilter;<BR><BR>public class CountFeatureTool implements MapToolAction {<BR> <BR> WebContext context=null;<BR> int countedFeatures;<BR> <BR> private void countFeatures(WebExtent extent){<BR> <BR> //Get the MapServerPort so we can execute methods through ArcGIS Server API<BR> <BR> AGSMapResource agsMap = ((AGSMapResource)context.getResources().get("ags1"));<BR> MapServerPort mapServer = agsMap.getMapServer();<BR> //Make a new envelope from the web extent<BR> EnvelopeN env = new EnvelopeN(extent.getMinX(), extent.getMinY(), extent.getMaxX(), extent.getMaxY(),<BR> null, null, null, null, null);<BR><BR> //Setup a spatial filter for an Intersection relationship<BR> SpatialFilter spatialFilter = new SpatialFilter();<BR> spatialFilter.setSpatialRel(EsriSpatialRelEnum.esriSpatialRelIntersects);<BR> spatialFilter.setWhereClause("");<BR> spatialFilter.setSearchOrder(EsriSearchOrder.esriSearchOrderSpatial);<BR> spatialFilter.setSpatialRelDescription("");<BR> spatialFilter.setGeometryFieldName("");<BR> //Set the envelope as the geometry<BR> spatialFilter.setFilterGeometry(env);<BR><BR> //MapServer::queryFeatureCount() executes on the server and can throw a RemoteException<BR> try{<BR> //Count features in 4th layer which intersect with the envelope<BR> int layerId = 1;<BR> this.countedFeatures =<BR> mapServer.queryFeatureCount(mapServer.getDefaultMapName(), layerId, spatialFilter);<BR> <BR> System.out.println("你选择了 "+countedFeatures+" 要素");<BR> <BR> }catch(RemoteException rme){<BR> //Rethrow this as ADFAGSException so that it can participate in the exception framework<BR> throw new ADFAGSException("Could not execute MapServer::queryFeatureCount()",rme);<BR> }<BR> }<BR><BR> <BR><BR> public void execute(MapEvent arg0) throws Exception {<BR> // TODO Auto-generated method stub<BR> try{<BR> this.context=arg0.getWebContext();<BR> WebExtent ex=(WebExtent)arg0.getWebGeometry();<BR> ex=(WebExtent)ex.toMapGeometry(arg0.getWebContext().getWebMap());<BR> this.countFeatures(ex);<BR> }catch(Exception ex){<BR> ex.printStackTrace();<BR> }<BR><BR> }<BR><BR>}</DIV></DIV><BR><FONT color=#000000>大家注意这里使用了很多com.esri.arcgisws package里面的类,这个package是通过axis调用远程webservice的方式去调用服务器端的方法的。我们会在后续的讲座中说明。编译这个类后,直接在jsp页面里面用下面的代码调用即可:</FONT><BR></FONT></FONT><FONT face=宋体><FONT size=3><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=4730;extra=page%3D4###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV> <a:tool id="countFeature" defaultImage="images/selection.gif" hoverImage="images/ selectionU.gif" selectedImage="images/ selectionD.gif" clientAction="EsriMapRectangle" serverAction="com.cj.ucdemo.CountFeatureTool" clientPostBack="true"/></DIV></DIV></FONT></FONT></DIV> |
|
|
|
5楼#
发布于:2007-11-04 20:07
<DIV right" align=right></DIV>Server JAVA讲座--实现后台JSF Bean和前台Javascript的联动<BR><BR>
<DIV><FONT size=3><FONT color=#000000><FONT face=宋体>很多开发人员都梦寐以求的方案,我在论坛里面也看到很多人提出这样的问题,今天集中对这些问题做一个解答,也是作为</FONT><FONT face="Times New Roman">Server JAVA</FONT><FONT face=宋体>讲座的一个部分。另外,要说明的是,今天的讲座不包括</FONT><FONT face="Times New Roman">AJAX</FONT><FONT face=宋体>技术。</FONT><FONT face="Times New Roman">AJAX</FONT><FONT face=宋体>技术会另开一个讲座。</FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face="Times New Roman"> </FONT><FONT face=宋体>先以一个问题开始,如果我们的</FONT><FONT face="Times New Roman">webapplication</FONT><FONT face=宋体>中对</FONT><FONT face="Times New Roman">geodatabase</FONT><FONT face=宋体>进行了编辑,大家都知道,这个时候需要一个提交编辑并保存,或者提交编辑并取消的过程,大家都用过</FONT><FONT face="Times New Roman">ArcMAP</FONT><FONT face=宋体>,如果没有用过</FONT><FONT face="Times New Roman">ArcMAP</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">word</FONT><FONT face=宋体>总是用过的,编辑过的东西,一关闭,肯定会给你警告。这个问题在桌面程序中简直就不是问题,在</FONT><FONT face="Times New Roman">web</FONT><FONT face=宋体>上,我们倒是可以来说一说了,因为</FONT><FONT face="Times New Roman">server</FONT><FONT face=宋体>和你的</FONT><FONT face="Times New Roman">browser</FONT><FONT face=宋体>可能相距几万公里,你这边要关闭</FONT><FONT face="Times New Roman">browser</FONT><FONT face=宋体>,在美国的服务器怎么能够知道你要关闭呢?服务器上运行的是</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">Bean</FONT><FONT face=宋体>,而客户端运行的是</FONT><FONT face="Times New Roman">Javascript</FONT><FONT face=宋体>,怎么让</FONT><FONT face="Times New Roman">Javascript</FONT><FONT face=宋体>去感知后台的情况,给用户一个提示,这样就会很好地显示我们程序的友好性,对建设以人为本的和谐社会也大有好处。那么我们来看看如何做这个事情。</FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face="Times New Roman"> Browser</FONT><FONT face=宋体>关闭时会产生</FONT><FONT face="Times New Roman">onUnload</FONT><FONT face=宋体>事件,有了这个事件,使我们有机会做一些事情,比如下面的语句,显示一个信息</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3907;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3907;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><body onUnload="javascript: alert('你要关闭我么?')"></DIV></DIV><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>在</FONT><FONT face="Times New Roman">body</FONT><FONT face=宋体>中添加了这一句后,是不是已经看到了那个温柔的问句呢?如果是,那么你的</FONT><FONT face="Times New Roman">Browser</FONT><FONT face=宋体>是支持这个</FONT><FONT face="Times New Roman">onUnload</FONT><FONT face=宋体>事件的。下面来看这段代码:</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><FONT face=Tahoma><FONT size=2><FONT color=#333333><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3907;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3907;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><BR>function checkTime(){<BR> var isModified=<c:out value="${editBean.edited }"/>;<BR> if(isModified ==true)<BR> alert("更新没有保存");<BR>}</DIV></DIV><BR></FONT></FONT></FONT></FONT></FONT></FONT><BR><BR><FONT size=3><FONT color=#000000><FONT face=宋体>这个代码很有意思,其它的好说,</FONT><FONT face="Times New Roman"><c:out value="${editBean.edited }"/></FONT><FONT face=宋体>不好理解,这是</FONT><FONT face="Times New Roman">JSTL</FONT><FONT face=宋体>,如果没有见过</FONT><FONT face="Times New Roman">JSTL</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">google</FONT><FONT face=宋体>或者</FONT><FONT face="Times New Roman">baidu</FONT><FONT face=宋体>一下看看吧。</FONT><FONT face="Times New Roman">editBean</FONT><FONT face=宋体>是一个标准的</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">bean</FONT><FONT face=宋体>,它在</FONT><FONT face="Times New Roman">faces-config.xml</FONT><FONT face=宋体>文件中部署,它有一个属性和属性的</FONT><FONT face="Times New Roman">getter,setter</FONT><FONT face=宋体>方法,如下:</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><FONT face=Tahoma><FONT size=2><FONT color=#333333><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3907;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3907;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><BR>private boolean edited=false;<BR> <BR>public boolean isEdited() {<BR>return edited;<BR>}<BR>public void setEdited(boolean edited) {<BR>this.edited = edited;<BR>}</DIV></DIV><BR></FONT></FONT></FONT></FONT></FONT></FONT><BR></FONT></FONT></FONT><BR><FONT size=2><FONT color=#000000><FONT face=宋体>你在开始编辑的时候,设置</FONT><FONT face="Times New Roman">edited</FONT><FONT face=宋体>为</FONT><FONT face="Times New Roman">true</FONT><FONT face=宋体>就可以了。</FONT><FONT face="Times New Roman">JSTL</FONT><FONT face=宋体>能够用过</FONT><FONT face="Times New Roman"><c:out></FONT><FONT face=宋体>标签访问到这个</FONT><FONT face="Times New Roman">bean</FONT><FONT face=宋体>的值。这样,就实现了前台</FONT><FONT face="Times New Roman">Javascript</FONT><FONT face=宋体>和后台</FONT><FONT face="Times New Roman">JSF bean</FONT><FONT face=宋体>的联动。</FONT></FONT><BR></FONT><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT face=宋体><FONT size=2><FONT color=#000000>是不是看了这个文章,马上摩拳擦掌,准备去修改您的程序呢?</FONT></FONT></FONT><BR></DIV> |
|
|
|
6楼#
发布于:2007-11-04 20:07
<DIV right" align=right></DIV>Server JAVA讲座 --AJAX基础<BR><BR>
<DIV><FONT size=3><FONT color=#000000><FONT face=宋体>咱也来跟跟潮流,讲一讲</FONT><FONT face="Times New Roman">AJAX</FONT><FONT face=宋体>和</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>如何结合。我相信,这也是将来</FONT><FONT face="Times New Roman">SERVER JAVA</FONT><FONT face=宋体>的开发人员都会问的一个问题。我们来看看如何能够让</FONT><FONT face="Times New Roman">AJAX</FONT><FONT face=宋体>能够在服务器上和客户端跑起来。</FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>要应用</FONT><FONT face="Times New Roman">AJAX</FONT><FONT face=宋体>的条件是:</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT color=#000000><FONT size=3>1、</FONT> </FONT></FONT><FONT size=3><FONT color=#000000><FONT face=宋体>一个支持</FONT><FONT face="Times New Roman">javascript</FONT><FONT face=宋体>的浏览器,当然,现在主流的浏览器都是支持</FONT><FONT face="Times New Roman">Javascript</FONT><FONT face=宋体>的。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT color=#000000><FONT size=3>2、</FONT> </FONT></FONT><FONT size=3><FONT color=#000000><FONT face=宋体>浏览器必须支持</FONT><FONT face="Times New Roman">XMLHTTP</FONT><FONT face=宋体>或者</FONT><FONT face="Times New Roman">XMLHttpRequest</FONT><FONT face=宋体>对象。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT color=#000000><FONT size=3>3、</FONT> </FONT></FONT><FONT size=3><FONT color=#000000><FONT face=宋体>能够以</FONT><FONT face="Times New Roman">XML</FONT><FONT face=宋体>发送响应的服务器端。服务器端可以有很多的技术来实现,不管你是用</FONT><FONT face="Times New Roman">ASP</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">JAVA</FONT><FONT face=宋体>,都可以实现。当然,本文要讨论的局限于</FONT><FONT face="Times New Roman">JSF</FONT><FONT face=宋体>技术。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>对于熟悉大多数服务器端程序编写的工程师,比如我,</FONT><FONT face="Times New Roman">Javascript</FONT><FONT face=宋体>完全是另外一个世界。但是了解</FONT><FONT face="Times New Roman">Javascript</FONT><FONT face=宋体>,将使你的程序更加强大,开发起来更加容易。一个很有意思的功能是如果用户在编辑地图的时候,编辑到中途,忘记保存了,这提醒我们可以做一个比较有意思的功能,自动保存。在</FONT><FONT face="Times New Roman">google mail</FONT><FONT face=宋体>中,你是不是已经感觉到过这个自动保存的功能了呢?反正我当时看到的时候吓了一跳。以一个服务器端程序员的思路去思考,会觉得不可思议。事实上这个功能就可以用</FONT><FONT face="Times New Roman">Ajax</FONT><FONT face=宋体>技术来实现,用一个定时器,每隔</FONT><FONT face="Times New Roman">5</FONT><FONT face=宋体>分钟自动发送一个保存的请求就可以实现这样的功能。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000>再看一个自动查找的例子,比如一个输入一个用户后自动出来和该用户有关的信息,可以通过这样的方法来实现:</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><input type="text" id="query" size="20" onkeyup="search(‘query’);"></DIV></DIV><BR></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face="Times New Roman">Search(‘query’)</FONT><FONT face=宋体>方法可以发送一个</FONT><FONT face="Times New Roman">Ajax</FONT><FONT face=宋体>请求到客户端,进行查询后,将结果以</FONT><FONT face="Times New Roman">XML</FONT><FONT face=宋体>请求返回,这样就不需要刷新整个页面而进行部分更新。就这么一个小小的技术,让用户在继续</FONT><FONT face="Times New Roman">Web </FONT><FONT face=宋体>浏览的时候感觉更好,也成为了各个网站争相模仿的对象,一些开发人员也发现了宝贝一样言必称</FONT><FONT face="Times New Roman">Ajax</FONT><FONT face=宋体>,甚至成为项目选型的关键,这大概也是最初的开发者想象不到的。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>来看看</FONT><FONT face="Times New Roman">Javascript</FONT><FONT face=宋体>如何来发送一个</FONT><FONT face="Times New Roman">XMLHttpRequest</FONT><FONT face=宋体>请求的。来看一下下面的代码:</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><BR>if (window.XMLHttpRequest) {<BR> req = new XMLHttpRequest();<BR>}<BR>else if (window.ActiveXObject) {<BR> req = new ActiveXObject("Microsoft.XMLHTTP");<BR>}</DIV></DIV><BR></FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000>这是再简单不过的实例化<FONT face="Times New Roman">XMLHttpRequest的一段代码,</FONT>实例化一个之后,你就可以像操作一个普通的对象一样操作它,它有很多的方法,比如下面的方法是建立和服务器端的链接:</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><BR>req.open("GET", url, true);</DIV></DIV><BR></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>第一个参数是</FONT><FONT face="Times New Roman">HTTP</FONT><FONT face=宋体>请求的方式:</FONT><FONT face="Times New Roman">”Get”</FONT><FONT face=宋体>或者</FONT><FONT face="Times New Roman">”Post”</FONT><FONT face=宋体>,第二个参数是服务器的</FONT><FONT face="Times New Roman">URL</FONT><FONT face=宋体>,第三个参数是是否进行非同步的请求。大家如果已经仔细研究了我们</FONT><FONT face="Times New Roman">ESRI</FONT><FONT face=宋体>的工具标签,你会发现这些标签里面有一个</FONT><FONT face="Times New Roman">clientPostBack</FONT><FONT face=宋体>属性可以设置是否进行异步请求。我们可以知道,</FONT><FONT face="Times New Roman">Web ADF</FONT><FONT face=宋体>在后面肯定用了</FONT><FONT face="Times New Roman">open</FONT><FONT face=宋体>方法的第三个参数来进行。要小心的是,如果你要设置</FONT><FONT face="Times New Roman">clientPostBack</FONT><FONT face=宋体>为</FONT><FONT face="Times New Roman">true</FONT><FONT face=宋体>,你的</FONT><FONT face="Times New Roman">javascript</FONT><FONT face=宋体>代码可能需要重新构建一下。不然这些代码可能不会被执行。因为异步请求更新的是部分页面。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>异步请求的意思是在请求时浏览器可以做其它的事情,那么如何得知服务器端的处理已经结束,可以更新页面上的数据了呢?我们来看看</FONT><FONT face="Times New Roman">XMLHttpRequest</FONT><FONT face=宋体>对象的方法</FONT></FONT></FONT><BR><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><BR>req.onreadystatechange = processXMLResponse;</DIV></DIV><BR></FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>当服务器端的处理结束时,就可以调用</FONT><FONT face="Times New Roman">processXMLResponse</FONT><FONT face=宋体>方法,我们就可以通过对这个方法进行编程来处理请求,当然可以是任何的名字的方法,只要将方法注册到</FONT><FONT face="Times New Roman">onreadystatechange</FONT><FONT face=宋体>方法即可。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face="Times New Roman">XMLHttpRequest</FONT><FONT face=宋体>初始化完成后就可以发送到请求到服务器端了,用一个很简单的方法即可:</FONT></FONT></FONT><BR><FONT face=宋体><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><BR>req.send(null);</DIV></DIV><BR></FONT></FONT></FONT><BR></FONT><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>当然,一般</FONT><FONT face="Times New Roman">get</FONT><FONT face=宋体>用的实在太少,我们最关心的是</FONT><FONT face="Times New Roman">Post</FONT><FONT face=宋体>,看看</FONT><FONT face="Times New Roman">Post</FONT><FONT face=宋体>应该怎么做:</FONT></FONT></FONT><BR><FONT face=宋体><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><BR>req.open("POST", "/agsviewer", true);<BR>req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded";<BR>req.send("__ADFPostBack__=true;formId=f"+";mapId=Map0;ajaxdemo=ajaxdemo ");</DIV></DIV><BR></FONT></FONT></FONT><BR></FONT><FONT size=3><FONT color=#000000><FONT face="Times New Roman">Post</FONT><FONT face=宋体>可以发送一些数据到服务器端,这正是我们所需要的。我们来继续看看一个请求当前比例尺的代码:</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3944;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><BR><BR>function updateInfoResponse(xmlHttp) {<BR> if (xmlHttp != null ;; xmlHttp.readyState == 4 ;; xmlHttp.status == 200) {<BR> var xml = xmlHttp.responseXML;<BR> document.getElementById("scale").value = "1:" + xml.getElementsByTagName("scale").item(0).firstChild.nodeValue;<BR> }<BR>}</DIV></DIV><BR></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>看一下判断了</FONT><FONT face="Times New Roman">(xmlHttp != null ;; xmlHttp.readyState == 4 ;; xmlHttp.status == 200</FONT><FONT face=宋体>,判断</FONT><FONT face="Times New Roman">4</FONT><FONT face=宋体>是表示处理已经结束,判断</FONT><FONT face="Times New Roman">200</FONT><FONT face=宋体>表示</FONT><FONT face="Times New Roman">HTTP</FONT><FONT face=宋体>请求正常,相信大家都见过</FONT><FONT face="Times New Roman">404</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">HTTP</FONT><FONT face=宋体>请求,令人讨厌的</FONT><FONT face="Times New Roman">“page not found”</FONT><FONT face=宋体>。</FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>判断结束后,就用</FONT><FONT face="Times New Roman">xml.getElementsByTagName("scale").item(0).firstChild.nodeValue;</FONT><FONT face=宋体>语句把比例尺取过来。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT color=#000000><FONT size=3><FONT face=宋体>相信大家都大致知道</FONT><FONT face="宋体, MS Song">AJAX</FONT><FONT face=宋体>是怎么回事了,下一次我会写一个简单的例子。</FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000>IBM网站上有一篇很好的介绍AJAX的文章,大家可以去看看:</FONT></FONT></FONT><BR><a href="http://www-128.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html" target="_blank" ><FONT face="宋体, MS Song">http://www-128.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html</FONT></A><BR></DIV> |
|
|
|
7楼#
发布于:2007-11-04 20:07
<DIV right" align=right></DIV>Server JAVA开发讲座--- ADF中的Ajax函数<BR><BR>
<DIV><FONT face="Times New Roman"><FONT color=#000000><FONT size=3>ESRI</FONT><FONT face=宋体>为了使</FONT><FONT face="Times New Roman">Server ADF</FONT><FONT face=宋体>能够支持</FONT><FONT face="Times New Roman">Ajax</FONT><FONT face=宋体>,做了大量的工作,</FONT><FONT face="Times New Roman">Sever ADF</FONT><FONT face=宋体>中有很多可以利用的代码,我们来看看:</FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>代码</FONT><FONT face="Times New Roman">1</FONT><FONT face=宋体>:创建</FONT><FONT face="Times New Roman">XMLHttpRequest</FONT><FONT face=宋体>,可以看一下下面的代码:</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3946;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3946;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>this.createXmlHttpObject = function() {<BR> if (this.isIE) {<BR> try {<BR> return new ActiveXObject("Msxml2.XMLHTTP");<BR> }<BR> catch (exception) {<BR> return new ActiveXObject("Microsoft.XMLHTTP");<BR> }<BR> }<BR> return new XMLHttpRequest();<BR> }</DIV></DIV><BR><FONT size=3><FONT color=#000000><FONT face=宋体>这个代码写得很妙吧,前面两个处理</FONT><FONT face="Times New Roman">IE</FONT><FONT face=宋体>浏览器,最后一个支持</FONT><FONT face="Times New Roman">Firefox</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">XMLHttpRequest</FONT><FONT face=宋体>是</FONT><FONT face="Times New Roman">Firefox</FONT><FONT face=宋体>的。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT face=宋体><FONT size=3><FONT color=#000000>发送请求,用如下命令:</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><FONT face=Tahoma><FONT size=2><FONT color=#333333><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3946;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3946;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>EsriUtils.sendAjaxRequest(url, params, true, function() { updateInfoResponse(xmlHttp); });</DIV></DIV><BR></FONT></FONT></FONT></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>解释一下,怎么得到这个</FONT><FONT face="Times New Roman">url</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">ESRI</FONT><FONT face=宋体>也提供了办法:</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><FONT face=Tahoma><FONT size=2><FONT color=#333333><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3946;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3946;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>var url = EsriUtils.getServerUrl(formId);</DIV></DIV><BR></FONT></FONT></FONT></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face="Times New Roman">getServerUrl</FONT><FONT face=宋体>的代码如下:</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><FONT face=Tahoma><FONT size=2><FONT color=#333333><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3946;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3946;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>this.getServerUrl = function(fId) {<BR> if (document.forms[fId].action.indexOf(";jsessionid=") != -1)<BR> return document.forms[fId].action;<BR> else if (this.getJSessionId())<BR> return document.forms[fId].action + ";jsessionid=" + this.getJSessionId();<BR> else<BR> return document.forms[fId].action;<BR> }</DIV></DIV><BR></FONT></FONT></FONT></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>嗯,</FONT><FONT face="Times New Roman">url</FONT><FONT face=宋体>已经解释了,我们看看第二个参数</FONT><FONT face="Times New Roman">params</FONT><FONT face=宋体>,这个参数包含了我们需要传递到服务器端的参数。看一下源代码就可以知道,</FONT><FONT face="Times New Roman">xh.send(params);</FONT><FONT face=宋体>将这些参数发送到服务器端。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face="Times New Roman">doGet</FONT><FONT face=宋体>参数就比较简单了,用来说明这个请求是</FONT><FONT face="Times New Roman">get</FONT><FONT face=宋体>还是</FONT><FONT face="Times New Roman">post</FONT><FONT face=宋体>。看看源代码,发送的方法是不一样的,如果是</FONT><FONT face="Times New Roman">get</FONT><FONT face=宋体>方法,那些参数用</FONT><FONT face="Times New Roman">?</FONT><FONT face=宋体>进行连接,传送到服务器端。它返回的仍然是</FONT><FONT face="Times New Roman">XMLHttpRequest</FONT><FONT face=宋体>对象。</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face="Times New Roman">Callback</FONT><FONT face=宋体>函数是我们自己写的函数,用来在服务器数据处理完成后,处理服务器端传送过来的数据。大家看着是不是一目了然了呢?</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face="Times New Roman">sendAjaxRequest</FONT><FONT face=宋体>的源代码</FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000><FONT face=Tahoma><FONT size=2><FONT color=#333333><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3946;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3946;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>this.sendAjaxRequest = function(url, params, doGet, callback) {<BR> try {<BR> var xh = this.createXmlHttpObject();<BR> xh.onreadystatechange = callback;<BR> if (doGet) {<BR> xh.open("GET", url + "?" + params, true);<BR> xh.send(null);<BR> }<BR> else {<BR> xh.open("POST", url, true);<BR> xh.send(params);<BR> }<BR> return xh;<BR> }<BR> catch (exception) {<BR> return null;<BR> }<BR> }<BR>}</DIV></DIV><BR></FONT></FONT></FONT></FONT></FONT></FONT><BR><FONT face="Times New Roman"><FONT size=3><FONT color=#000000></FONT></FONT></FONT><BR><FONT size=3><FONT color=#000000><FONT face=宋体>有了这几个强大的函数,我们就可以利用</FONT><FONT face="Times New Roman">ESRI</FONT><FONT face=宋体>的成果,来进行</FONT><FONT face="Times New Roman">Ajax</FONT><FONT face=宋体>的开发了。说了半天客户端的东西,下一篇我们来讲服务器端的处理,服务器端的处理需要比较大的篇幅来说。</FONT></FONT></FONT></DIV> |
|
|
|
8楼#
发布于:2007-11-04 20:08
<FONT face=宋体>服务器端的处理才是整个事件的</FONT><FONT face="Times New Roman">Key</FONT><FONT face=宋体>,那么我们来看看整个请求,回复的过程,我们通过下面的图看看我们服务器端的代码怎么样才可以</FONT><FONT face="Times New Roman">plug in</FONT><FONT face=宋体>进去:</FONT><BR><BR><FONT size=3><FONT color=#000000><FONT face=宋体><FONT face=Arial><FONT style="FONT-SIZE: 7pt"></FONT></FONT></FONT></FONT></FONT><IMG src="http://bbs.esrichina-bj.cn/ESRI/attachments/forumid_14/Snap1_JhqaomJF5Xom.jpg" border=0>
<DIV><IMG src="http://bbs.esrichina-bj.cn/ESRI/images/default/attachimg.gif" border=0></DIV> <DIV><IMG src="http://bbs.esrichina-bj.cn/ESRI/images/attachicons/image.gif" border=0> <a href="http://bbs.esrichina-bj.cn/ESRI/attachment.php?aid=260;nothumb=yes" target="_blank" >Snap1.jpg</A> (38.59 KB)<BR> <DIV class="right smalltxt">2006-12-9 23:02</DIV></DIV><BR><FONT size=3><FONT color=black><FONT face=宋体>看了这个图您肯定已经明白了,我们有机会得到客户端发送过来的</FONT></FONT><FONT color=black><FONT face=Arial>HTTP</FONT></FONT><FONT color=black><FONT face=宋体>请求,得到这个请求,得到请求里面的参数,我们就可以捋起袖子,大干一番了。</FONT></FONT><FONT color=black><FONT face=Arial></FONT></FONT><BR><FONT color=black><FONT face=宋体>我们用什么方式去处理呢,最简单的一个方法是自己写一个</FONT></FONT><FONT color=black><FONT face=Arial>servlet</FONT></FONT><FONT color=black><FONT face=宋体>,在</FONT></FONT><FONT color=black><FONT face=Arial>servlet</FONT></FONT><FONT color=black><FONT face=宋体>的</FONT></FONT><FONT color=black><FONT face=Arial>Dopost</FONT></FONT><FONT color=black><FONT face=宋体>方法里面,写上处理这个请求的代码,并且把结果以</FONT></FONT><FONT color=black><FONT face=Arial>XML</FONT></FONT><FONT color=black><FONT face=宋体>的方式返回回去,那么我们这里用一个简单的例子:</FONT></FONT><FONT color=black><FONT face=Arial></FONT></FONT><BR><FONT color=black><FONT face=Arial></FONT></FONT><FONT size=3></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3951;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3951;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>public void doPost(HttpServletRequest req, HttpServletResponse res)<BR> throws java.io.IOException {<BR><BR> String action = req.getParameter("action");<BR> String item = req.getParameter("item");<BR> <BR> if ((action != null);;(item != null)) {<BR><BR> // Add or remove items from the Cart<BR> if ("add".equals(action)) {<BR> cart.addItem(item);<BR><BR> } else if ("remove".equals(action)) {<BR> cart.removeItems(item);<BR><BR> }<BR> }<BR><BR> // Serialize the Cart's state to XML<BR> String cartXml = cart.toXml();<BR><BR> // Write XML to response.<BR> res.setContentType("application/xml");<BR> res.getWriter().write(cartXml);<BR>}</DIV></DIV><BR><FONT color=black><FONT face=Arial> </FONT></FONT><FONT color=black><FONT face=宋体>这对于了解服务器端编程的人来说,是最简单不过的了。当然,我们用了</FONT></FONT><FONT color=black><FONT face=Arial>JSF</FONT></FONT><FONT color=black><FONT face=宋体>框架,肯定不会再通过</FONT></FONT><FONT color=black><FONT face=Arial>Servlet</FONT></FONT><FONT color=black><FONT face=宋体>技术去做这件事情。我们这里用</FONT></FONT><FONT color=black><FONT face=Arial>JSF</FONT></FONT><FONT color=black><FONT face=宋体>的</FONT></FONT><FONT color=black><FONT face=Arial>PhaseListener</FONT></FONT><FONT color=black><FONT face=宋体>进行处理。什么是</FONT></FONT><FONT color=black><FONT face=Arial>PhaseListener</FONT></FONT><FONT color=black><FONT face=宋体>,我们来看一下</FONT></FONT><FONT color=black><FONT face=Arial>PhaseListener</FONT></FONT><FONT color=black><FONT face=宋体>的</FONT></FONT><FONT color=black><FONT face=Arial>JavaDoc</FONT></FONT><FONT color=black><FONT face=宋体>:</FONT></FONT><FONT color=black><FONT face=Arial></FONT></FONT><BR><FONT color=black><FONT face=Arial></FONT></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3951;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3951;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>public interface PhaseListener<BR><BR><BR>extends java.util.EventListener, java.io.Serializable<BR><BR><BR>An interface implemented by objects that wish to be notified at the beginning and ending of processing for each standard phase of the request processing lifecycle.</DIV></DIV><BR></FONT> <P align=left><FONT size=3></FONT></P><FONT size=3></FONT><BR><FONT size=3><FONT color=black><FONT face=Arial> </FONT></FONT><FONT color=black><FONT face=宋体>原来,这个接口捕捉到每个</FONT></FONT><FONT color=black><FONT face=Arial>Request</FONT></FONT><FONT color=black><FONT face=宋体>的声明周期,在请求开始处理和请求处理结束时我们可以插入我们自己的代码。这个接口的两个最重要的方法如下:</FONT></FONT><FONT color=black><FONT face=Arial></FONT></FONT><BR><FONT color=black><FONT face=Arial></FONT></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3951;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3951;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>void afterPhase(javax.faces.event.PhaseEvent event) <BR> Handle a notification that the processing for a particular phase has just been completed. void beforePhase(javax.faces.event.PhaseEvent event) <BR> Handle a notification that the processing for a particular phase of the request processing lifecycle is about to begin.</DIV></DIV><BR><FONT color=black><FONT face=Arial> </FONT></FONT><FONT color=black><FONT face=宋体>处理结束和处理开始两个方法,我们可以在这两个方法里面写入我们自己的代码,对用户过来的请求进行处理。</FONT></FONT><FONT color=black><FONT face=Arial></FONT></FONT><BR><FONT color=black><FONT face=Arial> </FONT></FONT><FONT color=black><FONT face=宋体>比如,我们可以在</FONT></FONT><FONT color=black><FONT face=Arial>afterPhase</FONT></FONT><FONT color=black><FONT face=宋体>方法里面,插入下面的代码对数据进行处理:</FONT></FONT><FONT color=black><FONT face=Arial></FONT></FONT><BR><FONT color=black><FONT face=Arial></FONT></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3951;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3951;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>FacesContext facesContext = phaseEvent.getFacesContext();<BR> ExternalContext externalContext = facesContext.getExternalContext();<BR>Map paramMap = externalContext.getRequestParameterMap();</DIV></DIV><BR><FONT color=black><FONT face=宋体>通过</FONT></FONT><FONT color=black><FONT face=Arial>paramMap</FONT></FONT><FONT color=black><FONT face=宋体>里面可以得到所有的参数,当然,我们并不是对每一个请求都会进行处理,所以,在客户端</FONT></FONT><FONT color=black><FONT face=Arial>Javascript</FONT></FONT><FONT color=black><FONT face=宋体>发送</FONT></FONT><FONT color=black><FONT face=Arial>Ajax</FONT></FONT><FONT color=black><FONT face=宋体>请求得时候,可以添加一个自定义的参数,比如我们前面文档中的</FONT></FONT><FONT color=black><FONT face=Arial>ajaxdemo=ajaxdemo</FONT></FONT><FONT color=black><FONT face=宋体>参数,这样我们可以判断一下当前是不是我们要处理的请求:</FONT></FONT></FONT><BR><FONT size=3><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3951;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3951;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>private final static String AJAX_DEMO = "ajaxdemo";<BR><BR>if (! AJAX_DEMO.equals(paramMap.get(AJAX_DEMO)))<BR> return;</DIV></DIV><BR><FONT color=black><FONT face=Arial> </FONT></FONT><FONT color=black><FONT face=宋体>接下去的代码,就可以处理我们的各种各样的请求了,我们在这里要举的例子是如何得到当前地图的比例尺。下次讲座再深入探讨吧。</FONT></FONT><FONT color=black><FONT face=Arial></FONT></FONT></FONT><BR><BR> |
|
|
|
9楼#
发布于:2007-11-04 20:09
Server Java讲座--用Ajax得到地图比例尺(客户端代码)<BR><BR>
<DIV><FONT color=black>上个讲座我们讲到,服务器端已经得到了当前地图的比例尺,我们需要在客户端做一个处理,把这个比例尺数据给用户看。我们在页面上放一个文本框,用来显示比例尺数据,如下面的代码所示:</FONT><FONT color=black></FONT><BR><FONT color=black></FONT><FONT size=3></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3958;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3958;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV> <tr><BR> <td>Scale</td><BR> <td><input type="text" id="scale" size="36" /></td><BR> </tr></DIV></DIV><BR><FONT color=black>我们如何将服务器传过来的数据更新这个文本框呢?来看看前面讲座中提到的往服务器端发送请求时候的那个回调函数:</FONT><FONT color=black></FONT><BR><FONT color=black>var xmlHttp = EsriUtils.sendAjaxRequest(url, params, true, function() { updateInfoResponse(xmlHttp); });</FONT><BR><FONT color=black>我们把回调函数的代码也贴在这里:</FONT><FONT color=black></FONT><BR><FONT color=black></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3958;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3958;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>function updateInfoResponse(xmlHttp) {<BR> if (xmlHttp != null ;; xmlHttp.readyState == 4 ;; xmlHttp.status == 200) {<BR><BR>var xml = xmlHttp.responseXML;<BR> var scale=xml.getElementsByTagName("scale").item(0).firstChild.nodeValue;<BR> document.getElementById("scale").value = "1:" + scale<BR><BR> }<BR>}</DIV></DIV><BR><FONT color=black>这个代码相比大家都能看明白了,先判断服务器端是不是已经处理结束,并且服务器的状态一切正常,然后得到服务器返回的</FONT><FONT color=black>xml</FONT><FONT color=black>,通过</FONT><FONT color=black>getElementsByTagName</FONT><FONT color=black>把里面包含着的比例尺数据提取出来,组合中我们熟悉的文本,然后把这个文本填充到</FONT><FONT color=black>ID</FONT><FONT color=black>为</FONT><FONT color=black>scale</FONT><FONT color=black>的文本框中。</FONT><FONT color=black></FONT><BR><FONT color=black></FONT><BR><FONT color=black>我们来总结一下,我们发送了一个请求,这个请求包含了</FONT><FONT color=black>MapID</FONT><FONT color=black>参数,和一个标志参数</FONT><FONT color=black>ajaxdemo</FONT><FONT color=black>,</FONT><FONT color=black>MapID</FONT><FONT color=black>参数可以让服务器得到</FONT><FONT color=black>MapControl</FONT><FONT color=black>的实例和</FONT><FONT color=black>WebMap</FONT><FONT color=black>,进而得到比例尺。</FONT><FONT color=black>Ajaxdemo</FONT><FONT color=black>让服务器端的处理程序可以正确的辨识这个请求是我们这个</FONT><FONT color=black>PhaseListener</FONT><FONT color=black>需要处理的请求,处理结束后,返回</FONT><FONT color=black>XML</FONT><FONT color=black>到客户端。客户端的回调函数处理</FONT><FONT color=black>XML</FONT><FONT color=black>文档,提取出比例尺信息,写入到页面的文本框中。撩起</FONT><FONT color=black>Ajax</FONT><FONT color=black>神秘的面纱后,发现原来</FONT><FONT color=black>Ajax</FONT><FONT color=black>不过如此,老酒装新瓶,重新包装了一下。</FONT><FONT color=black></FONT><BR><FONT color=black>讲到这里,大家心中想必还有两个疑点,第一个是说了半天,我们是怎么触发这个请求的呢?通过定时器触发么?不是。我们是通过地图的变化进行触发的,这样是最最合理的,每当地图更新了,客户端会自动发送一个请求,要求地图变化后的比例尺。非常合理,但是怎么进行设置呢?我们经常说,我们的控件是支持</FONT><FONT color=black>Ajax</FONT><FONT color=black>的,如何支持?我们支持通过监听器的方式,监听地图的变化,如下面的代码所示:</FONT><FONT color=black></FONT><BR><FONT color=black></FONT><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3958;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3958;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV>var map = EsriControls.maps["Map0"];<BR> map.addUpdateListener("request", updateInfoRequest);</DIV></DIV><BR><FONT color=black>这样,每次地图更新时,都会触发</FONT><FONT color=black>updateInfoRequest</FONT><FONT color=black>函数,该函数用来向服务器端发送请求。</FONT><FONT color=black></FONT><BR><FONT color=black></FONT><BR><FONT color=black>另外一个疑问是</FONT><FONT color=black>Phaselistener</FONT><FONT color=black>怎么设置,看一下</FONT><FONT color=black>JavaDoc</FONT><FONT color=black>可以知道,我们可以在</FONT><FONT color=black>faces-config.xml</FONT><FONT color=black>文件中,用下面的语句进行设置:</FONT><FONT color=black></FONT><BR><FONT face=Tahoma><FONT color=#333333><BR><BR> <DIV class=msgbody> <DIV class=msgheader> <DIV class=right><a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3958;extra=page%3D6###" target="_blank" >[Copy to clipboard]</A> <a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3958;extra=page%3D6###" target="_blank" >[ - ]</A></DIV>CODE:</DIV> <DIV><BR><lifecycle><BR> <phase-listener>demo.AjaxDemoPhaseListener</phase-listener><BR> </lifecycle></DIV></DIV><BR><FONT color=black><FONT face=宋体>恩,已经完美了。</FONT></FONT><FONT color=black><FONT face=Arial></FONT></FONT><BR><FONT color=black><FONT face=Arial></FONT></FONT><BR><FONT face=Arial>Ajax</FONT><FONT face=宋体>的讲座到此告一段落了,欢迎大家讨论。</FONT></FONT></FONT><BR></DIV> |
|
|
上一页
下一页