【问题标题】:Using the same page for creating and editing in JSF 1.2 (Facelets)在 JSF 1.2 (Facelets) 中使用同一页面进行创建和编辑
【发布时间】:2011-07-15 19:19:21
【问题描述】:

假设我有一个 XHTML 页面,其中包含一个用于创建用户的表单。有所有必要的字段和一个“保存”按钮。现在在我的应用程序的其他地方有一个编辑用户信息的选项。我想重复使用同一页面来执行此操作。但是怎么做?如何将用户信息传递到该页面以及如何更改“保存”操作以导航到我想要的页面?我正在寻找一个干净的解决方案(最佳实践?),而不是任何肮脏的解决方案。

【问题讨论】:

    标签: jsf facelets


    【解决方案1】:

    您可以将输入字段放在 Facelet 标记文件中。基本启动示例:

    /tags/user.xhtml

    <ui:composition 
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets"
    >
        <h:outputLabel for="name" value="Name" />
        <h:inputText id="name" value="#{user.name}" />
        <h:message for="name" />
        <br />
        <h:outputLabel for="email" value="Email" />
        <h:inputText id="email" value="#{user.email}" />
        <h:message for="email" />
        <br />
        <h:outputLabel for="city" value="City" />
        <h:inputText id="city" value="#{user.city}" />
        <h:message for="city" />
    </ui:composition>
    

    /META-INF/user.taglib.xml中定义

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE facelet-taglib PUBLIC
        "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
        "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
    
    <facelet-taglib>
        <namespace>http://example.com/jsf/facelets</namespace>
        <tag>
            <tag-name>user</tag-name>
            <source>tags/user.xhtml</source>
        </tag>
    </facelet-taglib>
    

    你在/WEB-INF/web.xml注册如下

    <context-param>
        <param-name>facelets.LIBRARIES</param-name>
        <param-value>/META-INF/user.taglib.xml</param-value>
    </context-param>
    

    (注意,如果有多个,用分号;隔开)

    最后只需在您的主页模板中声明它。

    <ui:composition 
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:my="http://example.com/jsf/facelets"
        xmlns:ui="http://java.sun.com/jsf/facelets"
    >
        <h:form>
            <my:user user="#{register.user}" />
            <h:commandButton value="Create" action="#{register.create}" />
        </h:form>
    </ui:composition>
    

    <ui:composition 
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:my="http://example.com/jsf/facelets"
        xmlns:ui="http://java.sun.com/jsf/facelets"
    >
        <h:form>
            <my:user user="#{editor.user}" />
            <h:commandButton value="Save" action="#{editor.save}" />
        </h:form>
    </ui:composition>
    

    &lt;my:user&gt;user="#{whatever}" 属性成为标记文件中的#{user}(即它可以通过属性名称作为键使用)。

    【讨论】:

    • 感谢您的回答,它当然是正确的。我之前已经使用过自定义组件,但是它们仍然存在一个问题……我需要编写两页:一页用于编辑,一页用于创建用户。我正在寻找一个只写一页的干净解决方案。 BTW:有没有办法为 Facelet 组件指定接口?
    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多