JSF h:使用以前的Bean作为参数的CommandButton

时间:2011-10-28 15:10:43

标签: jsf button parameters

我一直在使用我的JSF项目,我有一个新的疑问。   我的xhtml代码如下所示

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:t="http://myfaces.apache.org/tomahawk">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form enctype="multipart/form-data" >
            <h:selectOneMenu rendered="#{uploadVerifier.check(userVerifier.username)}" >
                <f:selectItems value="#{uploadVerifier.options}" />
            </h:selectOneMenu>
                <br/>
                <t:inputFileUpload required="true" value="#{uploadFile.upFile}" />
                <br/>
            <h:commandButton value="Validar"
                             action="#{uploadFile.upload(userVerifier.username)}"/>
        </h:form>
    </h:body>
</html>

问题在于,每当我点击按钮时,它都会向我发送NullPointerException,因为似乎 userVerifier.username 没有返回值。这个Bean值有一个来自之前的xhtml的参数,甚至更奇怪,因为这个值我在 h:selectOneMenu 中使用它...

这里缺少什么? 提前谢谢!

P.S。 uploadFile.upload(String param)应该只打印 param 的值。

1 个答案:

答案 0 :(得分:0)

原因很明确:#{userVerifier.username}仅在显示带有表单的页面时出现在作用域中,而不是在后续请求中处理表单提交时。然后JSF将重新评估所有EL表达式。如果两个bean都是在同一个视图中创建的,那么它应该可以工作,否则你确实将它作为请求参数传递。但是我建议在目标视图/ bean中使用<f:viewParam>@ManagedProperty,而不是从请求参数映射中手动抓取它。

另见:


无关具体问题:您似乎在每个操作中检查当前登录的用户。这很笨拙。我建议将它存储在HTTP会话中(会话范围内的托管bean应该这样做)并创建一个Filter,它根据每个请求检查登录用户的存在。

另见: