我最近开始使用带有Facelets的JSF 2.0,并且对于了解<ui:include>Facelets 1.x提供的现有和其他模板技术的新复合组件感到困惑.
这些方法有什么区别?从功能上看,它们似乎提供了相同的:<ui:param>vs <cc:attribute>,<ui:insert>+ <ui:define>vs标记文件,重用现有模板.除了复合组件的语法和清晰的接口规范之外还有什么吗?性能会有所不同?
我想通过xml配置文件创建两个相同类的bean.该类有一个带有注释的setter,可以用spring填充.在其中一个bean定义中,我还手动提供值以覆盖注释中的一个.但是当我这样做时,弹簧不再处理注释布线.
这是一个演示此效果的最小代码,用于@Value简单,但它与以下内容相同@Autowired:
import org.springframework.beans.factory.annotation.Value;
import javax.annotation.PostConstruct;
public class AutowireTest {
public String testField;
@PostConstruct
public void init() {
if (testField == null)
throw new RuntimeException("FAIL");
}
@Value("default")
public void setTestField(String testField) {
this.testField = testField;
}
}
Run Code Online (Sandbox Code Playgroud)
和spring配置:
<bean id="au_test1" class="AutowireTest">
<property name="testField" value="manual"/>
</bean>
<bean id="au_test2" class="AutowireTest"/>
Run Code Online (Sandbox Code Playgroud)
如果我删除<property name="testField" value="manual"/>,两个bean都会收到"默认".如果它在那里第二个bean抛出一个异常.我查看了spring代码并AutowiredAnnotationBeanPostProcessor使用了injectMetadataCache,其中类是注入元数据的键,这意味着为一个bean设置特定属性会禁用其他实例的自动装配.
知道为什么会这样吗?如何才能实现类似的效果,不一定是字符串值,也适用于对象bean?
编辑:我希望有一个属性,有多个匹配的候选人.一个被标记为primary.除非我通过xml手动指定候选者,否则我希望将主要的候选者连接起来.我最初的方法是使用@Autowired这个属性,但由于这不起作用,我正在寻找替代方案.出于某种原因,我不想使用bean继承.
编辑2:如果我交换这两个bean定义,问题不会发生.该属性自动装配好,直到第一次检测到手动覆盖.这意味着,这不是一个intented功能,因为它会导致怪异,难以检测与预期不被有线依赖一些项目的bug.
我想动态选择一个facelet来渲染我的数据列表中的一些项目.第一次尝试将是:
<ui:repeat value="#{panels}" var="panel">
<ui:include src="#{panel.facelet}">
</ui:repeat>
但是因为ui的src所以它不会起作用:include太早评估了.facelet信息是真正动态的,所以我不能使用c:forEach(不是真的建议与facelets混合使用).我想这一切都归结为找到一个基于ui的组件:包括替代品.
是否有这样的事情或者我需要自己编写?
我有以下按钮:
<h:commandButton
disabled="#{mybean.searching}"
binding="#{mybean.searchButton}"
actionListener="#{mybean.searchForLicenses}"
value="Search" />
Run Code Online (Sandbox Code Playgroud)
当我调试时,我看到actionListener首先被调用两次,然后被调用三次,接下来单击四次,依此类推.
似乎每次重新加载时actionListener都会再次注册.
我正在使用Mojarra 2.1.3(也尝试过2.0.6)和Tomcat 7和IceFaces.
绑定是这样完成的:
private javax.faces.component.UICommand searchButton;
public void setSearchButton(UICommand searchButton) {
this.searchButton = searchButton;
}
public UICommand getSearchButton() {
return searchButton;
}
Run Code Online (Sandbox Code Playgroud)