为JSF元素设置正确的值

时间:2013-05-12 14:54:29

标签: java jsf servlets javabeans

我正在尝试从Java Bean访问JSF元素,所以我可以在我的应用中使用它,但我需要将文本从textarea发送到<f:setPropertyActionListener />问题是我不知道如何告诉<f:setPropertyActionListener />采用`textarea值

我确定这是一个小小的语法错误,但我看不到它U__U

这里有一些代码,如果你告诉我将来怎么做,我会非常感激,因为我需要它;)

<h:form>
        <h:dataTable var="answer" value="#{AnswerController.answer}">
            <h:column>
                #{msgs.newAnswer}<br/>
                <h:inputTextarea id="textanswer" name="text" rows="5" cols="20" /> <br/>
                <h:commandButton value="#{msgs.aceptButton}" type="submit" action="#{AnswerController.newAnswer(answer)}" immediate="true">
                    <f:setPropertyActionListener target="#{AnswerController.currentAnswer}"
                        value="textanswer" />
                </h:commandButton>
            </h:column>
        </h:dataTable>              
    </h:form>

1 个答案:

答案 0 :(得分:2)

关于<f:setPropertyActionListener> kolossus的用法是正确的:如果您使用EL 2.2,能够调用带参数的方法,则没有必要。否则,该标签可用于识别按下哪个命令按钮,并最终哪个应答应该在要操作的bean中出现。

在您的情况下,我可以看到两个用例,两者都在下面描述。

提交一个答案

在这种情况下,您应该在每次数据迭代时使用一个表单,以便只有一个答案将来到服务器。将kolossus的评论放入代码中,有:

<h:dataTable var="answer" value="#{bean.answers}">
    <h:column>
        <h:form>
            #{msgs.newAnswer}<br/>
            <h:inputTextarea id="textanswer" value="#{bean.currentAnswer}" rows="5" cols="20" /> <br/>
            <h:commandButton value="#{msgs.aceptButton}" action="#{bean.newAnswer}" />
        </h:form>
    </h:column>
</h:dataTable>

使用此代码,bean的一个字符串属性就足够了,它将在侦听器方法中可用:

private String currentAnswer;//getter+setter

提交所有答案

在这种情况下,每个数据表应该有一个表单,所有答案最终都会出现在支持bean的列表中:

<h:form>
    <h:dataTable var="answer" value="#{bean.answers}">
        <h:column>
            #{msgs.newAnswer}<br/>
            <h:inputTextarea id="textanswer" value="#{answer}" rows="5" cols="20" /> <br/>
        </h:column>
    </h:dataTable>
    <h:commandButton value="#{msgs.aceptButton}" action="#{bean.newAnswers}" />
</h:form>

在这种情况下,将在表单提交期间填充字符串列表,并且所有答案都将以操作方法提供:

List<String> answers;//getter+setter

使用带参数或<f:setPropertyActionListener>

的方法调用的情况

如您所见,它们都没有在上述两种设置中使用。如果您想知道选择了哪个答案,那么它们很有用,因此可以操纵正确的答案。喜欢在:

<h:dataTable var="answer" value="#{bean.answers}">
    <h:column>
        <h:form>
            #{msgs.deleteAnswer}<br/>
            <h:inputTextarea id="textanswer" value="#{answer}" rows="5" cols="20" /> <br/>
            <h:commandButton value="#{msgs.deleteButton}" action="#{bean.deleteAnswer(answer)}" />
        </h:form>
    </h:column>
</h:dataTable>

或者

<h:dataTable var="answer" value="#{bean.answers}">
    <h:column>
        <h:form>
            #{msgs.deleteAnswer}<br/>
            <h:inputTextarea id="textanswer" value="#{answer}" rows="5" cols="20" /> <br/>
            <h:commandButton value="#{msgs.deleteButton}" action="#{bean.deleteAnswer(answer)}">
                <f:setPropertyActionListener value="#{answer}" target="#{bean.currentAnswer}" />
            </h:commandButton>
        </h:form>
    </h:column>
</h:dataTable>

在第一个示例中,与按钮单击关联的答案将作为方法参数提供,在第二个示例中,与按钮单击关联的答案将在调用操作方法之前设置为bean属性,并将以{{1}的形式提供bean属性。