What namespace to use to recognize nav tag in JSF 2.x? - namespaces

I was asked to use externally provided css/js for web application I am working (JSF 2.x). When I added nav tag into a foo.xhtml file, IDE (eclipse) generated a warning(?) saying - "Unknown tag (nav)."
The foo.xhtml file has following xml namespaces of taglib at top:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
I assume html taglib does not understand nav tag which is introduced in html 5. How can I rectify this situation?

HTML5 support is available only in jsf 2.2 afterwards, it will not work in JSF 2.0 so be sure to use the 2.2 version.
By the way, replace the old java.sun.com with xmlns.jcp.org and include
xmlns:p="http://xmlns.jcp.org/jsf/passthrough"
There are several ways to use it, most of them described in this article.

Related

How to change the <!DOCTYPE> declaration from version HTML4.01 to HTML 5 in IntelliJ

When generating JavaDoc documentation in IntelliJ 2018.3.3 (Community Edition) I get this information
Constructing Javadoc information...
javadoc: warning - You have not specified the version of HTML to use.
The default is currently HTML 4.01, but this will change to HTML5
in a future release. To suppress this warning, please specify the
version of HTML used in your documentation comments and to be
generated by this doclet, using the -html4 or -html5 options.
At the moment the first statement of all generated HTML-files is:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Therefore I changed the default HTML language level from HTML 4 to HTML 5 at
Project Settings - Languages & Frameworks - Schemas and DTDs - Default XML Schemas
In addition I looked at the project settings at
Editor - File and Code Templates - Default Scheme
There are templates for HTML and HTML4, but not for HTML5.
I wonder about how to change to the right version of HTML as required.
Thanks for your help!
As the message you've quoted says, you can specify the version of the HTML generated by JavaDoc by specifying the -html5 option. In IntelliJ IDEA, this option can be specified under "Other command line arguments:" in the Tools | Generate JavaDoc... dialog.
None of the other options you've tried to change have any impact on JavaDoc generation.

How to get <ui:repeat> out of the source code [duplicate]

I have some Facelets files like below.
WebContent
|-- index.xhtml
|-- register.xhtml
|-- templates
| |--userForm.xhtml
| `--banner.xhtml
:
Both pages are using templates from /templates directory. My /index.xhtml opens fine in browser. I get the generated HTML output. I have a link in /index.xhtml file to /register.xhtml file.
However, my /register.xhtml is not getting parsed and returns as plain XHTML / raw XML instead of its generated HTML output. All EL expressions in form of #{...} are displayed as-is instead of that their results are being printed. When I rightclick page in browser and do View page source, then I still see the original XHTML source code instead of the generated HTML output. For example, the <h:body> did not become a <body>. It looks like that the template is not being executed.
However, when I open the /register.xhtml like /faces/register.xhtml in browser's address bar, then it displays correctly. How is this caused and how can I solve it?
There are three main causes.
FacesServlet is not invoked.
XML namespace URIs are missing or wrong.
Multiple JSF implemenations have been loaded.
1. Make sure that URL matches FacesServlet mapping
The URL of the link (the URL as you see in browser's address bar) has to match the <url-pattern> of the FacesServlet as definied in web.xml in order to get all the JSF works to run. The FacesServlet is the one responsible for parsing the XHTML file, collecting submitted form values, performing conversion/validation, updating models, invoking actions and generating HTML output. If you don't invoke the FacesServlet by URL, then all you would get (and see via rightclick, View Source in browser) is indeed the raw XHTML source code.
If the <url-pattern> is for example *.jsf, then the link should point to /register.jsf and not /register.xhtml. If it's for example /faces/*, like you have, then the link should point to /faces/register.xhtml and not /register.xhtml. One way to avoid this confusion is to just change the <url-pattern> from /faces/* to *.xhtml. The below is thus the ideal mapping:
<servlet>
<servlet-name>facesServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
If you can't change the <url-pattern> to *.xhtml for some reason, then you probably would also like to prevent endusers from directly accessing XHTML source code files by URL. In that case you can add a <security-constraint> on the <url-pattern> of *.xhtml with an empty <auth-constraint> in web.xml which prevents that:
<security-constraint>
<display-name>Restrict direct access to XHTML files</display-name>
<web-resource-collection>
<web-resource-name>XHTML files</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint />
</security-constraint>
JSF 2.3 which was introduced April 2017 has already solved all of above by automatically registering the FacesServlet on an URL pattern of *.xhtml during webapp's startup. The alternative is thus to simply upgrade to latest available JSF version which should be JSF 2.3 or higher. But ideally you should still explicitly register the FacesServlet on only one URL pattern of *.xhtml because having multiple possible URLs for exactly the same resource like /register.xhtml, /register.jsf, /register.faces and /faces/register.xhtml is bad for SEO.
See also:
Set default home page via <welcome-file> in JSF project
Opening JSF Facelets page shows "This XML file does not appear to have any style information associated with it."
Sometimes I see JSF URL is *.jsf, sometimes *.xhtml and sometimes /faces/*. Why?
JavaServer Faces 2.2 and HTML5 support, why is XHTML still being used
Which XHTML files do I need to put in /WEB-INF and which not?
Our servlets wiki - to learn the mandatory basics about servlets
2. Make sure that XML namespaces match JSF version
Since introduction of JSF 2.2, another probable cause is that XML namespaces don't match the JSF version. The xmlns.jcp.org like below is new since JSF 2.2 and does not work in older JSF versions. The symptoms are almost the same as if the FacesServlet is not invoked.
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
If you can't upgrade to JSF 2.2 or higher, then you need to use the old java.sun.com XML namespaces instead:
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
But ideally you should always use the latest version where available.
See also:
Which XML namespace to use with JSF 2.2 and up
JSF tags not executed
Warning: This page calls for XML namespace http://xmlns.jcp.org/jsf/XXX declared with prefix XXX but no taglibrary exists for that namespace
3. Multiple JSF implementations have been loaded
One more probable cause is that multiple JSF implementations have been loaded by your webapp, conflicting and corrupting each other. For example, when your webapp's runtime classpath is polluted with multiple different versioned JSF libraries, or in the specific Mojarra 2.x + Tomcat 8.x combination, when there's an unnecessary ConfigureListener entry in webapp's web.xml causing it to be loaded twice.
<!-- You MUST remove this one from web.xml! -->
<!-- This is actually a workaround for buggy GlassFish3 and Jetty servers. -->
<!-- When leaving this in and you're targeting Tomcat, you'll run into trouble. -->
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
When using Maven, make absolutely sure that you declare the dependencies the right way and that you understand dependency scopes. Importantingly, do not bundle dependencies in webapp when those are already provided by the target server.
See also:
Configuration of com.sun.faces.config.ConfigureListener
How to properly install and configure JSF libraries via Maven?
Make sure that you learn JSF the right way
JSF has a very steep learning curve for those unfamiliar with basic HTTP, HTML and Servlets. There are a lot of low quality resources on the Internet. Please ignore code snippet scraping sites maintained by amateurs with primary focus on advertisement income instead of on teaching, such as roseindia, tutorialspoint, javabeat, baeldung, etc. They are easily recognizable by disturbing advertising links/banners. Also please ignore resources dealing with jurassic JSF 1.x. They are easily recognizable by using JSP files instead of XHTML files. JSP as view technology was deprecated since JSF 2.0 at 2009 already.
To get started the right way, start at our JSF wiki page and order an authoritative book.
See also:
Java / Jakarta EE web development, where do I start and what skills do I need?
What is the need of JSF, when UI can be achieved with JavaScript libraries such as jQuery and AngularJS

HTML to XHTML conversion without HTML tag

Problem:
My project is using Struts Framework, specifically the html:button tag explained here on Struts Apache Documentation
The issue is the html:button tag turns into
<input>
, failing w3c compliance tests. The tag needs to turn into
<input/>
Reason:
I use an html tag specifying xhtml, which is in a template file used in all my other files. All the other files are not converted to xhtml though since the tag is in the template file. Is there a way to make all the other files xhtml, without using an html tag?
The solution to this problem is to add
<html:xhtml/>
after all the taglib tags on each jsp page
Example of taglib tag:
<%# taglib uri="/taglib/htmlstrut" prefix="html"%>

W3C compliant struts tags

I have a web page(.jsp) created using struts tag libraries. when I try to validate the web page in w3c.org, all the struts tags are coming up as undefined. E.g <html:button> is undefined . The DOCTYPE I have used is
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
Please let me know how to resolve the issue. Or can't we make a struts based web page as W3C compliant.
...
Why are you trying to validate a page before rendering?
Are Struts tags (or any other custom tag) valid HTML tags? Of course not.
Validation should occur after the page is rendered.

Validate html 4.01 tags with weblogic

I need to validate a web application in html 4.01 transitional. In my project im working on skeletons/head.jsp to add meta tags. The problem is that i want to add tags like:
<meta name="robots" content="follow">
without the enclosing tag. And the document type is defined on skeleton.xml as HTML 4.01 Transitional. But when erase the slash the WorkShop Framework (Eclipse) fails if no exist ending tag.
It's the head.js where I have to put the meta tags?
“But when erase the slash the program fails.”
I’m not familiar with WebLogic, but when you say “the program fails”, do you mean your website stops working? Or the resulting HTML page doesn’t validate?