【发布时间】:2011-07-15 19:19:21
【问题描述】:
假设我有一个 XHTML 页面,其中包含一个用于创建用户的表单。有所有必要的字段和一个“保存”按钮。现在在我的应用程序的其他地方有一个编辑用户信息的选项。我想重复使用同一页面来执行此操作。但是怎么做?如何将用户信息传递到该页面以及如何更改“保存”操作以导航到我想要的页面?我正在寻找一个干净的解决方案(最佳实践?),而不是任何肮脏的解决方案。
【问题讨论】:
假设我有一个 XHTML 页面,其中包含一个用于创建用户的表单。有所有必要的字段和一个“保存”按钮。现在在我的应用程序的其他地方有一个编辑用户信息的选项。我想重复使用同一页面来执行此操作。但是怎么做?如何将用户信息传递到该页面以及如何更改“保存”操作以导航到我想要的页面?我正在寻找一个干净的解决方案(最佳实践?),而不是任何肮脏的解决方案。
【问题讨论】:
您可以将输入字段放在 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>
<my:user> 的user="#{whatever}" 属性成为标记文件中的#{user}(即它可以通过属性名称作为键使用)。
【讨论】: