Re: Dealing with application names in a JEE web app
You left out too much context.
markspace wrote:
Lew wrote:
markspace wrote:
So how do folks write their apps so that they can handle being
deployed under different names?
Relative URLS.
I found a use-case [sic] where this doesn't work.
No, you didn't. I meant relative to the app context, not with stupid "../"
prefixes.
Templates are used by various other pages in the web app. They have a static
location, but their links are processed as if the template's "location" in the
directory hierarchy was the location of the template client.
Example: I have a template at /rsrc/priv/lnf-template.xhtml which includes
other resources. Abbreviated example:
<LNF-TEMPLATE.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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="../css/style.css" rel="stylesheet" type="text/css" />
What? No!
<link href="/css/style.css" rel="stylesheet" type="text/css" />
Here's a line from one of my own personal facelet projects:
<ui:composition template="/WEB-INF/templates/template.xhtml">
Here are a couple of lines from that template file:
....
<h:outputStylesheet name="/css/purrtones.css" />
</h:head>
<h:body>
<t:div>
<ui:insert name="header">
<h:graphicImage id="logo" value="/images/Duncan_and_the_purrtones.png"
alt="#{bundle.bandname} logo" styleClass="logo"
/>
</ui:insert>
....
All those paths are relative to the deployed application name, which is
"/purrtones" by default, but as you say can change. Thus, the image URL
becomes, e.g.,
http://localhost:8080/purrtones/images/Duncan_and_the_purrtones.png
..
<title>
<ui:insert name="title">
Facelets Template
</ui:insert>
</title>
</h:head>
<h:body>
...
</LNF-TEMPLATE.XHTML>
That link href to the style sheet is processed by the client, but the client
could be any page in the directory hierarchy.
For example for a client from the root directory (/readPost.xhtml), that
relative link in the template doesn't work.
<READPOST.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:ui="http://java.sun.com/jsf/facelets">
<h:body>
<ui:composition template="/rsrc/priv/lnf-template.xhtml" >
That would translate to "<application-context>/rsrc/priv/lnf-template.xhtml",
and I am having a hard time correlating that to the CSS example above.
Hello from Facelets
</ui:composition>
</h:body>
</html>
</READPOST.XHTML>
Pretty ugly, if you ask me.
I use relative links in templates all the time. But you have to start them
from "/", which translates to the application context root, which is the thing
you're trying not to repeat.
--
Lew
Honi soit qui mal y pense.
http://upload.wikimedia.org/wikipedia/commons/c/cf/Friz.jpg