| | |
| | | import org.apache.wicket.markup.ComponentTag; |
| | | import org.apache.wicket.markup.MarkupStream; |
| | | import org.apache.wicket.markup.html.form.StatelessForm; |
| | | import org.apache.wicket.protocol.http.RequestUtils; |
| | | import org.apache.wicket.protocol.http.WicketURLDecoder; |
| | | import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy; |
| | | import org.apache.wicket.util.string.AppendingStringBuffer; |
| | |
| | | * This class is used to create a stateless form that can POST or GET to a |
| | | * bookmarkable page regardless of the pagemap and even after session expiration |
| | | * or a server restart. |
| | | * |
| | | * |
| | | * The trick is to embed "wicket:bookmarkablePage" as a hidden field of the form. |
| | | * Wicket already has logic to extract this parameter when it is trying |
| | | * to determine which page should receive the request. |
| | | * |
| | | * |
| | | * The parameters of the containing page can optionally be included as hidden |
| | | * fields in this form. Note that if a page parameter's name collides with any |
| | | * fields in this form. Note that if a page parameter's name collides with any |
| | | * child's wicket:id in this form then the page parameter is excluded. |
| | | * |
| | | * |
| | | * @author James Moger |
| | | * |
| | | */ |
| | | public class SessionlessForm<T> extends StatelessForm<T> { |
| | | |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | private static final String HIDDEN_DIV_START = "<div style=\"width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden\">"; |
| | | |
| | | private final Class<? extends BasePage> pageClass; |
| | | |
| | | private final PageParameters pageParameters; |
| | | |
| | | |
| | | protected final Class<? extends BasePage> pageClass; |
| | | |
| | | protected final PageParameters pageParameters; |
| | | |
| | | private final Logger log = LoggerFactory.getLogger(SessionlessForm.class); |
| | | |
| | | /** |
| | | * Sessionless forms must have a bookmarkable page class. A bookmarkable |
| | | * page is defined as a page that has only a default and/or a PageParameter |
| | | * constructor. |
| | | * |
| | | * |
| | | * @param id |
| | | * @param bookmarkablePageClass |
| | | */ |
| | |
| | | * Sessionless forms must have a bookmarkable page class. A bookmarkable |
| | | * page is defined as a page that has only a default and/or a PageParameter |
| | | * constructor. |
| | | * |
| | | * |
| | | * @param id |
| | | * @param bookmarkablePageClass |
| | | * @param pageParameters |
| | |
| | | this.pageParameters = pageParameters; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Append an additional hidden input tag that forces Wicket to correctly |
| | | * determine the destination page class even after a session expiration or |
| | | * a server restart. |
| | | * |
| | | * |
| | | * @param markupStream |
| | | * The markup stream |
| | | * @param openTag |
| | |
| | | getResponse().write(buffer); |
| | | super.onComponentTagBody(markupStream, openTag); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Take URL-encoded query string value, unencode it and return HTML-escaped version |
| | | * |
| | | * |
| | | * @param s |
| | | * value to reencode |
| | | * @return reencoded value |
| | |
| | | String un = WicketURLDecoder.QUERY_INSTANCE.decode(s); |
| | | return Strings.escapeMarkup(un).toString(); |
| | | } |
| | | |
| | | protected String getAbsoluteUrl() { |
| | | return getAbsoluteUrl(pageClass, pageParameters); |
| | | } |
| | | |
| | | protected String getAbsoluteUrl(Class<? extends BasePage> pageClass, PageParameters pageParameters) { |
| | | String relativeUrl = urlFor(pageClass, pageParameters).toString(); |
| | | String absoluteUrl = RequestUtils.toAbsolutePath(relativeUrl); |
| | | return absoluteUrl; |
| | | } |
| | | } |