美图齐众专注资阳网站设计 资阳网站制作 资阳网站建设
资阳网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

在JavaEE6中使用JSF2.0简化页面制作

【精选译文】过去几个星期,对Java EE 6的新特性进行了一系列介绍。除了Servlet 3.0的特性,Java EE 6也使用了新的JSF 2.0标准。下面我们来看一看JSF 2.0是如何简化页面制作并提供Ajax支持的。***,我们对Servlet 3.0和JSF 2.0的新特性进行了总结。

简化JSF 2.0页面制作

JavaServer Faces技术提供了一个服务端组件框架,简化了Java EE应用程序用户界面的开发,其中最显著的改进是页面制作,通过使用标准的JavaServer Faces视图声明语言(JavaServer Faces View Declaration Language,俗称Facelets)创建一个JSF页面更加容易。

Facelets

Facelets是一个强大的轻量级声明语言,可以使用它展示一个JSF页面,使用Facelets时,你可以使用HTML风格的模板展示一个JSF页面,也可以构建一个组件树,JSF应用程序中的用户界面通常是由JSF组件构成的JSF页面,Facelets在JSP之上提供了更多优点。

在JSP中,Web页面中的元素是按照渐进顺序处理和渲染的,而JSF提供了它自己的处理和渲染顺序,这可能会导致不可预测的行为发生,Facelets解决了这个问题,通过模板,Facelets也允许代码复用,可以大大减少开发UI的时间,现在Facelets已经成为构建JSF应用程序的***技术。

Facelets通常是使用XHTML标记语言编写的,因此Facelets是可以跨不同开发平台的,下面是Java EE 6教材中提供的JSF页面的Facelets XHTML代码部分:

 
 
 
 
  1.  
  2.            
  3.            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  4.    
  5.            xmlns:f="http://java.sun.com/jsf/core" 
  6.            xmlns:h="http://java.sun.com/jsf/html" 
  7.            xmlns:ui="http://java.sun.com/jsf/facelets"> 
  8.     
  9.            Guess Number JSF Application 
  10.     
  11.     
  12.        
  13.        

     

  14.        Hi. My name is Duke. I am thinking of a number from  
  15.                to  
  16.                  
  17.        .  
  18.        

     

  19.          Can you guess it ?  
  20.        

     
  21.         
  22.        
  23.              value="#{UserNumberBean.userNumber}"> 
  24.           converterMessage="#{ErrMsg.userNoConvert}"> 
  25.        
  26.              minimum="#{UserNumberBean.minimum}" 
  27.              maximum="#{UserNumberBean.maximum}"/> 
  28.         
  29.        
  30.              action="success" value="submit" /> 
  31.        
  32.                   style="color: red;  
  33.                    font-family: 'New Century Schoolbook', serif;  
  34.                    font-style: oblique;  
  35.                    text-decoration: overline"  
  36.                    id="errors1" 
  37.                    for="userNo"/> 
  38.         
  39.        
  40.     
  41.     
  42.  

页面渲染效果如图1所示。

 
图 1 使用Facelets创建的用户界面

这个Facelets XHTML页面和普通JSP页面并没有多大不同,Facelets支持JSF和JSTL标签库,它也包括一个Facelets标签库,支持功能丰富的页面模板。命名空间声明xmlns:ui="http://java.sun.com/jsf/facelets"就是针对facelets标签库的,但这里没有使用facelets标签库的标签,facelets也支持统一的表达式语言。

模板

使用模板,你可以创建一个页面作为应用程序中其它页面的模板,这样可以避免多次创建结构类似的页面,同时也可以统一应用程序中多个页面的视觉风格。

Facelets标签库包括一个模板标签,为了实施模板化,首先创建一个包括标签的模板页面,然后创建一个使用这个模板的客户端页面,在客户端页面中,使用标签指定模板,使用标签指定插入到模板中的内容。

下面是一个模板页面的内容:

 
 
 
 
  1.  
  2.    
  3.    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  4.  
  5.    
  6.          xmlns:ui="http://java.sun.com/jsf/facelets" 
  7.          xmlns:h="http://java.sun.com/jsf/html" 
  8.  
  9.        
  10.          <ui:insert name="title">Page Title</ui:insert 
  11.        
  12.        
  13.           
     
  14.                
  15.           
 
  •           
     
  •                
  •          
  •  
  •        
  •     
  •  
  • 下面是使用这个模板的客户端页面代码:

     
     
     
     
    1.  
    2.     
    3.  
    4.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    5.  
    6.     
    7.           xmlns:ui="http://java.sun.com/jsf/facelets" 
    8.           xmlns:h="http://java.sun.com/jsf/html" 
    9.       
    10.         
    11.            This text will not be displayed.  
    12.             
    13.                Welcome page  
    14.             
    15.             
    16.                ... [Links should be here]  
    17.             
    18.             
    19.                ... [Data should be here]  
    20.             
    21.         
    22.            This text also will not be displayed.  
    23.       
    24.      

    当客户端调用这个模板时,它使用标题Welcome Page渲染这个页面,这个页面显示了两部分内容,一个显示客户端中指定的链接列表,另一个显示客户端中指定的数据。

    混合组件

    混合组件时JSF中的一个新特性,通过它创建自定义JSF组件会更加容易。你可以使用JSF页面标记和其它JSF组件创建混合组件。在Facelets的标注下,任何XHTML页面都可以变成一个混合组件。此外,混合组件可以有验证器,转换器和监听器。

    创建好混合组件后,你可以将它保存到库中,以后有需要时就可以调用了。

    让我们创建一个渲染为登录面板的混合组件,用户登录时,组件反馈一个登录事件,如图2所示。

     
    图 2 登录面板混合组件

    下面是混合组件的源代码:

     
     
     
     
    1.    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    2.    
    3.       xmlns:h="http://java.sun.com/jsf/html" 
    4.       xmlns:f="http://java.sun.com/jsf/core"> 
    5.       xmlns:f="http://java.sun.com/jsf/facelets"> 
    6.       xmlns:composite="http://java.sun.com/jsf/composite"> 
    7.  
    8.     
    9.    This content will not be displayed in the rendered output 
    10.     
    11.  
    12.     
    13.      
    14.             
    15.      
    16.      
    17.       
    18.     
    19.  
    20.        
    21.  
    22.     
    23.  
    24.     
    25.  
    26.        
    27.  
    28.     
    29.  
    30.     
    31.  
    32.        
    33.  
    34.     
    35.  
    36.      
    37. Username:   
      Password: 
       
    38.      
    39.     
    40.     
    41.  

    xmlns:composite="http://java.sun.com/jsf/composite"声明了混合UI组件的命名空间,标签声明混合组件的使用契约,标签在使用契约中指定标签,这个表示组件可以暴露一个事件,让使用这个混合组件的页面可以轻松访问它。
    标签定义了混合组件的实现,这里的实现是一个简单的表,它包括用户名、密码和登录按钮JSF组件。

    为了让混合组件可用,将代码保存为XHTML文件,将文件放到应用程序根目录下resources目录的子目录中即可。子目录的名字可以采用包含混合组件的资源库名字,JSF运行时通过向混合组件的标签名后追加.xhtml后缀查找混合组件。例如,如果你将标签命名为loginPanel,那么保存为混合组件的文件名就是loginPanel.xhtml。然后你就可以在Web页面中使用混合组件了,下面就是一个使用混合组件的Web页面代码示例:

     
     
     
     
    1.    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
    2.    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    3.    
    4.       xmlns:h="http://java.sun.com/jsf/html" 
    5.       xmlns:f="http://java.sun.com/jsf/core" 
    6.       xmlns:ui="http://java.sun.com/jsf/facelets" 
    7.       xmlns:ez="http://java.sun.com/jsf/composite/ezcomp"> 
    8.  
    9.     
    10.    Example 01>/title> </li> <li>   <style type="text/css"> </li> <li>   .grayBox { padding: 8px; margin: 10px 0; border: 1px solid #CCC; background-color: #f9f9f9;  }  </li> <li>   </style> </li> <li>   </h:head> </li> <li> </li> <li>   <h:body> </li> <li>     <p>Usage of Login Panel Component</p> </li> <li> </li> <li>        <ui:debug hotkey="p" rendered="true"/> </li> <li> </li> <li>     <h:form> </li> <li>         <div id="compositeComponent" class="grayBox" style="border: 1px solid #090;"> </li> <li>            <ez:loginPanel> </li> <li>                <f:actionListener for="loginEvent" type="example01.LoginActionListener" /> </li> <li> </li> <li>            </ez:loginPanel> </li> <li>         </div> </li> <li>     <p><h:commandButton value="reload" /></p> </li> <li> </li> <li>     <p><h:outputText value="#{loginActionMessage}" /></p> </li> <li>     </h:form> </li> <li> </li> <li>   </h:body> </li> <li>   </html> </li> <li> </li> </ol></pre><p>注意声明xmlns:ez="http://java.sun.com/jsf/composite/ezcomp",它指定了混合组件的命名空间和前缀,这里的ezcomp是资源目录的子目录名,JSF使用下面的约定:所有命名空间URI都以http://java.sun.com/jsf/composite/开头,使用资源库的名称结束。</p><p><strong><f:actionListener></strong></p><p>标签关联混合组件的行为监听器,标签中的for属性表示这个监听器是为混合组件上名为loginEvent行为事件准备的,你需要编写代码来处理事件,例如:</p><pre> <ol> <li>import javax.faces.component.UIComponent;  </li> <li> import javax.faces.component.ValueHolder;  </li> <li> import javax.faces.context.FacesContext;  </li> <li> import javax.faces.event.AbortProcessingException;  </li> <li> import javax.faces.event.ActionEvent;  </li> <li> import javax.faces.event.ActionListener;  </li> <li> </li> <li> public class LoginActionListener implements ActionListener {  </li> <li> </li> <li>     public void processAction(ActionEvent event) throws AbortProcessingException {  </li> <li>         FacesContext context = FacesContext.getCurrentInstance();  </li> <li>         context.getExternalContext().getRequestMap().put("loginActionMessage",  </li> <li>                 "Login event happened");  </li> <li>     }  </li> <li> }  </li> </ol></pre><p>#p#</p><p><strong>JSF 2.0对Ajax的支持</strong></p><p>JSF 2.0天生就支持Ajax,利用Ajax技术,Web应用程序在后台以异步的方式从服务器获取数据。支持Ajax后,允许页面局部刷新,允许选择视图中的一个组件进行处理而不影响其它组件。</p><p>要在JSF中使用Ajax,需要访问有资源标识符的JavaScript资源jsf.js,它存在于javax.faces资源库中,包含让JSF与Ajax交互的JavaScript API,JavaScript API由一组标准的JavaScript函数组成,使JavaServer Faces框架中的Ajax操作变得简单了,你几乎不用直接包括这个文件,当你使用任何开启Ajax的标签或组件时,JSF会自动包括它。然后你就可以使用<f:ajax>标签或调用JavaScript API中的函数了。</p><p>下面是一个使用<f:ajax>标签的示例:</p><pre> <ol> <li><h:commandButton id="button1"> </li> <li>      <f:ajax execute="..." render="..."/> </li> <li>   </h:commandButton> </li> <li> </li> </ol></pre><p>这里的<f:ajax>标签是嵌套在<h:commandButton>标签内的,这样会结合在execute属性中指定的Ajax行为和<h:commandButton>标签呈现的命令按钮,你也可以指定一个event属性来识别JavaScript DOM事件,如果你不指定event属性,JSF使用组件的默认行为,这里的默认行为是onclick,因此JSF结合execute属性中指定的Ajax请求和呈现按钮的onclick事件。用户点击该按钮时,JSF提交Ajax请求给服务器。</p><p>使用<f:ajax>标签的一个好处是不用在页面中指定载入jsf.js,它会自动为你载入,相比之下,如果你调用JavaScript API,首先需要使用<h:outputScript>让jsf.js对当前视图可用,例如:</p><pre> <ol> <li><f:view contentType="text/html"/> </li> <li>     <h:head> </li> <li>       <meta... </li> <li>       <title... </li> <li>     </h:head> </li> <li>     <h:body> </li> <li>       ...  </li> <li>       <h:outputScript name="jsf.js" library="javax.faces" target="body"/> </li> <li>       ...  </li> <li>     </h:body> </li> <li>     ...  </li> <li> </li> </ol></pre><p>然后才可以使用JavaScript API中的函数产生Ajax请求。例如,你使用JavaScript函数jsf.ajax.request向服务器发送一个请求,如下面的代码:</p><pre> <ol> <li><h:commandButton id="button1" value="submit"> </li> <li>   onclick="jsf.ajax.request(this,event);" /> </li> <li> </li> </ol></pre><p>代码包括一个<h:commandButton>标签,它呈现为一个按钮,用户点击这个按钮时,向服务器提交一个Ajax请求。</p><p><strong>Servlet 3.0和JSF2.0中的更多新特性</strong></p><p>Servlet 3.0中另一个新特性是允许你使用ServletContext类中的方法通过编程在Web应用程序启动时向其添加Servlet和Servlet过滤器,使用addServlet()方法添加Servlet,使用addFilter()添加Servlet过滤器。结合可插拔式共享框架特性,Web框架可以在无开发人员介入的情况下实现自我配置。</p><p>#t#此外Servlet 3.0加入了许多安全特性,除了声明安全外,Server 3.0通过HttpServletRequest接口提供了编程安全,例如,你可以在应用程序中使用HttpServletRequest的authenticate()方法执行用户名和密码的收集,或者使用login()方法指向容器验证一个非强制请求上下文中的请求调用者。有关Servlet 3.0的更多特性,请参阅JSR 315规范。</p><p>JSF 2.0中的一些额外增强与资源如何打包和处理有关,JSF 2.0标准化了打包哪里的资源。所有资源都放在resources目录或一个子目录下,资源需要按顺序正确地进行渲染,例如CSS文件和JavaScript文件,图3显示了Netbeans中的一个JSF项目部分结构及文件,注意其中的resources目录,CSS和images目录。</p><p> <br /> 图 3  JSF应用程序中resources目录下的资源</p><p>JSF 2.0也包括显示和处理资源的API,使用javax.faces.application.Resource类显示一个资源,使用javax.faces.application.ResourceHandler类创建资源的实例。有关JSF 2.0的更多信息,请参阅JSR 314规范。</p><p>【译稿,非经授权请勿转载。合作站点转载请注明原文译者和出处为,且不得修改原文内容。】</p><p>原文:Introducing the Java EE 6 Platform 作者:Ed Ort</p> <br> 分享文章:在JavaEE6中使用JSF2.0简化页面制作 <br> 网站URL:<a href="http://www.zsjierui.cn/article/coihpsh.html">http://www.zsjierui.cn/article/coihpsh.html</a> </div> </div> <div class="other"> <h3>其他资讯</h3> <ul> <li> <a href="/article/coooehe.html">如何在linux服务器上创建新用户(linux服务器上创建用户名)</a> </li><li> <a href="/article/coooidg.html">如何选择服务器配置</a> </li><li> <a href="/article/coooios.html">Windowsxp如何破解开机密码?windowsxp破解版</a> </li><li> <a href="/article/coooisi.html">如何解决PPT中无法保存字体的问题</a> </li><li> <a href="/article/coooejc.html">福怎么拼?(福怎么拼)</a> </li> </ul> </div> </div> <footer> <div class="message"> <div class="mess container"> <p>免费获取网站建设与品牌策划方案报价</p> <span>*主要业务范围包括:高端网站建设, 集团网站建设(网站建设网站制作)找网站建设公司就上美图齐众。</span> <form action=""> <input type="text" class="ipt1" placeholder="联系人"> <input type="text" class="ipt2" placeholder="联系电话"> <textarea name="" id="" placeholder="内容描述:描述您的需求,如网站、微信、电商、APP等。"></textarea> <a href="">提交需求</a> </form> </div> </div> <div class="footA"> <div class="footAs container"> <ul> <h3>联系我们</h3> <b>028-86922220</b> <li>手机:13518219792</li> <li>地址:成都市太升南路288号锦天国际A幢1002号</li> <li class="hr1"></li> <li>24小时服务热线:028-86922220</li> </ul> <ul> <h3>网站建设服务</h3> <li>网页设计</li> <li>网站制作</li> <li>网站开发</li> </ul> <ul> <h3>网站推广服务</h3> <li>营销网站建设</li> <li>百度快速排名</li> <li>整站网站推广</li> </ul> <ul> <h3>网站运维服务</h3> <li>基础维护</li> <li>网站改版</li> <li>网站维护</li> </ul> <ul> <h3>FOLLOW US</h3> <li class="hr2"></li> <li> <dd class="fl"><img src="/Public/Home/img/ewm.png" alt=""><p>微信二维码</p></dd> <dd class="fr"><img src="/Public/Home/img/ewm.png" alt=""><p>微信二维码</p></dd> </li> </ul> </div> <div class="link container"> 友情链接: <a href="http://www.hyruijie.cn/" title="泸州网站建设" target="_blank">泸州网站建设</a>   <a href="http://www.yzsxq.com/" title="yzsxq.com" target="_blank">yzsxq.com</a>   <a href="https://www.cdcxhl.com/case/dfjg.html" title="东电技改" target="_blank">东电技改</a>   <a href="http://seo.cdkjz.cn/yingxiao/" title="网站优化公司" target="_blank">网站优化公司</a>   <a href="http://www.cdxwcx.cn/tuoguan/" title="成都主机托管" target="_blank">成都主机托管</a>   <a href="http://www.cdhuace.com/baozhuang.html" title="成都包装设计公司" target="_blank">成都包装设计公司</a>   <a href="http://www.dywxfdj.com/" title="大英维修发电机公司" target="_blank">大英维修发电机公司</a>   <a href="http://www.baojingtc.cn/" title="塑料检查井" target="_blank">塑料检查井</a>   <a href="http://chengdu.cdxwcx.cn/" title="成都网站制作" target="_blank">成都网站制作</a>   <a href="http://www.cxjianzhan.com/" title="成都网站制作" target="_blank">成都网站制作</a>    </div> </div> <div class="footB"> <div class="container"> <div class="fl"> Copyright © 2025 资阳站青羊区美图齐众设计工作室(个体工商户) 资阳网站建设公司-选网站建设公司美图齐众!专业的网站制作公司! </div> <div class="fr"> All Rights Reserved 版权所有 <a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">蜀ICP备2025119604号-1</a> </div> </div> </div> </footer> </body> </html> <script> $(".con img").each(function(){ var src = $(this).attr("src"); //获取图片地址 var str=new RegExp("http"); var result=str.test(src); if(result==false){ var url = "https://www.cdcxhl.com"+src; //绝对路径 $(this).attr("src",url); } }); window.onload=function(){ document.oncontextmenu=function(){ return false; } } </script>