• JSF的ui标签


    在使用自己的tag时,首先需要在web.xml里面进行注册,注册方式是在web.xml开头加上:

     <context-param>
            <param-name>facelets.LIBRARIES</param-name>
            <param-value>/WEB-INF/facelet-taglibs/echo.taglib.xml</param-value>
        </context-param>
    并且tag的模版都要在WEB-INF目录下,不然就会找不到
    然后是开始定义这个tag, 建立/WEB-INF/facelet-taglibs/echo.taglib.xml
    <?xml version="1.0"?>
    <!DOCTYPE facelet-taglib PUBLIC
    "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
    "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">

    <?xml version="1.0"?>
    <!DOCTYPE facelet-taglib PUBLIC
    "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
    "facelet-taglib_1_0.dtd">
    <facelet-taglib>
        <namespace>http://www.myfaces.com/facelets/tags</namespace>

    <tag>
       <tag-name>tree2</tag-name>
       <source>../../tree2.xhtml</source>
    </tag>

    <tag>
       <tag-name>datatable</tag-name>
       <source>../../datatable.xhtml</source>
    </tag>
    </facelet-taglib>
    注意的是, <source>tpl/echo.xhtml</source>, source标明的文件也要在WEB-INF里面.namespace可以随便命名, 这是给后来引用的.

    最后是/pages/myecho.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:tutorial="http://tutorial.facelets">
    <body>
    <tutorial:echo msg="#{param.message}"/>
    </body>
    </html>

     
     ui composition
    在web.xml添加context-param:

    <context-param> 
       <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
       <param-value>.xhtml</param-value> 
    </context-param>

           这里我们可以看到,我们之后使用的都将是xhtml而不是传统的jsp。

            在faces-config.xml里面声明view-handler:

    <application> 
       <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
    </application>

        那么当我们使用导航规则<navigation-rule>的时候,就会导航到.xhtml页面了。

        Ok,配置完成。

      二.如何使用facelet?

        facelet布局强大的地方就是使用了模板,这个模板是一个xhtml文件,我们需要在这个xhtml里面设置一些<ui:insert>,例如我们先建一个template.xhtml:

    <?xml version="1.0" encoding="UTF-8"?>

    <html xmlns=http://www.w3.org/1999/xhtml

             xmlns:ui="http://java.sun.com/jsf/facelets">

    <head><meta> http-equiv="Content-Type" content="text/html;charset=UTF-8"/>

    <title><ui:insert name="title">这里我们填写默认title</ui:insert></title>

    </head>

    <body>

    Hi,facelet<br/>

    <ui:insert name="content"></ui:insert>

    <body>

    </html>

    这个xhtml很容易理解,首先设置xmlns命名空间,就是jsp的<@taglib>,ui就相当于<@taglib>的prefix,值就相当于<@taglib>的uri。我们使用到了facelet的<ui:insert>标签。这个标签表示使用这个模板的页面需要扩展的位置,位置名就是name属性的值啦。如果使用模板的页面没扩展这个位置,那么就使用默认值。

    好,编写使用这个模板的页面composition.xhtml:

    <?xml version="1.0" encoding="UTF-8"?>

    <html xmlns=http://www.w3.org/1999/xhtml

             xmlns:ui="http://java.sun.com/jsf/facelets"

    xmlns:h="http://java.sun.com/jsf/html" 

    xmlns:f="http://java.sun.com/jsf/core">

    <body>

    <ui:composition template="template.xhtml">

    <ui:define name="content"><h:outputText value="我们在这里扩展content啦" /></ui:define >

    </ui:composition>

    <body>

    </html>

    这个页面你可以看到我添加了JSF的自定义标签声明,也就相当于声明了<@taglib>。

    然后ui:composition的template属性选择调用那个模板,ui:define的那么属性选择扩展哪个位置。

    在这个页面,我没有扩展title位置,仅仅扩展了content位置,然后输出h:outputText的值。

    Ok,测试一下,运行项目,然后去到composition.xhtml。

    我们会看到页面的title显示“这里我们填写默认title”

    页面里面则显示:

    Hi,facelet

    <ui:composition>是一个模版标签,它将一些可以被其他Facelets页面所包含的共有内容封装起来。
    该标签的属性:
    template  该属性不一定必需   意为:将在标签开始和结束之间显示的模版文件所在的路径
    <ui:composition> 指定使用那个模版文件,然后通过<ui:define>对模版文件中每个可以供插入的<ui:insert>锚点进行定义。

    在运行期,具体的内容将会被插入到<ui:composition> 中定义的锚点位置。 

    <ui:define>标签用于将命名的的内容插入到模版中,它在模版标签的(如:composition和decorate)内部使用,define的name属性必须和目标模版中的insert 的name属性相同。

    该标签的name属性必须有,必须和insert标签的name属性相同。

    define标签的内部的内容将插入到目标中的insert标签的name属性标签处,define标签外部内同将被忽略。

    insert标签用于模版中指点的插入点,该点将会被define标签的内容所替代。

    <ui:include>标签用来在文件中包含另一个facelets文件,它只要指定被包含的文件的位置,它就可以包含任何拥有<ui:component>或<ui:composition>等标签或简单的xhtml和xml代码片段文件。

     

    该标签有一个必须属性src 属性值可以为简单的的值或EL表达式,用来指定所包含的的facelets文件的位置。可以是相对路径也可以是绝对路径。

  • 相关阅读:
    【设计模式】6.模板方法模式
    【设计模式】5.原型模式
    【设计模式】4.工厂模式
    【设计模式】3.代理模式
    zookeeper集群的搭建
    zookeeper实现分布式锁的原理和一个小例子
    zookeeper配置管理实现原理----监听事件watch
    zookeeper的javaAPI操作(基于Curator的CRUD)
    java.lang.IllegalArgumentException: A HostProvider may not be empty!
    Zookeeper的安装和基本操作
  • 原文地址:https://www.cnblogs.com/lhfyy/p/4076815.html
Copyright © 2020-2023  润新知