You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by arne anka <do...@ginguppin.de> on 2008/05/02 12:15:28 UTC

pretty url -- wrong name in js

hi,
after some research regarding pretty urls i found both
http://blogs.steeplesoft.com/jsf-phaselisteners-and-get-requests/
and
http://wiki.apache.org/myfaces/InvokingJsfPagesWithStandardUrls

i tried the second approach first (servlet) and instead of invoking the  
NavigationHandler i did a forward:
req.getRequestDispatcher(facesContext.getViewRoot().getViewId()).forward(req,  
res);

the page is rendered wonderfully, the url is intact -- all seems nice,  
until ...
i got an <h:collapsiblePanel> on my page -- and clicking the panel to  
expand it changes the url.
instead of my nice url now there's the url of the viewId i render inside  
my servlet.

with the phaselistener it's mostly the same -- only the url is now the  
pseudo-directory and the viewId appended which results in an error ...

pretty url:
http://foo.bar/document/doc001

wrong url after servlet:
http://foo.bar/presentation/presentation.jsf

wrong url after phaselistener:
http://foo.bar/document/presentation/presentation.jsf

so, is there a way to force the prettified url even inside the rendered  
page?
maybe some string replacement in a phaselistener?

i hop, i could make my problem clear.

thanks

Re: pretty url -- wrong name in js

Posted by arne anka <do...@ginguppin.de>.
to make it short and sweet: isn't there a working example of a custom  
viewhandler where i can look into the code?
my english isn't that good and i am not sure about the terminologies -- so  
i am afraid it will become a long and straining discussion ...

the long part:
i wrote a servlet that catches all urls of the type  
http://host/app/document/* (configured in web.xml)

public void doGet(HttpServletRequest req, HttpServletResponse res) throws  
IOException, ServletException
{
	LifecycleFactory lFactory = (LifecycleFactory)  
FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
	Lifecycle lifecycle =  
lFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
	FacesContextFactory fcFactory = (FacesContextFactory)  
FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
	FacesContext facesContext =  
fcFactory.getFacesContext(getServletContext(), req, res, lifecycle);
	Application application = facesContext.getApplication();
	if(viewHandler==null) viewHandler = new  
MyViewHandler(application.getViewHandler());
	viewHandler.setActionURL(req.getRequestURI());
	application.setViewHandler(viewHandler);

	UIViewRoot view = viewHandler.createView(facesContext,  
"/presentation/document.jsf");
	facesContext.setViewRoot(view);
	TeuchosSearchBean myBean = (TeuchosSearchBean)  
application.getVariableResolver().resolveVariable(facesContext,  
"teuchosSearchBean");
	String id=req.getRequestURI();
	myBean.setObjectID(id.substring(id.indexOf("documents/")+10));

	try
	{
	     
req.getRequestDispatcher(facesContext.getViewRoot().getViewId()).forward(req,  
res);
	}
	catch (Exception e)
	{
	    LOGGER.error(e.getMessage(), e);
	    return;
	}
}

MyViewHandler is:
class MyViewHandler extends ViewHandlerImpl
{
     private final ViewHandler myViewHandler;
     private String myActionUrl;

     public MyViewHandler(ViewHandler vh)
     {
	super(vh);
	myViewHandler=vh;
     }
     @Override
     public String getActionURL(FacesContext context, String viewId)
     {
	if(myActionUrl!=null && myActionUrl.split("/").length>4)
	    return myActionUrl.replace("/documents", "");
	return myActionUrl;
     }

     public void setActionURL(String au)
     {
	myActionUrl=au;
     }
}


now every attempt to navigate from this page (by jscookmenu or  
t:commandButton) ends  with a blank page and no error.
it's most probably something very stupid -- but usually the more stupid  
the longer it takes to find out ....

Re: pretty url -- wrong name in js

Posted by Andrew Robinson <an...@gmail.com>.
How do they not work? Will need more information than that.

On Wed, May 7, 2008 at 9:35 AM, arne anka <do...@ginguppin.de> wrote:
>
> > Have a look at getActionURL. You can create your own
> > ViewHandlerWrapper and create your own action URLs for the passed in
> > view IDs:
> >
>
>  that kind of works -- but now all other links do not work, most notably
> jscookmenu is dead.
>

Re: pretty url -- wrong name in js

Posted by arne anka <do...@ginguppin.de>.
> Have a look at getActionURL. You can create your own
> ViewHandlerWrapper and create your own action URLs for the passed in
> view IDs:

that kind of works -- but now all other links do not work, most notably  
jscookmenu is dead.

Re: pretty url -- wrong name in js

Posted by Andrew Robinson <an...@gmail.com>.
Have a look at getActionURL. You can create your own
ViewHandlerWrapper and create your own action URLs for the passed in
view IDs:

http://tinyurl.com/3jnv4w

-Andrew

On Fri, May 2, 2008 at 4:15 AM, arne anka <do...@ginguppin.de> wrote:
> hi,
>  after some research regarding pretty urls i found both
>  http://blogs.steeplesoft.com/jsf-phaselisteners-and-get-requests/
>  and
>  http://wiki.apache.org/myfaces/InvokingJsfPagesWithStandardUrls
>
>  i tried the second approach first (servlet) and instead of invoking the
> NavigationHandler i did a forward:
>
> req.getRequestDispatcher(facesContext.getViewRoot().getViewId()).forward(req,
> res);
>
>  the page is rendered wonderfully, the url is intact -- all seems nice,
> until ...
>  i got an <h:collapsiblePanel> on my page -- and clicking the panel to
> expand it changes the url.
>  instead of my nice url now there's the url of the viewId i render inside my
> servlet.
>
>  with the phaselistener it's mostly the same -- only the url is now the
> pseudo-directory and the viewId appended which results in an error ...
>
>  pretty url:
>  http://foo.bar/document/doc001
>
>  wrong url after servlet:
>  http://foo.bar/presentation/presentation.jsf
>
>  wrong url after phaselistener:
>  http://foo.bar/document/presentation/presentation.jsf
>
>  so, is there a way to force the prettified url even inside the rendered
> page?
>  maybe some string replacement in a phaselistener?
>
>  i hop, i could make my problem clear.
>
>  thanks
>