2012-03-08 94 views
6

有没有什么方法可以验证jsf输入文本是只读的,但其值会在触发其他某些事件时更改?jsf(richfaces)只读输入文本验证

+2

无论在jsf页面支持bean中验证它会更容易吗? – Richie 2012-03-08 12:17:55

+0

如何触发验证并发出验证消息? – 2012-03-09 23:15:06

+0

我已添加答案作为回复评论。欢呼声 – Richie 2012-03-12 11:18:26

回答

2

我用解决方法解决了这个问题。我已经添加了具有required属性true不会在界面上出现的inputHidden场,但将被验证:

<h:inputHidden value="#{bean.value}" required="true" 
        requiredMessage="Data must be entered" /> 

bean.value的价值被其他事件改变,在一些重新描绘上inputHidden,验证发生。

1

您很可能必须直接从您的事件手动调用验证逻辑。这是来自IBM的JSF生命周期模型。

enter image description here

你会发现调用应用程序阶段,事件通常被处理之前处理验证阶段发生。这种情况发生后很好,所以验证不会自动发生。

2

回答评论:“在jsf页面支持bean中验证它会更容易吗?” 您可以对按钮单击或某些类似事件进行应用程序级验证。你可以在你的支持bean中做这样的事情,并将它链接到事件。

public String login(){ 
     FacesContext context = FacesContext.getCurrentInstance(); 
     if(**<<some validation for value in field 'firstName' in form 'userForm'>>**){ 
      FacesMessage message = new FacesMessage(); 
      message.setSeverity(FacesMessage.SEVERITY_ERROR); 
      message.setSummary("Some Valication check"); 
      message.setSummary("Some Valication check!!"); 
      context.addMessage("userForm:firstName", message);//adds validation message for field firstName in form userForm 
      return "ERROR"; 
     } 
     return "SUCCESS"; 
    } 

希望这对我有所帮助。

+0

JSF不会更新'readonly =“true”'输入的模型值。另外,在一个操作方法内而不是在一个正常的验证器内部进行阈值操作是一种不好的做法。 – BalusC 2012-03-12 12:45:15

+0

@BalusC谢谢你的信息:)我不知道设置readonly =“true”作为输入不会更新模型值。至于在一个动作中进行验证,我知道这不是最好的做法,但我认为我们可能无法添加正常验证器来进行只读输入。 – Richie 2012-03-12 16:24:15

12

仅在渲染响应阶段将readonly属性设置为true。通过这种方式,在渲染响应阶段以外的其他阶段不会被视为只读。

<h:inputText ... readonly="#{facesContext.currentPhaseId.ordinal eq 6}" /> 
+2

在我的例子中,当绘制HTML(当它打印在中间)时,#{facesContext.renderResponse}返回false。无论如何,它的工作方式是'#{facesContext.currentPhaseId.ordinal eq 6}'。 Mojarra 2.1.9。 – SJuan76 2012-09-20 11:28:42