Toon posts:

[JSF] FileUpload werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik wil een fileupload met java server faces te maken om studenten uit een tekstbestand te lezen. Ik heb myfaces extensions lib gedownload en toegevoegd, en de taglib "x" voor de fileupload gedeclareerd. ik heb alle overige benodigde jar files ook toegevoegd. ik krijg de fileupload wel op mijn formulier alleen de file in mijn bean setten werkt niet goed. dit is de stacktrace:

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)

javax.servlet.ServletException: Cannot get value for expression '#{addstudentBean.myFile}'
javax.faces.FacesException: Cannot get value for expression '#{addstudentBean.myFile}'

Java Server Faces:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://myfaces.apache.org/extensions" prefix="x"%>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Studenten toevoegen</title>
    </head>
    <body>
        <f:view>
            <h:form id="MyForm" enctype="multipart/form-data" >
                <x:inputFileUpload id="myFileID" value="#{addstudentBean.myFile}" storage="file" required="true" />
                <br><br>
                <h:commandButton value="Versturen" action="#{addstudentBean.addStudents}" />
            </h:form>
        </f:view>
    </body>
</html>

en dit is mijn bean:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package beans;

import java.io.*;
import org.apache.myfaces.custom.fileupload.UploadedFile;

public class addstudentBean{
    private UploadedFile myFile;
    
    public addstudentBean(){  }
    
    public String addStudents(){
        try {
            if (myFile != null){
                String studentname;
                int studentnr;
                BufferedReader in = new BufferedReader(new InputStreamReader(myFile.getInputStream()));

                String regel=null;
                while((regel=in.readLine())!=null) {
                    String[] sar = regel.split(";");
                    studentnr = Integer.parseInt(sar[0]);
                    studentname = sar[1];
                    System.out.println("nr = " + studentnr + " - naam = " + studentname);
                }
                in.close();
            }
            return "success";
        } catch (Exception e) {
            System.out.println("Fout: " + e.getMessage());
            return "fail";
        }
    }
   
    public UploadedFile getMyFile() {
        System.out.println("getMyFile");
        System.out.println("naam = " + myFile.getName());
        System.out.println("size = " + myFile.getSize());
        return myFile;
    }

    public void setMyFile(UploadedFile myFile) {
        System.out.println("setMyFile");
        this.myFile = myFile;
    }
}

dit is mijn web.xml (belangrijkste gedeelte):
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>  
    <filter>
        <filter-name>ExtensionsFilter</filter-name>
        <filter-class>
            org.apache.myfaces.component.html.util.ExtensionsFilter
        </filter-class>
        <init-param>
            <param-name>uploadMaxFileSize</param-name>
            <param-value>10m</param-value>
        </init-param>
        <init-param>
            <param-name>uploadThresholdSize</param-name>
            <param-value>100k</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>ExtensionsFilter</filter-name>
        <servlet-name>*.jsf</servlet-name>
    </filter-mapping>

en tot slot mijn faces.config.xml
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<faces-config>
  
  <navigation-rule>
    <from-view-id>/addstudent.jsp</from-view-id>
    <navigation-case>
      <from-outcome>success</from-outcome>
      <to-view-id>/success.jsp</to-view-id>
    </navigation-case>
  </navigation-rule>

  <navigation-rule>
    <from-view-id>/addstudent.jsp</from-view-id>
    <navigation-case>
      <from-outcome>fail</from-outcome>
      <to-view-id>/fail.jsp</to-view-id>
    </navigation-case>
  </navigation-rule>
  
  <managed-bean>
    <managed-bean-name>addstudentBean</managed-bean-name>
    <managed-bean-class>beans.addstudentBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
  <application>
    <locale-config/>
  </application>
  <factory/>
  <lifecycle/>  
</faces-config>

Ik heb zoveel mogelijk code gepost zodat alle relaties bekeken kunnen worden, mochten daar nog problemen in zitten. ik heb genoeg voorbeelden op internet gezien en overal doen ze het zo dus ik snap niet waarom het bij mij niet werkt. ik hoop dat iemand mij op weg kan helpen. ik vind dit probleem ook nergens terug in forums ofzo, wel genoeg andere problemen.

Verwijderd

Topicstarter
dit is die tutorial, die bijna in elk forum als antwoord wordt gepost:
http://www.onjava.com/pub/a/onjava/2005/07/13/jsfupload.html
hun gebruiken alleen een bat file maar bij mij gaat het al fout met die file setten

Verwijderd

Topicstarter
ik heb een deel van de oplossing gevonden:
<h:form id="MyForm" enctype="multipart/form-data, text/plain" >
text/plain moest erachter, nu gaat ie wel door naar de success pagina, maar leest ie nog niet goed het tekst bestand uit.

Verwijderd

Topicstarter
het enige wat die text/plain helpt is dat ie wel doorgaat naar de volgende pagina alleen die MyFile blijft een nullpointerexception geven, hij wil maar niet die file setten in die UploadedFile myFile.
heeft iemand enig idee waarom die dat niet doet ?

  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
Verwijderd schreef op donderdag 31 mei 2007 @ 12:26:
hij wil maar niet die file setten in die UploadedFile myFile.
heeft iemand enig idee waarom die dat niet doet ?
Een wilde gok, maar het zou kunnen dat tijdens de JSF life-cycle de myFile getter van je bean al wordt aangeroepen om te controleren of er al een bestaande file in je backing bean is. In die getter roep je een methode aan op een null reference, wat natuurlijk niet werkt.

Misschien als je even die system.out statements weghaalt en alleen myFile terug geeft? Als je myFile wilt inspecteren kun je er beter even een breakpoint op zetten in je IDE.

(Sowieso kun je dikwijls dergelijke problemen oplossen door gewoon even in de API te steppen. Doe een source attachment voor die MyFaces lib en zet op strategische plekken een breakpoint. Die strategische plekken kun je zien door naar de stack te kijken op het moment dat jouw getter wordt aangeroepen. Vanaf daar kun je doorsteppen en zien wat het MyFaces component intern precies doet.)

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


Verwijderd

Topicstarter
ik heb de system.out weggehaald en alleen mfile gereturned en breakpoints neergezet
en je ziet gewoon dat ie de setmyfile overslaat, die bereikt ie gewoon nooit.
ik heb het aan 2 docenten en 2 studenten gevraagd maar niemand snapt waarom hij die setmyfile overslaat. en als ik een simpele string gebruik dan loopt ie wel netjes de set langs.

Verwijderd

Ik kan me enigszins voorstellen dat er geen PropertyEditor voor bestaat (UploadFile) en dat zodoende de setter niet wordt aangeroepen.

Verwijderd

Topicstarter
ik heb de oplossing gevonden.
Ik had 1 regel verkeerd in de web.xml
de ExtensionsFilter had ik op *.jsf staan maar dat moet zijn: Faces Servlet
XML:
1
2
3
4
    <filter-mapping>
        <filter-name>ExtensionsFilter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
Pagina: 1