我在同时验证两个输入时遇到问题。
在我的验证器中,我需要来自两者的数据:
<h:selectOneListbox>
<h:inputText>
这个想法是检查送货人员是否可以到达地址。在验证期间,我向 DB 发出请求。并寻找 streetName + houseNumber 的组合。
这是我的 JSF 页面的一部分。
<h:form>
<p>
<h:outputLabel for="streetsList" value="Street"/>
<h:selectOneListbox id="streetsList" binding="#{theStreetsList}"
size="1" value="#{makeOrder.streetName}" required="true">
<f:selectItems value="#{locationView.streetNames}" var="streetName"
itemLabel="#{streetName}" itemValue="#{streetName}"/>
</h:selectOneListbox>
</p>
<p class="address_details">
<h:outputLabel for="houseInput" value="#{msgs.house}"/>
<h:inputText id="houseInput" class="tab_input house_input"
value="#{makeOrder.house}" required="true">
<f:validator validatorId="AddressValidator" />
<f:attribute name="street" value="#{theStreetsList}" />
<f:ajax event="blur" execute="streetsList houseInput" render="m_houseInput" />
</h:inputText>
<h:message id="m_houseInput" for="houseInput" style="color:red" />
<h:outputLabel for="flatInput" class="flat_label" value="#{msgs.flat}"/>
<h:inputText class="tab_input flat_input" value="#{makeOrder.flat}"/>
</p>
</h:form>
这是我班级的验证方法:
@Override
public void validate(FacesContext context, UIComponent component, Object value)
throws ValidatorException {
String house = (String) value;
UIInput streetsComponent = (UIInput) component.getAttributes().get("street");
String streetName = (String) streetsComponent.getSubmittedValue();
Street orderStreet = this.findStreetInDB(streetName, house);
if (orderStreet.getName().equals("dummyStreet")) {
// Show error
FacesMessage msg = new FacesMessage(
"Unfortunately we do not deliver to this address, yet.");
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(msg);
}
}
我的问题String streetName
是null
。
该元素的PS值渲染得很好。如果我不使用验证,我什至可以提交表单。
- 我究竟做错了什么?
- 这样做的正确方法是什么?
谢谢!