我在自定义验证中使用这种方式我有点困惑,如果这种方式是正确的,如果我假设我有这种形式:
<h:form id="myForm>
<h:outputText value="user name" />
<h:inputText value="#userBean.userName" id="userName" />
<h:outputText value="Password" />
<h:inputText value="#userBean.Password" id="passwd" />
</h:form>
我有它的Managed Bean:
@ManagedBean(name="userBean")
@SessionScoped
public class UserBeanData{
private String userName;
private String password;
// with setters and getters........
//
}
和自定义验证器验证Managed Bean字段和Implmentation,如:
@Override
public validate(FacesContext context, UIComponent component, Object value) throws ValidatorException{
Map<String, String> params = context.getExternalContext().getRequestParametersMap();
String username = params.get("myForm:username");
String pass = params.get("myForm:passwd");
// validate : if fields are not null check if the user exists if the result is empty , throws a validation Message Error
}
我的问题是:检索这样的托管bean值是否真实????
答案 0 :(得分:1)
你基本上是在寻找错误方向的解决方案。验证仅适用于各个提交的值,例如最小/最大长度,非空/空,正则表达式等等。但是,您希望基于所有提交的值调用业务操作:登录用户。这不完全是输入验证。
只需将required="true"
添加到两个输入组件中,然后在操作方法中执行作业。
E.g。
<h:form id="myForm>
<h:outputText value="user name" />
<h:inputText value="#{userBean.userName}" id="userName" />
<h:message for="userName" />
<h:outputText value="Password" />
<h:inputSecret value="#{userBean.password}" id="passwd" />
<h:message for="passwd" />
<h:commandButton value="Login" action="#{userBean.login}" />
<h:messages globalOnly="true" />
</h:form>
与
@ManagedBean
@RequestScoped
public class UserBean {
private String userName;
private String password;
@EJB
private UserService service;
public String login() {
User user = service.find(userName, password);
if (user != null) {
FacesContext.getCurrentInstance().getExternalContext().getSessionMap("user", user);
return "home?faces-redirect=true";
} else {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Unknown login"));
return null;
}
}
// ...
}
答案 1 :(得分:0)
关注validate
方法的公司。它有一个UIComponent
参数,该参数是该方法验证的组件。此UIComponent
包含当前值(getValue()
)和用户提交的值(getSubmittedValue()
)。
您可能必须将UIComponent
强制转换为您正在验证的特定类型的组件(在这种情况下,它是UIInput
)。
现在,如果您要在登录前验证用户名和密码,有几种方法可以执行此操作。在您的情况下,验证带有密码字段的用户名字段作为添加的参数就足够了。你可以这样做:
<h:outputText value="user name" />
<h:inputText value="#userBean.userName" id="userName" validator="#{yourBean.validateLogin}">
<f:attribute name="pass" value="#{passwordField}" />
</h:inputText>
<h:outputText value="Password" />
<h:inputText value="#userBean.Password" id="passwd" binding="#{passwordField}"/>
请注意,密码binding
中的<h:inputText/>
与pass
{{1}中嵌套的<f:attribute/>
标记的username
值相关}}。通过此设置,您可以执行以下验证:
<h:inputText/>
由于所有这些都是在验证阶段完成的,因此尚未在您的托管bean中设置这些值,这就是您必须使用提交的值进行一些操作的原因。