如何在JSF中上传文件

时间:2011-12-11 16:48:20

标签: jsf-2 nullpointerexception tomahawk

实际上我正在创建一个使用JSF上传文件的应用程序。但每当我上传文件并点击发送时,它都会显示NullPointerException。我用于该应用程序的代码是:

使用Tomahawk的JSF代码:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="t" uri="http://myfaces.apache.org/tomahawk"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Email Client Web Application</title>
</head>
<body>
<f:view>
<h:form>
    <h:panelGrid columns="3" id="basePanel" rules="rows" border="0">
        <h:outputLabel>TO:</h:outputLabel>
        <h:inputText id="txtTo" size="50" required="true"
            requiredMessage="Recipient cannot be empty"
            value="#{MailSenderBean.to}">
            <f:validator
                validatorId="userLibrary.validators.DefaultRecipientValidator" />
        </h:inputText>
        <h:message for="txtTo" style="color:red"></h:message>
        <h:outputLabel>CC:</h:outputLabel>
        <h:inputText id="txtCC" size="50" value="#{MailSenderBean.cc}">
            <f:validator
                validatorId="userLibrary.validators.DefaultRecipientValidator" />
        </h:inputText>
        <h:message for="txtCC" style="color:red"></h:message>
        <h:outputLabel>BCC:</h:outputLabel>
        <h:inputText id="txtBCC" size="50" value="#{MailSenderBean.bcc}">
            <f:validator
                validatorId="userLibrary.validators.DefaultRecipientValidator" />
        </h:inputText>
        <h:message for="txtBCC" style="color:red"></h:message>
        <h:outputLabel>SUBJECT:</h:outputLabel>
        <h:inputText id="txtSubject" size="92"
            value="#{MailSenderBean.subject}"></h:inputText>
        <h:message for="txtSubject"></h:message>
        <h:outputLabel></h:outputLabel>
        <h:inputTextarea id="txtMessage" rows="10" cols="70"
            value="#{MailSenderBean.messageBody}"></h:inputTextarea>
        <h:message for="txtMessage"></h:message>
    </h:panelGrid>
    <div id="part2" style="position:fixed;left:85px">
    <t:inputFileUpload id="file" value="#{MailSenderBean.uploadedFile}"></t:inputFileUpload>
    <h:message for="file" style="color: red;" />
    <br><br>
    <h:commandButton id="btnSubmit" value="Send" action="#{MailSenderBean.send}"></h:commandButton>
    </div>
</h:form>

java文件的代码:

public String send() {

    System.out.println("File type: " + uploadedFile.getContentType());
    System.out.println("File name: " + uploadedFile.getName());
    System.out.println("File size: " + uploadedFile.getSize() + " bytes");

    String status = "fail";
    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.socketFactory.class",
            "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", "465");

    Session session = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("saikia.buddha",
                            "b10Q@`z&0%");
                }
            });

    try {

        Message message = new MimeMessage(session);
        MimeBodyPart part1=new MimeBodyPart();
        MimeBodyPart part2=new MimeBodyPart();

        FileDataSource datasource=new FileDataSource((File) uploadedFile);

        message.setFrom(new InternetAddress("saikia.buddha@gmail.com",
                "BUDDHA SAIKIA"));
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse(getTo()));
        message.setRecipients(Message.RecipientType.CC,
                InternetAddress.parse(getCc()));
        message.setRecipients(Message.RecipientType.BCC,
                InternetAddress.parse(getBcc()));
        message.setSubject(getSubject());

        part1.setText(messageBody);

        part2.setDataHandler(new DataHandler(datasource));
        try {
            part2.attachFile(datasource.getFile());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Multipart multipart=new MimeMultipart();
        multipart.addBodyPart(part1);
        multipart.addBodyPart(part2);
        message.setContent(multipart);

        Transport.send(message);
        status = "success";
    } catch (MessagingException e) {
        throw new RuntimeException(e);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return status;
}

stacktrace:

    javax.faces.el.EvaluationException: org.apache.jasper.el.JspELException: /index.jsp(50,2) '#{MailSenderBean.send}' java.lang.NullPointerException
at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:96)
at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:100)
at javax.faces.component.UICommand.broadcast(UICommand.java:120)
at javax.faces.component.UIViewRoot._broadcastAll(UIViewRoot.java:937)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:271)
at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1249)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:675)
at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:34)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

Caused by: org.apache.jasper.el.JspELException: /index.jsp(50,2) '#{MailSenderBean.send}' java.lang.NullPointerException
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:79)
at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:88)
... 26 more

Caused by: java.lang.NullPointerException
at userLibrary.MailSender.send(MailSender.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:70)
... 27 more

2 个答案:

答案 0 :(得分:3)

<h:form>

根据Tomahawk文档,您忘记将表单enctype设置为multipart/form-data

相应修复:

<h:form enctype="multipart/form-data">

不要忘记在ExtensionsFilter中配置web.xml,以便JSF可以处理上传的文件和所有其他属性以及操作。当前堆栈跟踪中缺少此过滤器。

请注意,您在操作方法中隐含地期望uploadedFile不是null。您可能希望将required="true"添加到<t:inputFileUpload>组件,否则当有人未选择文件时,您将再次获得NullPointerException

另见:

答案 1 :(得分:0)

在我看来,你在EL表达式中提供了错误的bean名称。 bean名称的第一个字符应为小写。例如,如果您将托管bean声明为public class MrBean,则应将其称为mrBean