JSF 2.0简介:Ajax对页面的增加与删除操作例子

本文通过示例介绍JSF2.0中Ajax模型的应用,重点讲解如何使用f:ajax标签实现页面元素的动态增删操作。
JSF 2.0简介:Ajax对页面的增加与删除操作例子

上一篇我们初步接触了一下JSF2.0的Ajax模型,为了适应Ajax的应用场景,JSF2.0中还引入了f:ajax标签,我们这一篇就用来初步使用一下,并采用managed  bean处理页面的元素,看看整个处理过程是否更简介可控。

还是从上一篇中的例子开始,首先看看我们改写后的echo.xhtml页面:

echo.xhtml:

<!DOCTYPE  html  PUBLIC  "-//W3C//DTD  XHTML  1.0  Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html  xmlns="http://www.w3.org/1999/xhtml"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:echo="http://java.sun.com/jsf/composite/echo"
            xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>测试简单的复合组件</title>
        <meta  http-equiv="keywords"  content="jsf2.0,组件,ajax"  />
        <meta  http-equiv="description"  content="测试简单的复合组件."  />
        <meta  http-equiv="content-type"  content="text/html;  charset=UTF-8"  />
    </h:head>
    <body>
        <div  id="header"  style="padding:100px  0  20px  100px;font-size:22px;font-weight:bold;border-bottom:solid  1px  red">
            这个应声器的作者是:#{echo.encoder.author}。
        </div>
        <div>
        <h:form  id="form"  style="padding:20px  0  20px  100px">
                <h:outputScript  library="javax.faces"  name="jsf.js"  target="head"/>
            <echo:echoInputText  echo="#{echo}"></echo:echoInputText>
            <div  style="padding-left:50px">
                            <h:commandButton  id="post"  style="padding:3px;width:100px;"  value="提交响应"   
                                    onclick="jsf.ajax.request(this,  event,  {execute:'form',  render:  'after'});  return  false;"
                                                actionListener="#{count.countIt}"/>
                            <h:commandButton  id="add"  style="padding:3px;width:100px;"  value="增加计数"  action="#{count.addCount}">
                                <f:ajax  execute="@this"  render="@none"  />
                            </h:commandButton>
                            <h:commandButton  id="delete"  style="padding:3px;width:100px;"  value="删除计数"  action="#{count.deleteCount}">
                                <f:ajax  execute="@this"  render="@none"  />
                            </h:commandButton>
            </div>
        </h:form>
        </div>
        <h:panelGroup  id="after">
        <div  style="padding:20px  0  0  100px">
        <div  style="padding:0  0  10px  0">应声器更新次数:#{count.count}</div>
        <h:outputText  id="echo"  value="响应:#{echo.outText}"  escape="false"></h:outputText>
        </div>
        </h:panelGroup>
    </body>
</html>

仔细观察一下,唯一的变化就是加入了两个button,并且分别加入了ajax的支持。
                            <h:commandButton  id="add"  style="padding:3px;width:100px;"  value="增加计数"  action="#{count.addCount}">
                                <f:ajax  execute="@this"  render="@none"  />
                            </h:commandButton>
此button解释一下就是执行managed  bean的addCount方法,并只做局部刷新。

再来看看managed  bean的变化,在count.java中加入了两个方法,如下:

count.java

        public  void  addCount()  {
                FacesContext  ctx  =  FacesContext.getCurrentInstance();
                ExternalContext  extContext  =  ctx.getExternalContext();
                if  (ctx.getPartialViewContext().isAjaxRequest())  {
                        try  {
                                extContext.setResponseContentType("text/xml");
                                extContext.addResponseHeader("Cache-Control",  "no-cache");
                                PartialResponseWriter  writer  =
                                            ctx.getPartialViewContext().getPartialResponseWriter();
                                writer.startDocument();
                                writer.startInsertBefore("echo");
                                writer.writeAttribute("id",  "before",  "id");
                                writer.writeAttribute("style",  "padding:0  0  10px  0",  "style");
                                writer.startElement("div",  null);
                                writer.writeText("应声器更新次数:"+this.count,  null,  null);
                                writer.endElement("div");
                                writer.endInsert();
                                writer.endDocument();
                                writer.flush();
                                ctx.responseComplete();
                        }  catch  (Exception  e)  {
                                throw  new  FacesException(e);
                        }
                }
        }
         
        public  void  deleteCount()  {
                FacesContext  ctx  =  FacesContext.getCurrentInstance();
                ExternalContext  extContext  =  ctx.getExternalContext();
                if  (ctx.getPartialViewContext().isAjaxRequest())  {
                        try  {
                                PartialResponseWriter  writer  =
                                            ctx.getPartialViewContext().getPartialResponseWriter();
                                extContext.setResponseContentType("text/xml");
                                extContext.addResponseHeader("Cache-Control",  "no-cache");
                                writer.startDocument();
                                writer.delete("before");
                                writer.endDocument();
                                writer.flush();
                                ctx.responseComplete();
                        }  catch  (Exception  e)  {
                                throw  new  FacesException(e);
                        }
                }
        }

此两个方法从字面上理解来,一个是来给页面加入元素,一个是删除页面上的一个元素。可以在浏览器中输入http://localhost:8088/TestJsf2.0/echo.xhtml看看运行效果。这儿很容易就改变了页面的元素,不需要你写任何Ajax代码。所有的代码都采用java编写,调试等工作都会变得容易。

再来解释一下bean中的Partial  Response,这是在JSF2.0中新引入的生命周期模型,字面意思就是局部请求返回,也就是局部更新,正好与Ajax提倡的理念配合的天衣无缝。

具体的f:ajax标签的解释可以参考 https://javaserverfaces.dev.java ... 0/pdldocs/facelets/,另外针对Partial  Response的解释限于篇幅和本文的性质就暂时告一段落,想了解更多我们可以再开篇幅讨论。

至此,关于JSF2.0中引入的最大的两个改变就介绍完了,我们也初步了解了JSF2.0开发的便捷与优雅之处。以后针对更多的特性以及更深入的话题,我们可以多多探讨,当然,在应用中肯定还会碰到JSF2.0的不足之处,我们也可以一起讨论。

来自: http://www.leefn.com/story/view/24.xhtml
JSF将是J2EE5.0中所包含的web开发框架,这应该是第一个成为jcp标准,并且随j2eesdk一起发布的web框架,可以看出sun对它的期望很高。JSF最大的竞争对手是tapestry,是apache的产品,但是apache又弄出了个myfaces,是对jsf标准的一个实现。也许你也和我一样,在jsf和tapestry之间犹豫很久,将来从apache的态度上应该可以看出二者的走向。在tss上有一篇比较jsf 1.0tapestry 3.0的文章,内容很扎实到位:http://www.theserverside.com/articles/article.tss?l=JSFTapestry JSF的竞争对手不是struts/webwork之流,它们基本上已经是不同阶段上的东西了,放在一起比较意义不大。 JSF的开发流程和asp.net中所倡导的code behind方式很相似,核心是事件驱动,组件和标签的封装程度非常高,很多典型应用已经不需要开发者去处理http。页面操作会被自动映射到对应的java bean中,后台逻辑只需要同java bean发生交互。整个过程是通过“依赖注入(DI)”来实现的,看来这是目前解偶合的最佳途径啊,spring的影响真是深远。不过正式因为jsf采用了这样的方式,导致开发工作和以前的jsp/struts等都有非常大的不同,需要一定的时间去学习。学习之前建议先对依赖注入有比较清楚的认识,可以参考我的learn Spring in spring系列的第一篇。 本系列将以两个例子来讲解jsf的基本开发,第一个例子当然是hello world。目前可用的jsf ide不多,ibm要到06年才能放出支持jsf的wtp版本。所以我们的例子基本以手写为主,这样也能让我们有更清楚的认识,同时推荐目前最好的jsf开发工具:myeclipse 4.0 GA。后面的例子将会有jsf和hibernate的内容,它都能给予很好的支持。由于myeclipse并不免费,所以我们除了讲解在ide中如何操作外,还会叙述手动操作的具体内容,以免过于依赖开发工具。用什么服务器都可以,这里采用了jboss 4.0.2。如果你的服务器是高版本的tomcat(5.5+),那么必须要删除它自带的一些包才能很好的支持jsf,具体细节请查看它的文档。 请自行下载jsf ri和JSTL 1.1。 废话少说,开始了。 在myeclipse 4.0GA中新建一个web项目,命名为hello,为项目增加对JSTL的支持: 在JSTL的版本中选择1.1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值