RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
在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> 文章转载:<a href="http://www.jxjierui.cn/article/coihpsh.html">http://www.jxjierui.cn/article/coihpsh.html</a> </div> <div class="hot_new"> <div class="page_title clearfix"> <h3>其他资讯</h3> </div> <div class="news_list clearfix"> <ul> <li> <a href="/article/ccciddi.html">icp备案需要多久?(icp备案需要多久时间)</a> </li><li> <a href="/article/cccidec.html">React中常见的八个错误,如何避免?</a> </li><li> <a href="/article/cccioje.html">想入手一款能打游戏的笔记本电脑?(5000左右能配一台什么配置的电脑?)</a> </li><li> <a href="/article/cccidsp.html">深入理解Redis中的DB分区(redis里面分db)</a> </li><li> <a href="/article/cccidid.html">Kubernetes和Docker容器的存储方式是什么</a> </li> </ul> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> </div> <!-- 底部信息 --> <div class="footer wow fadeInUp"> <div class="rowFluid"> <div class="span12"> <div class="container"> <div class="footer_content"> <div class="span4 col-xm-12"> <div class="footer_list"> <div class="span6"> <div class="bottom_logo"><img src="/Public/Home/images/ewm.jpg" alt="微信服务号二维码" /></div> </div> <div class="span6 col-xm-12"> <div class="quick_navigation"> <div class="quick_navigation_title">快速导航</div> <ul> <li><a href="http://www.gddkgd.com/" title="gddkgd.com" target="_blank">gddkgd.com</a></li><li><a href="https://www.cdcxhl.com/weihu/chengdu.html" title="成都企业网站维护" target="_blank">成都企业网站维护</a></li><li><a href="http://www.kmjierui.cn/" title="柔性防护网" target="_blank">柔性防护网</a></li><li><a href="http://www.wiunq.com/" title="电子产品" target="_blank">电子产品</a></li><li><a href="http://www.dfbanj.cn/" title="dfbanj.cn" target="_blank">dfbanj.cn</a></li><li><a href="http://www.cdxwcx.cn/tuoguan/guanghua.html" title="光华服务器托管" target="_blank">光华服务器托管</a></li><li><a href="http://www.cdhxlkj.com/" title="翻译公司" target="_blank">翻译公司</a></li> </ul> </div> </div> </div> </div> <div class="span4 col-xm-6 col-xs-12"> <div class="footer_list"> <div class="footer_link"> <div class="footer_link_title">友情链接</div> <ul id="frientLinks"> <a href="https://www.cdcxhl.com/" title="网站制作" target="_blank">网站制作</a> <a href="https://www.cdcxhl.com/" title="网站建设" target="_blank">网站建设</a> <a href="https://www.cdxwcx.com/tuiguang/" title="成都网络推广" target="_blank">网络推广</a> <a href="http://seo.cdkjz.cn/" title="成都网站推广" target="_blank">网站推广</a> <a href="https://www.cdcxhl.com/xiaochengx.html" title="成都微信小程序开发" target="_blank">小程序开发</a> <a href="https://www.cdcxhl.com/menu.html" title="创新互联网站栏目导航" target="_blank">网站导航</a> </ul> <div class="footer_link_title">网站建设</div> <ul id="frientLinks"> <li><a href="/">内江浩晨众云建站</a></li> <li><a href="https://www.cdcxhl.com/menu.html" title="创新互联网站栏目导航" target="_blank">网站导航</a></li> </ul> </div> </div> </div> <div class="span4 col-xm-6 col-xs-12"> <div class="footer_list"> <div class="footer_cotact"> <div class="footer_cotact_title">联系方式</div> <ul> <li><span class="footer_cotact_type">企业:</span><span class="footer_cotact_content">青羊区浩晨众云设计工作室(个体工商户)</span></li> <li><span class="footer_cotact_type">地址:</span><span class="footer_cotact_content">成都市青羊区太升南路288号</span></li> <li><span class="footer_cotact_type">电话:</span><span class="footer_cotact_content"><a href="tel:18980820575" class="call">18980820575</a></span></li> <li><span class="footer_cotact_type">网址:</span><span class="footer_cotact_content"><a href="/" title="内江网站建设">www.jxjierui.cn</a></span></li> </ul> </div> </div> </div> </div> </div> <div class="copyright"> <p>公司名称:青羊区浩晨众云设计工作室(个体工商户) 联系电话:18980820575</p> <p><a href="http://beian.miit.gov.cn" target="_blank" rel="nofollow">网站备案号:蜀ICP备2025119795号-2</a></p> <p>内江浩晨众云建站 内江网站建设 内江网站设计 内江网站制作 <a href="http://www.cdxwcx.cn/" target="_blank">成都做网站</a></p> </div> </div> </div> </div> </body> </html> <script> $(".technical_support_box_z_info_box 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>