这是我的Bean片段:
public class WaiterBean extends Connector
{
private String PIN;
private String name = null;
public void setPIN(String PIN)
{
this.PIN = PIN;
}
public String getPIN()
{
return PIN;
}
public String getName()
{
return name;
}
public String isPINCorrect(String PIN)
{
try
{
resultSet = statement.executeQuery(
"SELECT name FROM dbo.waiters WHERE PIN=" + PIN);
while(resultSet.next())
{
name = resultSet.getString("name");
}
}
catch (SQLException se)
{
System.out.println(se.getMessage() + "**"
+ se.getSQLState() + "**" + se.getErrorCode());
}
if(name == null)
return "invalid";
else
return "valid";
}
}
这是验证器bean:
public class PINValidator implements Validator
{
@Override
public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException
{
String PIN = o.toString();
if(PIN.length() < 4)
{
FacesMessage msg = new FacesMessage("PIN too short");
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(msg);
}
}
}
这就是我使用它的方式:
<h:form>
<h:panelGrid columns="2">
ENTER PIN
<h:inputText id="PIN" maxlength="4" size="4" value="#{waiterBean.PIN}">
<f:validator validatorId="com.jsf.PINValidator" />
</h:inputText>
</h:panelGrid>
<h:message for="PIN"/>
<br />
<h:commandButton value="SEND" action="#{waiterBean.isPINCorrect(waiterBean.PIN)}" />
<br />
</h:form>
一切正常,但我认为将isPINCorrect
方法包含在验证器类中是一种好习惯(我错了吗?)。我可以在验证器中实现该方法,但是我遇到了如何为WaiterBean
设置名称的问题,并且它是应用程序所需的。
我该如何解决这个问题?或者另一个问题,我是否应该尝试解决它?
答案 0 :(得分:2)
您可以从验证程序访问会话范围的托管bean,如下所示:
facesContext.getExternalContext().getSessionMap().get("waiterBean");
但我不认为这是您的最佳做法,因为验证者不应该修改数据,只应检查输入的有效性。在验证阶段,模型尚未更新的主要原因是,在验证器中修改bean会导致一些副作用。