我一直在使用我的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 的值。
答案 0 :(得分:0)
原因很明确:#{userVerifier.username}
仅在显示带有表单的页面时出现在作用域中,而不是在后续请求中处理表单提交时。然后JSF将重新评估所有EL表达式。如果两个bean都是在同一个视图中创建的,那么它应该可以工作,否则你确实将它作为请求参数传递。但是我建议在目标视图/ bean中使用<f:viewParam>
或@ManagedProperty
,而不是从请求参数映射中手动抓取它。
无关具体问题:您似乎在每个操作中检查当前登录的用户。这很笨拙。我建议将它存储在HTTP会话中(会话范围内的托管bean应该这样做)并创建一个Filter
,它根据每个请求检查登录用户的存在。