# PrimeFaces (/ JSF) Konfigurationsproblem



## Zireal (17. Aug 2010)

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:

```
<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

```
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:

```
<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


----------



## Nogothrim (18. Aug 2010)

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.


----------



## Zireal (18. Aug 2010)

Nogothrim hat gesagt.:


> 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*:


```
<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


----------



## Nogothrim (18. Aug 2010)

Welche JSF Version wird verwendet? 1.2 oder 2.0 ?


----------



## Zireal (18. Aug 2010)

Nogothrim hat gesagt.:


> Welche JSF Version wird verwendet? 1.2 oder 2.0 ?



Sorry, vergass ich zu erwähnen. *JSF 2.0* mit *PrimeFaces 2.1*.


----------



## Zireal (20. Aug 2010)

Hat wirklich keiner einen Tipp oder einen Einfall dazu... ihr seit doch hier alles "Profis"!? *anstachel*


----------



## Semerzo (22. Aug 2010)

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?


----------



## Zireal (23. Aug 2010)

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_


----------



## internet (5. Apr 2011)

@Zireal

Hast du das Problem gelöst bekommen? Wenn ja wie? Kannst du den Code bitte posten


----------

