Как загрузить файл в JSF - PullRequest
       40

Как загрузить файл в JSF

1 голос
/ 11 декабря 2011

На самом деле я создаю приложение для загрузки файла с использованием JSF.Но всякий раз, когда я загружаю файл и нажимаю кнопку отправить, он показывает NullPointerException.Код, который я использовал для приложения:

код для 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;
}

Трассировка стека:

    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 ]

3 голосов
/ 11 декабря 2011
<h:form>

Вы забыли установить enctype формы в multipart/form-data согласно документации Tomahawk.

Исправьте это соответствующим образом:

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

Не забудьте настроитьExtensionsFilter в web.xml, чтобы загруженный файл и все другие свойства и действие могли обрабатываться JSF.Этот фильтр отсутствует в вашей текущей трассировке стека.

Обратите внимание, что вы находитесь в методе действия, неявно ожидающем, что uploadedFile не будет null.Возможно, вы захотите добавить required="true" к компоненту <t:inputFileUpload>, в противном случае вы получите NullPointerException снова, когда кто-то не выберет файл.

См. Также:

0 голосов
/ 11 декабря 2011

Мне кажется, что вы указали неправильное имя боба в своем выражении EL.Первый символ имени бина должен быть в нижнем регистре.Например, если вы объявили свой управляемый компонент как public class MrBean, вы должны ссылаться на него как mrBean.

...