客户端注入元素的JSF验证

时间:2011-08-19 06:33:37

标签: jsf

我知道asp.net中有一个属性(可能是“<%@ Page%>标记”的EnableEventValidation)。当我尝试使用javascript向组件添加选择项时,一旦出现问题,我想要知道jsf如何处理这个问题。就是这样,

如果我发送一个h:select * like like,并且客户端在项目列表中添加一个新项目“option3”,则jsf会在更新模型值之前自动检测到这一点。

<h:selectOneMenu  id="type"  
                  value="#{foo.value}"
                  required="true" 
                  requiredMessage="Type is required"   
                  style="width:100px">
  <f:selectItem  value="option1}"/>
  <f:selectItem  value="option2}"/>

</h:selectOneMenu>

2 个答案:

答案 0 :(得分:1)

我认为您需要了解的有关JSF的内容是组件的客户端/服务器部分紧密耦合在一起。你可能最好把它们当作一个实体来考虑它们,而忘记仅仅摆弄一面,当它是唯一的解决方案时,回到自定义Javascript。

另一种思考方式是服务器端呈现客户端,反之亦然!因此,每当您需要更新组件时,必须首先在服务器端完成更新,这将传播到客户端(浏览器)。

在您的示例中,向select*项添加和元素的正确方法是将可选项存储在bean中的数据结构中(可能是@ViewScoped),然后通过用于select*组件或其容器组件的AJAX,当服务器端有机会了解更改并且也可以正确更新客户端时。

当然,你可以通过Javascript破解你的方式,但为什么要使用JSF? JSF的重点是避免像这样的黑客攻击。

请记住,JSF不是JSP,它基本上是html输出的println宏。 JSF将页面组件的表示存储在服务器端,镜像浏览器的表示。

查看Primefaces showcase有关如何进行部分更新的示例。更具体地说,this is the example你可能正在寻找。这在标准JSF2中可用,对于JSF 1.2,您必须使用组件库来获得AJAX支持。

答案 1 :(得分:0)

您不应该通过JavaScript添加新选项,但是您应该通过JSF添加新选项。为了允许提交的值,JSF需要以某种方式了解新选项。新选项确实需要由<f:selectItem(s)>提供。否则,在提交由JS添加的选项值时,您将始终面对Validation error: Value not valid。毕竟这只是JSF的一个保护措施,可以防止客户操纵请求并提交他们不应该提交的值。

以下启动示例应该有效:

<h:form>
    <h:selectOneMenu id="menu" value="#{bean.item}">
         <f:selectItems value="#{bean.items}" />
    </h:selectOneMenu>

    <h:inputText id="newItem" value="#{bean.newItem}" />
    <h:commandButton value="add" action="#{bean.addNewItem}">
        <f:ajax execute="@this newItem" render="menu" />
    </h:commandButton>

    <h:commandButton value="submit" action="#{bean.submit}" />
</h:form>

使用@ViewScoped托管bean,如下所示:

private String item;
private List<String> items = Arrays.asList("option1", "option2");
private String newItem;

public void addNewItem() {
    items.add(newItem);
}

// ...