PrimeFaces (/ JSF) Konfigurationsproblem

Zireal

Mitglied
Guten Tag,

ich bin gerade neu hier angekommen und starte gleich mal mit meinem momentanen Problem. 🙂

Ich entwickle eine Webapplikation mit JSF und Tomcat (v6.0). Nun will ich dem Benutzer einer Administrationsfläche gestatten ein Bild hochzuladen und dieses anschliessend zuzuschneiden.

Für beides bietet PrimeFaces ideale Lösungen. (FileUpload / ImageCropper)

Nun versuche ich seit geraumer Zeit, PrimeFaces zu integrieren. Ich habe die aktuelle Version 2.1 eingebunden.

Nun, mein JSP für den FileUpload beinhaltet folgendes:
Java:
<h:form id="newarticleformular" prependId="false" enctype="multipart/form-data">
        <p:fileUpload id="upload" auto="true" fileUploadListener="#{fileUploadController.handleFileUpload}"  
                                          allowTypes="*.jpg;*.png;*.gif;" description="Images"/>
</h:form>

Dies klappt auch soweit so gut, das Problem ist jedoch, dass bei meinem FileUploadController kein Event ankommt.


FileUploadController
Java:
package ch.vote2buy.jsf.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

public class FileUploadController {
private UploadedFile file;

public void handleFileUpload(FileUploadEvent event)
{
	System.out.println("FileUpload finished");
	file = event.getFile();
	ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
	String newFileName = servletContext.getRealPath("") + File.separator + "uploaded" + File.separator+ file.getFileName();
	FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
	FacesContext.getCurrentInstance().addMessage(null, msg);
	try {
		FileOutputStream fos = new FileOutputStream(new File(newFileName));
		InputStream is = file.getInputstream();
		int BUFFER_SIZE = 8192;
		byte[] buffer = new byte[BUFFER_SIZE];
		int a;
		while(true) {
			a = is.read(buffer);
			if(a < 0) break;
			fos.write(buffer, 0, a);
			fos.flush();
		}
		fos.close();
		is.close();
	} catch(IOException e) { }
}
}


Mein web.xml sieht folgendermassen aus:
[XML]<welcome-file-list>
<welcome-file>/index.jsf</welcome-file>
</welcome-file-list>

<!-- Primefaces -->
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
<init-param>
<param-name>uploadDirectory</param-name>
<param-value>C:\Dokumente und Einstellungen\<User>\Desktop</param-value>
</init-param>
<init-param>
<param-name>thresholdSize</param-name>
<param-value>51200</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<!-- Primefaces -->


<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>

<!--
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsf</param-value>
</context-param>
-->

<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>

<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>

<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>


<!-- For Primefaces -->



<servlet>
<servlet-name>Resource Servlet</servlet-name>
<servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Resource Servlet</servlet-name>
<url-pattern>/primefaces_resource/*</url-pattern>
</servlet-mapping>

<context-param>
<param-name>com.sun.faces.allowTextChildren</param-name>
<param-value>true</param-value>
</context-param>



<!-- For Primefaces -->



<!-- SECURITY MANAGEMENT -->
<security-role>
<description>Sicherheitsrolle für Administrationszugang</description>
<role-name>admin</role-name>
</security-role>
<security-constraint>
<display-name>Security Constraint</display-name>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/secure/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>Form-based Authentication</realm-name>
<form-login-config>
<form-login-page>/secure/login.jsf</form-login-page>
<form-error-page>/secure/denied.html</form-error-page>
</form-login-config>
</login-config>


</web-app>[/XML]


Den faces-config.xml Eintrag bezüglich des UploadControllers:
Java:
<managed-bean> 
  		<managed-bean-name>fileUploadController</managed-bean-name> 
    	<managed-bean-class>ch.vote2buy.jsf.controller.FileUploadController</managed-bean-class> 
  		<managed-bean-scope>request</managed-bean-scope> 
  	</managed-bean>



Wenn ich ein File per FileChooser des PrimeFaces-Elements "fileUpload" auswähle, sollte der "auto="true"-Tag verantwortlich sein, dass das File sofort hochgeladen wird. Geschieht nichts, kein Fehler, keine Ausgabe des Controllers - einfach nichts. Deshalb vermute ich, dass etwas in meiner Konfiguration nicht in Ordnung ist. Da ich jedoch PrimeFaces das erste Mal benutze finde ich darin nichts, was mich stutzen lassen würde....

Habt ihr eine Idee, wo mein Problem liegen könnte?


=> Danach gehts weiter zum ImageCropper, der sollte das File wieder einlesen und zum zuschneiden anzeigen, das Bild (welches ich zum Testen mit absolutem Pfad angab) erscheint, jedoch kein Auswahlfeld - womit man das Bild zuschneiden könnte... *hüstel*



Nun, ich hoffe ihr könnt mir bei meinem FileUpload-"Problem" helfen...!


In freudiger Erwartung,
Zireal
 
ich kenne mich mit primefaces im detail nicht genau aus, aber ich vermute mal dass Request nicht der richtige Scope für nen FileUpload ist, versuchs mal mit Session. Hört sich so an als ob er einfach alles vergisst, bevor irgendwas passiert.
 
ich kenne mich mit primefaces im detail nicht genau aus, aber ich vermute mal dass Request nicht der richtige Scope für nen FileUpload ist, versuchs mal mit Session. Hört sich so an als ob er einfach alles vergisst, bevor irgendwas passiert.

Vielen Dank für deine Antwort!

Ich habe dies einmal ausprobiert, in der Theorie hört sich das eigentlich noch realistisch an, dass der Request gar nicht erst ankommt.

Folgende Änderung in der faces-config.xml:

Java:
<managed-bean> 
  		<managed-bean-name>fileUploadController</managed-bean-name> 
    	<managed-bean-class>ch.vote2buy.jsf.controller.FileUploadController</managed-bean-class> 
  		<managed-bean-scope>session</managed-bean-scope> 
</managed-bean>

Auch leider bewirkt diese Änderung des scopes keine Änderung, es geschieht nach wie vor nichts.
Es scheint einfach kein Event ausgelöst zu werden. Weshalb ist mir schleierhaft...

Keine Meldung - Kein Fehler - einfach nichts. Hm.


Oder meintest du einen anderen Scope?



Vielen Dank und Gruss,
Zireal
 
Hm, also wenn so gar nichts passiert, klingt das so als würde die Validierung scheitern. Hast Du ein h:messages tag auf der Seite?
 
Merkwürdig. Auf der Seite befindet sich kein <h:messages> oder <h:message> Tag. Ich teste PrimeFaces vor dem produktiven Gebrauch auf einer ganz simpel aufgebauten JSP Seite. Die Seite dient momentan lediglich dem PrimeFaces-Test...

Trotzdem danke für den Gedankenanstoss... ansonsten niemand eine Idee?
Zireal
 

Zurück
Oben