Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PrimeFaces Not Rendering

In my maven project, I created an "index.xhtml" file. When I built and ran the project, the web browser didn't show anything. When I view source, I could still see the source code, instead of the normal html tags.

I have tried creating the XHTML file by:

  1. Selecting the project, right-click New.. and select Other.. and select "Web" category and then JSF Page.
  2. Selecting the project, right-click New.. and select Other.. and select "JavaServer Faces" category and then JSF Page.
  3. Selecting the project, right-click New.. and select Other.. and select "Other" category and then XHTML Page.

None of the methods above worked.

Maven POM

<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>ProfitV10</groupId>
<artifactId>ProfitV10</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<name>ProfitV10</name>

<properties>
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.primefaces</groupId>
        <artifactId>primefaces</artifactId>
        <version>3.3.1</version>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>prime-repo</id>
        <name>PrimeFaces Maven Repository</name>
        <url>http://repository.primefaces.org</url>
        <layout>default</layout>
    </repository>
</repositories>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <compilerArguments>
                    <endorseddirs>${endorsed.dir}</endorseddirs>
                </compilerArguments>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.1</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${endorsed.dir}</outputDirectory>
                        <silent>true</silent>
                        <artifactItems>
                            <artifactItem>
                                <groupId>javax</groupId>
                                <artifactId>javaee-endorsed-api</artifactId>
                                <version>6.0</version>
                                <type>jar</type>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</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>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <p:spinner />
    </h:body>
</html>

That's the first scenario. The second scenario, I already have a NetBeans Web Application project running ok with PrimeFaces. The "index.html" did render. But when I created a new JSF page and included the PrimeFaces namespace, xmlns:p="http://primefaces.org/ui", But this particular JSF and other newly created JSF page won't render.

Must be something which I am missing, but I do not know what.

My environment is as below:

  • JDK6
  • Netbeans 7.1.2
  • PrimeFaces 3.3
  • Apache 7.0.2
  • Windows 7 (32-bit)

Thanks.

like image 975
Alvin Sim Avatar asked Jul 04 '12 07:07

Alvin Sim


2 Answers

Since you're using /index.xhtml as the welcome file, you should also have mapped the FacesServlet to that extension.

If you don't need the existing prefix mapping, replace that by:

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

Otherwise just add the *.xhtml pattern meaning you'll end up with:

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>

Note that you nearly always want the *.xhtml mapping there in order to prevent exposing the source code of your Facelets to the public.

Update:

About the difference between .jsf and .xhtml:

.jsf is one of the default mappings (if you don't declare the FacesServlet at all in JSF 2.1, you'll get this among others). It stems from the difference between the extension the physical file on disk has (.jsp or .xhtml) and the extension used in the URL.

Unfortunately these were historically different since JSF was a kind of add-on technique that had to go via a separate explicit Servlet (the Faces Servlet).Pure JSP never had this limitation since it was more build-in. JSF pages were authored only in JSP at first, so if you just used .jsp in your URL requests, the container would go directly to JSP and skip the Faces Servlet.

So a workaround had to be invented for this, and that was to map the Faces Servlet to *.jsf, and then the Faces Servlet would direct to the JSP file, which still had the extension .jsp on disk.

Personally I think a simple *.xhtml to *.xhtml mapping is the only sane out-of-the-box option, but due to backwards compatibility it seems JSF can not set this as a default anymore.

like image 174
Arjan Tijms Avatar answered Sep 21 '22 19:09

Arjan Tijms


try to put the primefaces.jar file under WebContent/WEB-INF/lib then add this jar to the build path

like image 23
user3877090 Avatar answered Sep 23 '22 19:09

user3877090