As just pointed out to me by Mike K. my solution goes against the jsf
1.1 spec. All of the form data will not be maintained as it would by
using javascript+commandLink.
On 7/24/06, Ryan Wynn <[EMAIL PROTECTED]> wrote:
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.
> > > >
> > >
> >
>