Skip to main content

10. JSF How to access my resources files?

Sometimes it is really difficult to access any resources form different Java applications. So let's see some scenarios:


1. Executable jar application in a NO WEB environment.

Take into account that this is not a JSF application !!!

It is desired to have a property file outside the "jar file" so that we can change properties when needed.

For instance, we will place the properties file in the same folder that the "jar file" lies.

To access the folder where the jar is, the trick is to access the folder where the compiled classed are placed and scale 3 folders. (Oh! rather strange, if anybody knows a better idea.., he will be welcome).

Here is a simple code. The name of the class containing the code is ThisClass, and we have created a Property class that feeds with a file in the same folder that the" jar file"




 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
  * Gets the folder where resides the executable jar
  * @return
  */
 public static String getJarFolderPath() {
  
     File f = new File(ThisClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
     String suffix=File.separator +"..";
     //jarFolder=f.getAbsolutePath()+ "/../../../"file.properties" ;
     String jarFolder=f.getAbsolutePath()+ StringUtils.repeat(suffix, 3) + File.separator;
     return jarFolder;
 }
 public static Properties getRelativeFromJarFileProperties(String filePath) throws FileNotFoundException, IOException {
     Properties properties = new Properties();
  
     String myPath=getJarFolderPath()+filePath;
     System.out.println(myPath);
     properties.load(new FileInputStream(myPath));
  
     for(Object o: properties.keySet()) System.out.println(o.toString() + "-->"+ properties.getProperty(o.toString()));
  
     return properties;
 }
 


2. JSF application in NO MAVEN environment

In the Eclipse project, we can see a folder called WebContent. We want to create the following tree structure of folders and place some data in the data folder:

WebContent/resources/data


 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
/**
  * Get an input stream from a relative path from WebContent folder in NO Maven Project
  * 
  * If there is a file in the folder WebContent/resources/data/AccessData.txt we should call it as:
  * 
  *   Inputstream in=getStreamFromWebContentFolder("./resources/data/AccessData.text")
  * 
  * @param filePath
  * @return
  */
 public static InputStream getStreamFromWebContentFolder(String filePath) {
  return FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(filePath);
 }
 
 /**
  * Get the path from a relative path from WebContent folder in NO Maven Project
  * 
  * If there is a file in the folder WebContent/resources/data/AccessData.txt we should call it as:
  * 
  *   String myFileName = getPathFromWebContentFolder("./resources/data/AccessData.text")
  * 
  * @param filePath
  * @return
  * @throws MalformedURLException 
  */
 public static String getPathFromWebContentFolder(String filePath) throws MalformedURLException {
  return FacesContext.getCurrentInstance().getExternalContext().getResource(filePath).getPath();
 }
 


3. JSF MAVEN Application

In this case, a good option is to place a properties folder in the src/main/resources folder.

For instance, let's create this file:

src/main/resources/data/AccesData.txt

We can access it with this code


 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
/**
  * Get an input stream from a relative path from resources folder in Maven Project
  * 
  * If there is a file in the folder resources/data/AccessData.txt we should call it as:
  * 
  *   InputStream in=getStreamFromResourcesFolder("data/AccessData.text")
  * 
  * @param filePath
  * @return
  */
 public static InputStream getStreamFromResourcesFolder(String filePath) {
  return Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
 }
 
 
 /**
  * Get the path from a relative path from resources folder in Maven Project
  * 
  * If there is a file in the folder resources/data/AccessData.txt we should call it as:
  * 
  *   String path=getPathFromWebContentFolder("data/AccessData.text")
  * 
  * @param filePath
  * @return
  * @throws MalformedURLException 
  */
 public static String getPathFromResourcesFolder(String filePath) {
  return Thread.currentThread().getContextClassLoader().getResource(filePath).getPath();
 }


The code is very similar to the previous, but a bit different.









Comments

Popular posts from this blog

9. JSF: Solving common problems

1. Target Unreachable, identifier [bean] resolved to null When you reference a bean in a xhtml file with "#{bean.method}" and get this error, you should verify that: The bean implements Serializable . The references (javax.servlet-api.4.0.0, javax.faces.2.3.3,  javax.el.api.3.0.1, org.primefaces.6.1) have been selected in your pom.xml You have created the files bean.xml and faces-config.xml in the webapp/WEB-INF folder You have used the correct annotations from CDI  (javax.inject.Named and javax.enterprise.context.SessionScoped, ...) and not ManagedBean or jsf2.2 scopes. 2. Bean declaring a passivating scope must be passivation capable This error causes server not starting and fills up the console with long chained exceptions. It is very annoying. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 SEVERE: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to star...

2. Create a Maven JSF project and a simple login page

Updated on Oct-25-2107 0. Introduction Remember to install previously: Java JDK 8 Eclipse Oxygen Lombok  Apache Tomcat 9 1. Create a Maven Project In the top menu select : File - New - Maven Project Press Next Now fill the next form as follows It is important to select: Group id: org.ximodante.jsf  (or another packet you like) Packaging: war Artifact Id and Name: JSFv02 or any name for the project Press Finish 2. The pom.xml file Eclipse complains about the simple generated file. It seems that a web.xml is required if the packaging is selected to war. The simple generated file is  1 2 3 4 5 6 7 8 9 <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion> 4.0.0 </modelVersion> <groupId> org.ximodante...