在我的应用程序中,我在城市 (A) 和邮政编码 (B) 之间建立了关系。
所以我有两个 SelectOneMenu,其中第一个代表 A,第二个代表通过 ajax 更新的选定 A 的 B。
因为我多次使用这两个菜单,所以我为它们编写了一个自定义标签,只要将 A 和 B 值分配给我的会话 bean 中的现有变量,它通常可以正常工作。
但是在某些情况下,我想将一个新的关系对象传递给我的 bean,该对象不使用标记组件工作。
我想作为参数传递给我的逻辑会话 bean 的 add 方法的新请求范围 AToB 对象的属性 A 和 B 为空!
*附加说明
- 将标签组件与现有会话 bean 变量一起使用是可行的。
- 使用标签组件添加新的基于请求 bean 的关系对象不起作用。
- 选择的 A 总是(在情况 1 和 2 中)使用 ajax 更改事件正确传递给 bean。
- SelectOneMenu 的转换器始终有效。(在调试模式下测试)
- 使用标签组件 JSF 从不调用 setter 来设置新 AToB 对象的 A 和 B,在调试模式下进行了测试。
- 使用 jsf 默认 h:commandButton 而不是 primefaces 会产生相同的错误。
- 不使用标签组件也能完美运行!
环境:
Mojarra 2.14
GlassFish 3.01
我简化了删除构造函数和 getter & setter 的类。
DTO,波乔:
public Class A{}
public Class B{}
public Class AToB
{
private A a;
private B b;
}
会话 Bean:
public Class Bean
{
private List<A> as;
private List<B> bs;
private AConverter aConverter;
private BConverter bConverter;
//updates bs list
public void updateBsByA(AjaxBehaviorEvent event) {}
//does something with the given AToB
public void add(AToB aToB)
}
面孔-config.xml:
<managed-bean>
<managed-bean-name>beanLogic</managed-bean-name>
<managed-bean-class>package.Bean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<description>new AToB Object I want to add at database</description>
<managed-bean-name>newAToB</managed-bean-name>
<managed-bean-class>package.Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
abSelect 标记文件:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:abcd="http://store24.de/jsf/admin">
<h:selectOneMenu value="#{tagA}" converter="#{beanLogic.aConverter}">
<f:selectItems value="#{beanLogic.as}"/>
<p:ajax event="change" listener="#{beanLogic.updateBsByA}" update="selectB"/>
</h:selectOneMenu>
<h:selectOneMenu id="selectB" value="#{tagB}" converter="#{beanLogic.bConverter}">
<f:selectItems value="#{beanLogic.bs}"/>
</h:selectOneMenu>
</ui:composition>
abcd.taglib.xml
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://abcd.com/jsf</namespace>
<tag>
<tag-name>abSelect</tag-name>
<source>tags/abSelect.xhtml</source>
<attribute>
<display-name>a</display-name>
<name>tagA</name>
<required>true</required>
<type>package.A</type>
</attribute>
<attribute>
<display-name>a</display-name>
<name>tagB</name>
<required>true</required>
<type>package.B</type>
</attribute>
</tag>
</facelet-taglib>
调用站点:
<abcd:abSelect a="#{newAToB.a} b="#{newAToB.b}"/>
<p:commandButton value="add" action="#{beanLogic.add(newAToB)}"/>
而是添加一个没有标签组件的新 AToB (见上面的#2)
<h:selectOneMenu value="#{newAToB.a}" converter="#{beanLogic.aConverter}">
<f:selectItems value="#{beanLogic.as}"/>
<p:ajax event="change" listener="#{beanLogic.updateBsByA}" update="selectB"/>
</h:selectOneMenu>
<h:selectOneMenu id="selectB" value="#{newAToB.b}" converter="#{beanLogic.bConverter}">
<f:selectItems value="#{beanLogic.bs}"/>
</h:selectOneMenu>
<p:commandButton value="add" action="#{beanLogic.add(newAToB)}"/>