For the impatient,

(1) create the following class

public class HtmlLinkRendererFix extends HtmlLinkRenderer {

        protected FormInfo findNestingForm(UIComponent uiComponent,
                        FacesContext facesContext) {
                return _ComponentUtils.findNestingForm(uiComponent, 
facesContext);
        }

        protected void renderNonJavaScriptAnchorStart(FacesContext facesContext,
                        ResponseWriter writer, UIComponent component, String 
clientId)
                        throws IOException {
                ViewHandler viewHandler = facesContext.getApplication()
                                .getViewHandler();
                String viewId = facesContext.getViewRoot().getViewId();
                String path = viewHandler.getActionURL(facesContext, viewId);

                StringBuffer hrefBuf = new StringBuffer(path);

                //add clientId parameter for decode

                if (path.indexOf('?') == -1) {
                        hrefBuf.append('?');
                } else {
                        hrefBuf.append('&');
                }
                String hiddenFieldName = HtmlRendererUtils
                                
.getHiddenCommandLinkFieldName(findNestingForm(component,
                                                facesContext).getFormName());
                hrefBuf.append(hiddenFieldName);
                hrefBuf.append('=');
                hrefBuf.append(clientId);

                hrefBuf.append('&');
                hrefBuf.append(findNestingForm(component, 
facesContext).getFormName()
                                + "_SUBMIT");
                hrefBuf.append('=');
                hrefBuf.append(1);

                if (getChildCount(component) > 0) {
                        addChildParametersToHref(component, hrefBuf, false, 
//not the first
                                        // url parameter
                                        writer.getCharacterEncoding());
                }

                StateManager stateManager = facesContext.getApplication()
                                .getStateManager();
                hrefBuf.append("&");
                if (stateManager.isSavingStateInClient(facesContext)) {
                        hrefBuf.append(URL_STATE_MARKER);
                } else {
                        hrefBuf.append(RendererUtils.SEQUENCE_PARAM);
                        hrefBuf.append('=');
                        
hrefBuf.append(RendererUtils.getViewSequence(facesContext));
                }
                String href = facesContext.getExternalContext().encodeActionURL(
                                hrefBuf.toString());
                writer.startElement(HTML.ANCHOR_ELEM, component);
                writer.writeURIAttribute(HTML.HREF_ATTR, facesContext
                                .getExternalContext().encodeActionURL(href), 
null);
        }

        private void addChildParametersToHref(UIComponent linkComponent,
                        StringBuffer hrefBuf, boolean firstParameter, String 
charEncoding)
                        throws IOException {
                for (Iterator it = getChildren(linkComponent).iterator(); 
it.hasNext();) {
                        UIComponent child = (UIComponent) it.next();
                        if (child instanceof UIParameter) {
                                String name = ((UIParameter) child).getName();
                                Object value = ((UIParameter) child).getValue();

                                addParameterToHref(name, value, hrefBuf, 
firstParameter,
                                                charEncoding);
                                firstParameter = false;
                        }
                }
        }

        private static void addParameterToHref(String name, Object value,
                        StringBuffer hrefBuf, boolean firstParameter, String 
charEncoding)
                        throws UnsupportedEncodingException {
                if (name == null) {
                        throw new IllegalArgumentException(
                                        "Unnamed parameter value not allowed within 
command link.");
                }

                hrefBuf.append(firstParameter ? '?' : '&');
                hrefBuf.append(URLEncoder.encode(name, charEncoding));
                hrefBuf.append('=');
                if (value != null) {
                        //UIParameter is no ConvertibleValueHolder, so no 
conversion
                        // possible
                        hrefBuf.append(URLEncoder.encode(value.toString(), 
charEncoding));
                }
        }

}

(2) add the following to your faces-config.xml

        <render-kit>
                <render-kit-id>HTML_BASIC</render-kit-id>
                <renderer>
                        <component-family>javax.faces.Output</component-family>
                        <renderer-type>javax.faces.Link</renderer-type>
                        <renderer-class>HtmlLinkRendererFix</renderer-class>
                </renderer>
                <renderer>
                        <component-family>javax.faces.Command</component-family>
                        <renderer-type>javax.faces.Link</renderer-type>
                        <renderer-class>HtmlLinkRendererFix</renderer-class>
                </renderer>
        </render-kit>


Works without javascript enabled.


On 7/24/06, Ryan Wynn <[EMAIL PROTECTED]> wrote:
On 7/24/06, Ryan Wynn <[EMAIL PROTECTED]> wrote:
> I think I fixed the problem where the commandLink doesn't work with
> javascript turned off.  It is working for me now.
>
> See
>
> https://issues.apache.org/jira/browse/MYFACES-1370

Basically the way it was written it was almost working.  The problem
was that in order for the the link renderers decode method to be
called 1 additional parameter had to be supplied.

namely,
<parent_form_client_id>_SUBMIT=1

This seems to work since links need to be nested within a form to work
anyway.  It does not submit the form obviously (otherwise javascript
would be needed), this is a normal GET request with the parameters
encoded in the url.






>
>
>
> On 7/24/06, Jesse Alexander (KSFD 121)
> <[EMAIL PROTECTED]> wrote:
> > Whether a single component gracefully degrades is up to the
> > component-writer.
> > THe JSF does (degradation is missing commnd-link...)
> >
> > But not all component-writers like to put the additional grease on their
> >
> > components to make them degrade gracefully. Some are just to
> > JS-fanatics. ;-)
> >
> > Therefor one must test and then file JS-degradation-bug-requests for
> > each
> > component. I (for myself) would already be happy to read in each
> > component-
> > description the JS-requirements and degradation grade.
> >
> > regards
> > Alexander
> >
> >
> >
> > > -----Original Message-----
> > > From: Guy Coleman [mailto:[EMAIL PROTECTED]
> > > Sent: Monday, July 24, 2006 12:15 PM
> > > To: MyFaces Discussion
> > > Subject: Re: ALLOW_JAVASCRIPT
> > >
> > > On 20/07/2006 22:02, Mike Kienenberger wrote:
> > > > On 7/20/06, ragsta <[EMAIL PROTECTED]> wrote:
> > > >> a simple question: does the ALLOW_JAVASCRIPT parameter work?
> > > >>
> > > >> Is very important for me that my site work even if the
> > > javascript is
> > > >> disabled on the user browser but turnig off the param
> > > outputlink doesn't
> > > >> work more...even if the primary goal of turning off the
> > > param is to
> > > >> change
> > > >> the behaviour of this command....
> > > >>
> > > >> if this option is bugged I think I have to all back to a different
> > > >> framework...
> > > >
> > > > You will be very limited in what you can do if you disabled
> > > javascript.
> > > > For instance, h:commandLink cannot work without javascript.
> > > >
> > > > Most of the interesting components also require javascript, as do a
> > > > lot of the common "tricks" for accomplishing tasks.
> > > >
> > > > You're probably better off not using JSF if you're not able
> > > to allow
> > > > javascript.
> > > >
> > >
> > >
> > > We have had some success with using styled h:commandButtons
> > > instead of
> > > commandLinks to avoid Javascript.
> > >
> > > It's true that some advanced components cannot be used without
> > > Javascript, but we have taken the approach that a site that degrades
> > > gracefully is acceptable. For example, the inputDate popup cannot be
> > > used without Javascript but the user can still enter a date
> > > manually in
> > > the input box.
> > >
> > > -Guy.
> > >
> >
>

Reply via email to